Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 覆盖对话框关闭时的QWidget事件?_C++_Qt - Fatal编程技术网

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

C++ 覆盖对话框关闭时的QWidget事件?,c++,qt,C++,Qt,我有一个复杂的小部件在屏幕上是可见的。通过按下按钮,会出现一个对话框,但原始小部件的部分仍然可见。关闭对话框时,我想刷新我的特定小部件的一些数据但此小部件不知道有关该对话框的任何信息。是否有任何活动可供我检查?或者以其他方式了解对话框何时关闭 首先我用 virtual void QWidget::showEvent( QShowEvent* event ); 但是当小部件的部分已经可见时,不会调用它 编辑 对不起,我说得不够准确。当我编写complex时,我的意思是我有一个主窗口,它有一个子窗

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

首先我用

virtual void QWidget::showEvent( QShowEvent* event );
但是当小部件的部分已经可见时,不会调用它

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

为此,通过许多物体发送信号

没有“通过”对象发送信号这样的事情,除非您坚持手动将其穿过一堆对象。因此,除非你解释为什么你想通过许多对象“穿线”信号(“穿线”就像穿线一样穿过针头,而不是像处理线一样)

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

  • 对话中的信号
  • 超级复杂小部件上的插槽
  • 在两者之外建立的连接。为了简化操作,小部件和对话框都可以在
    main()
    中实例化,并在屏幕上出现任何内容之前建立连接
  • 如果您有一个正确设计的对话框,那么您要查找的对话框信号就是
    QDialog::finished
    。否则,请使用某种类型的将
    QEvent::close
    转换为信号

    超级复杂小部件中的插槽应为,例如:

    Q_SLOT void refreshSomething();
    
    它的签名/名称不应该指某个对话框已关闭的事实:这将API过度耦合到某个对话框的外部细节。插槽应该可以获得对话框来更新/刷新您需要的内容。调用它的原因与小部件无关

    在小部件内部,插槽的实现很可能只需在一个或多个子部件上调用
    update()
    ,可能使用相关的区域-如果愿意,可以将该区域作为可选的插槽参数

    请参阅关于如何转发包含许多对象的复杂复合类中的信号或插槽。这应该很简单;如果不是这样,你就必须编辑这个问题来说明为什么它对你来说很复杂

    在最简单的情况下,使用最解耦的代码(对话框对小部件一无所知,反之亦然),您可以:

    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();
    }
    
    为此,通过许多物体发送信号

    没有“通过”对象发送信号这样的事情,除非您坚持手动将其穿过一堆对象。因此,除非你解释为什么你想通过许多对象“穿线”信号(“穿线”就像穿线一样穿过针头,而不是像处理线一样)

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

  • 对话中的信号
  • 超级复杂小部件上的插槽
  • 在两者之外建立的连接。为了简化操作,小部件和对话框都可以在
    main()
    中实例化,并在屏幕上出现任何内容之前建立连接
  • 如果您有一个正确设计的对话框,那么您要查找的对话框信号就是
    QDialog::finished
    。否则,请使用某种类型的将
    QEvent::close
    转换为信号

    超级复杂小部件中的插槽应为,例如:

    Q_SLOT void refreshSomething();
    
    它的签名/名称不应该指某个对话框已关闭的事实:这将API过度耦合到某个对话框的外部细节。插槽应该可以获得对话框来更新/刷新您需要的内容。调用它的原因与小部件无关

    在小部件内部,插槽的实现很可能只需在一个或多个子部件上调用
    update()
    ,可能使用相关的区域-如果愿意,可以将该区域作为可选的插槽参数

    请参阅关于如何转发包含许多对象的复杂复合类中的信号或插槽。这应该很简单;如果不是这样,你就必须编辑这个问题来说明为什么它对你来说很复杂

    在最简单的情况下,使用最解耦的代码(对话框对小部件一无所知,反之亦然),您可以:

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

    我认为最好让小部件知道该对话框,可能有一个插槽连接到对话框的
    finished
    signal@Mike这是不可能的。这是一个非常复杂的表单,有很多小部件。其中一个创建了对话框。我不认为仅仅为了这个目的通过许多对象发送信号是一个好主意。最低级别的子小部件可以有一个信号,您可以连接到顶级小部件中的信号(是的,您可以这样做)。顶部和子级之间的层数并不重要。您只需要两个信号和一个connect语句。“我[…]无法连接主窗口中的这些信号/插槽,因为”但是你可以!见例。我不知道如何向你证明这是微不足道的