1

例如:我有两个窗口(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...
}

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

4

2 回答 2

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();

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

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

void WindowB::closeEvent(QCloseEvent *event)
{
    emit Saved();
    QWindow::closeEvent(event);
}
于 2013-08-16T09:50:01.400 回答
0

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

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

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

于 2013-08-15T20:51:55.960 回答