重叠对话框关闭时的QWidget事件?

时间:2016-07-15 16:49:19

标签: c++ qt

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

首先我用了

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

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

修改 我很抱歉,但我不够精确。当我写复杂时,我的意思是我有一个主窗口,它有一个子窗口小部件,它也有子窗口小部件等等(对于文件级别)。最低级别的子窗口小部件启动对话框的打开。需要此对话框的关闭事件的另一个窗口小部件也是嵌入式窗口小部件,但在应用程序的其他位置。当我写sending the signal through many classes时,我的意思是这个。在这种情况下,如果想要通知我的最终小部件,我必须将来自我的源小部件的结束信号连接到几个甚至对该信号不感兴趣的中间小部件。由于上面提到的结构,我也不想(并且不能)在主窗口中连接这些信号/插槽。这有什么建议吗?

1 个答案:

答案 0 :(得分:2)

  

仅为此目的通过许多对象发送信号

除非你坚持手动将它穿过一堆对象,否则没有“通过”对象发送信号的事情。所以这没有多大意义,除非你解释为什么你想要通过许多对象“线程化”信号(“穿线”,如通过针的字符串,而不是在处理线程中)。

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

  1. 对话框中的信号。
  2. supercomplex小部件的一个插槽。
  3. 在两者之间设置的连接。为了简化生活,可以在main()中实例化小部件和对话框,并在屏幕上出现任何内容之前建立连接。
  4. 如果您有一个设计合理的对话框,那么您正在寻找的对话框信号只是QDialog::finished。否则,请使用某种EventSignalerQEvent::close转换为信号。

    supercomplex小部件中的插槽应该是例如:

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