【发布时间】:2016-09-22 10:19:13
【问题描述】:
在我的应用程序中,我有一个QDialog,它本身包含一个复杂的、QWidget 派生的 GUI 元素。 QDialog 是模态的,使用 exec() 打开,嵌入式 GUI 元素处理所有用户交互。
所以只有QWidget这个孩子知道QDialog什么时候可以关闭,这样做是这样的:
QDialog* parent=qobject_cast<QDialog*>(parentWidget());
if (parent) parent->close();
这是必要的,因为QDialog 必须关闭,而不仅仅是QWidget。
现在用户报告了QDialog::exec() 已返回但对话框(或仅 GUI 元素?)仍然可见的情况。从日志文件中我可以看到QDialog::exec() 确实已经返回,并且该调用执行后的代码。
所以我目前的假设是:GUI 元素已经失去了它的父元素,因此上面显示的 close() 调用没有被调用,因为“父元素”为空。
知道这是怎么发生的吗? QWidget 的父级是否可以通过常规方式消失?
【问题讨论】:
-
您是否有充分的理由不将您孩子的信号连接到对话框的
accept()或reject()插槽? -
@thuga 我这里无法重现这个问题,所以这个评论完全没用
-
那么把它写在问题里。
-
@thuga 已经提到了一句“现在用户报告了一个情况......”
-
所以用户报告的任何内容都自动意味着它不能被复制?无论如何,
QDialog::exec仅在对话框隐藏(或关闭)时返回。你能告诉我们对话框是否有可能被创建了两次?
标签: c++ qt qt5 qwidget qdialog