QWidget失去其父组件
QWidget loses its parent
在我的应用程序中,我有一个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()
调用没有被调用,因为"parent"是空的。
知道这是怎么发生的吗?是否有一种常规的方式,QWidget
的父母可以消失?
一般来说,使用QDialog::exec
重新进入事件循环会造成麻烦,因为突然之间主线程中运行的所有代码都必须是可重入的。很可能你正面临着这样的后果。不要重新进入事件循环,否则你会没事的,否则问题会再次出现。
如果您需要对被接受或拒绝的对话框作出反应,请将代码连接到相关插槽。例如:
void do() {
MyDialog dialog{this};
auto rc = dialog.exec();
qDebug() << "dialog returned" << rc;
}
:
class Foo : public QWidget {
MyDialog dialog{this};
...
Foo() {
connect(&dialog, &QDialog::done, this, &Foo::dialogDone);
}
void do() {
dialog.show();
}
void dialogDone(int rc) {
qDebug() << "dialog returned" << rc;
}
};
或者,如果你想惰性初始化对话框:
class Foo : public QWidget {
MyDialog * m_dialog = nullptr;
MyDialog * dialog() {
if (! m_dialog) {
m_dialog = new MyDialog{this};
connect(m_dialog, &QDialog::done, this, &Foo::dialogDone);
}
return m_dialog;
}
...
void do() {
dialog()->show();
}
void dialogDone(int rc) {
qDebug() << "dialog returned" << rc;
}
};
子部件试图干涉父部件是一种可怕的反模式。小部件有父组件的知识不应该泄漏到小部件中,它应该本地化到父组件中。因此,子小部件应该发出一个信号,表明数据已被接受。当您创建对话框时,将此信号连接到对话框的accept()
或close()
插槽:
class MyWidget : public QWidget {
Q_OBJECT
public:
Q_SIGNAL void isDone();
...
};
class MyDialog : public QDialog {
QGridLayout layout{this};
MyWidget widget;
public:
MyDialog() {
layout.addWidget(&widget, 0, 0);
connect(&widget, &MyWidget::isDone, this, &QDialog::accepted);
}
};
相关文章:
- 如何将 txt 文件中的行分隔为组件C++
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 到连接组件算法的问题(递归)
- 两个 COM 组件中 ENUM 的重复条目
- 为什么 gcc 会产生这种奇怪的组件与叮当声?
- 使用 bfs 解决连接组件问题时得到错误的答案
- 如何在ECS框架中更新组件数据和通知系统
- 如何从ECS中的模板方法获取组件?
- 使用蓝牙组件将数据从Android手机传输到串行设备时出现问题
- 主.cpp:18:20:错误:从"int*"转换为"int"会失去精度 [-fa
- 组件上的虚幻引擎可蓝图UFUNCTION会导致构建错误
- 启动类函数作为失去引用的线程
- 在C++中访问蓝图类组件的正确方法是什么?
- 有关纯 ECS(实体组件系统)和更新系统的问题
- 提高基于组件的游戏引擎的效率
- 从组件的 std::type_index 获取派生最多的类型
- 我们可以将阈值应用于色彩空间模型的单个组件(如 RGB 和 LAB)吗?
- 如何通过 UActor组件获取演员列表?
- 在Visual Studio 2017中使用c ++组件构建python解决方案时出现问题
- QWidget失去其父组件