例如:我有两个窗口(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会自动更新。