将打开的窗口实例作为参数传递到第二个窗口中

Pass opened window instance as parameter into second window

本文关键字:窗口 第二个 参数传递 实例 将打开      更新时间:2023-10-16

例如:我有两个窗口(A和B)。A的一个实例当前使用组合框打开(加载了数据库中的项目)。我点击"编辑"按钮,窗口B打开,允许我编辑上述数据库的内容。我需要的是当我在窗口B中按"保存"或关闭窗口B时,窗口A自动刷新其内容。

我能想到的所有代码:

a.cpp

b *new_window = new b;
b->show();
b->passwindowfunction(this);

b.cpp

void b::passwindowfunction(sometypeidkwht window)
{
    window->combobox...
}

至于头文件,我不知道该声明什么。

Qt的信号/插槽系统在这里为您提供所需。你可以这样做:-

class QWindowA : public QWindow
{
    Q_OBJECT
    private slots:
        void RefreshContent(); // refreshes content of the window
};

 class QWindowB : public QWindow
{
    Q_OBJECT
    public:
        void Save(); // save content and emit Saved() signal
    signals:
        void Saved();
};

正如您所看到的,WindowA声明了一个slot函数,该函数将在需要更新时被调用,而WindowB有一个信号Saved()。

您需要将Saved的信号连接到插槽RefreshContent():-

// Assuming instances winA and winB have been created
connect(winB, &WindowB::Saved, winA, &WindowA::RefreshContent); // using Qt 5 connect call

在WindowB的Save()函数中,当您保存完内容时,会发出Saved()信号:-

emit Saved();

由于之前的连接调用,WindowA将更新其内容。

至于关闭窗口,如果在WindowB关闭时删除它,只需在WindowB的析构函数中发出Saved()信号,让WindowA得到更新,否则处理关闭事件:-

void WindowB::closeEvent(QCloseEvent *event)
{
    emit Saved();
    QWindow::closeEvent(event);
}

你问的问题非常模糊。您可以使用基于QDialog的小部件。以模态打开它。然后您可以在它关闭时查询它的状态。不管您是关闭了窗口,还是按下了"保存"。

你也可以将保存按钮的clicked()信号与a中的一个插槽连接起来。但当窗口B关闭时,你必须编写额外的代码。覆盖窗口B的closeEvent。在信号上,您必须更新您的QComboBox。

或者,绝对奢华的变体,您为QComboBox使用数据库感知模型,例如基于QSqlQueryModel。然后,当您更改数据库中的数据时,您的QComboBox会自动更新。