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

Posted

技术标签:

【中文标题】覆盖对话框关闭时的QWidget事件?【英文标题】:QWidget event when overlaid dialog closed? 【发布时间】:2016-07-15 16:49:19 【问题描述】:

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

我第一次使用

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

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

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

【问题讨论】:

我认为最好让小部件知道该对话框,也许有一个插槽连接到对话框的finished 信号 @Mike 这是不可能的。这是一个非常复杂的表单,有很多小部件。其中之一创建了对话框。我认为仅仅为此目的通过许多对象发送信号不是一个好主意。 最低级别的子小部件可以有一个信号,您可以连接到***小部件中的信号(是的,您可以这样做)。顶部和子级之间的层数无关紧要。您只需要两个信号和一个连接语句。 “我 [...] 无法在主窗口中连接这些信号/插槽,因为”但您可以!参见例如this question。我不知道如何向您证明它是微不足道的 - 请显示一些独立的代码;在没有.ui 文件的情况下手动生成子代以保持简单。 【参考方案1】:

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

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

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

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

如果您的对话框设计得当,您正在寻找的对话框信号就是QDialog::finished。否则,使用某种EventSignalerQEvent::close 转换为信号。

超复杂小部件中的插槽应该是例如:

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

【讨论】:

以上是关于覆盖对话框关闭时的QWidget事件?的主要内容,如果未能解决你的问题,请参考以下文章

一种在 Mac 上强制关闭模态 QFileDialog 的方法

关闭并退出时崩溃

Javascript关闭警报框

将触摸事件委托给另一个视图

在对话框外发生单击时如何触发事件

关闭 MFC 对话框时的多线程对象破坏