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

时间:2013-08-15 20:10:57

标签: c++ qt qt5

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

我能想到的所有代码:

a.cpp

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

b.cpp

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

至于头文件,我不知道我会说什么。

2 个答案:

答案 0 :(得分:1)

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声明了一个槽函数,当需要更新并且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()信号以获取更新,否则处理close事件: -

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

答案 1 :(得分:0)

你问的很模糊。您可以使用基于QDialog的小部件。打开模态。然后,您可以在关闭时查询其状态。无论你关闭窗口,还是按下“保存”。

您还可以使用A中的插槽连接保存按钮的clicked()信号。但是,当窗口B关闭时,您必须编写额外的代码。覆盖窗口B的closeEvent。在信号上你必须更新你的QComboBox。

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