gpt4 book ai didi

c++ - 覆盖对话框关闭时的 QWidget 事件?

转载 作者:行者123 更新时间:2023-11-28 02:03:40 24 4
gpt4 key购买 nike

我在屏幕上有一个可见的复杂小部件。通过按下按钮,会出现一个对话框,但部分原始小部件仍然可见。关闭对话框时,我想刷新我的特定小部件的一些数据......但是这个小部件对那个对话框一无所知。我可以为此检查任何事件吗?或者通过任何其他方式了解对话框何时关闭?

我先用

virtual void QWidget::showEvent( QShowEvent* event );

但是当小部件的部分已经可见时它不会被调用。

编辑对不起,我不够精确。当我写复杂的时候,我的意思是我有一个主窗口,它有一个子窗口小部件,它也有子窗口小部件等等(关于文件级别)。该最低级别的子小部件启动对话框的打开。另一个需要此对话框关闭事件的小部件也是嵌入式小部件,但位于应用程序的其他位置。当我编写通过多个类发送信号时,我的意思是这个。在这种情况下,如果想通知我的最终小部件,我必须将关闭信号从我的源小部件连接到几个甚至对该信号不感兴趣的中间小部件。由于上述结构,我也不想(也不能)在主窗口中连接这些信号/插槽。这里面有什么建议吗?

最佳答案

send the signal through many objects just for this purpose

没有“通过”对象发送信号这样的事情,除非您坚持手动将信号穿过一堆对象。所以这没有多大意义,除非你解释为什么你想通过许多对象“线程”信号(“线程”就像在一根绳子中穿过一根针,而不是在一个处理线程中)。

信号槽连接有两个端点。您只需要:

  1. 对话中的信号。
  2. super 复杂部件上的插槽。
  3. 在他们俩之外建立了一个连接。为了让生活变得简单,小部件和对话框都可以在 main() 中实例化,并且在任何东西出现在屏幕上之前就建立连接。

如果您有一个正确设计的对话框,您正在寻找的对话信号就是QDialog::finished。否则,使用 EventSignaler某种将 QEvent::close 转换为信号的方法。

supercomplex widget 中的插槽应该是例如:

Q_SLOT void refreshSomething();

它的签名/名称不应指代某些对话框已关闭的事实:这会将 API 过度耦合到某些对话框的外部细节。该插槽应该让对话框更新/刷新您需要的内容。调用它的原因与小部件无关。

在小部件内部,插槽的实现最有可能简单地在一个或多个子小部件上调用 update(),可能还有一个相关的区域——如果您愿意,您可以将该区域作为一个可选的插槽参数。

参见 this question关于如何在包含许多对象的复杂复合类中转发信号或槽。它应该很简单;如果不是,则您必须编辑问题以说明为什么它对您来说很复杂。

在最简单的情况下,使用最解耦的代码——对话框对小部件一无所知,反之亦然——你应该这样,你可以:

class Dialog : public QDialog { ... };
class Widget : public QMainWindow {
Q_OBJECT
Q_SIGNAL void showDialog();
Q_SLOT void refreshSomething();
...
};

int main(int argc, char ** argv) {
QApplication app{argc, argv};
...
Widget widget;
Dialog dialog;
QObject::connect(&widget, &Widget::showDialog, &dialog, &QWidget::show);
QObject::connect(&dialog, &QDialog::finished, &widget, &Widget::refreshSomething);
widget.show();
return app.exec();
}

关于c++ - 覆盖对话框关闭时的 QWidget 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38401354/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com