QDialog创建后闪回
QDialog flash back after create
我的QMainWindow
上有一个QListWidget
,我将itemDoubleClicked(QListWidgetItem*)
信号连接到一个插槽,如下代码所示:
connect(listWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(popUpMyDialog(QListWidgetItem*)));
我的popUpMyDialog(QListWidgetItem*)
函数类似于:
QMyDialog *myDialog = new QMyDialog(this);
myDialog->show();
QMyDialog
是我从QDialog
中固有的一个类,除了ui->setupUi(this);
之外没有进行任何操作。
但当我尝试双击QListWidget
项目时,myDialog
闪烁并很快消失。
所以我试着写了一些代码来判断myDialog
是否被这样删除:
QMyDialog *myDialog = new QMyDialog(this);
connect(myDialog, SIGNAL(destroyed(QObject*)), this, SLOT(handleQMyDialogClose(QObject*)));
myDialog->show();
而时隙函数handleQMyDialogClose(QObject*)
只做:
qDebug() << "myDialog is closed";
当我双击QListWidget项目的项目时,控制台会打印myDialog is closed
,这意味着myDialog对象被删除了,但我没有删除指针,所以我感到困惑。
我在谷歌上搜索了一下,并试图将Modal属性设置为
myDialog
,但没有效果。我试着把同样的代码复制到我的Mac上,奇怪的是它运行得很完美。
我试着在我的
popUpMyDialog(QListWidgetItem*)
中添加一个for循环,就像这样:QMyDialog *myDialog = new QMyDialog(this); connect(myDialog, SIGNAL(destroyed(QObject*)), this, SLOT(handleQMyDialogClose(QObject*))); myDialog->show(); for(int i = 0; i < 100; ++i) {qDebug() << i;}
以阻塞线程,并发现
myDialog
窗口工作得很好,但如果我注释for循环代码,它会再次闪烁。
所以,我想知道我的代码发生了什么错误,以及我如何处理它
我的编码环境是:Windows 10
和Mac OS X 10.10.4 Yosemite
,Qt的版本是Qt5.5.0
,在我的Windows上,Qt与mingw
一起运行。
因此,您有以下方法:
void Foo::popUpMyDialog(QListWidgetItem*) {
QMyDialog *myDialog = new QMyDialog(this);
myDialog->show();
}
对话框过早被破坏的唯一原因是,如果对话框的子级Foo
的实例被破坏。
要解决此问题,首先尝试创建一个无父对话框:
void Foo::popUpMyDialog(QListWidgetItem*) {
QMyDialog *myDialog = new QMyDialog;
myDialog->show();
}
如果这个对话框仍然可见,那么你就知道你给了它一个错误的、短暂的父对象。解决办法是找到另一个家长。为了避免对话框泄漏,可以为对话框指定Qt::WA_DeleteOnClose
属性。
QDialog有一个exec((函数,它可以"阻止"执行(就像你对循环所做的那样(,用来代替show()
,这样你的对话框就可以保持可见。这不是你想要的吗?
- 如何创建 IOUSBHostPipe::CompleteAsyncIO 回调?
- 如何为Python Swigged C++对象创建和分配回调函数
- 如何从 doxygen 创建的 html 更改回代码
- 如何创建一个程序来标识最长的子字符串回文,而不考虑字母大小写
- 无法回显到 MKNOD 创建的设备文件或从中回显
- C :创建正确类型的回调函数
- 用STD ::函数作为集体成员创建回调
- 如何使用iOS上的JavaScriptCore创建从JavaScript调用的C 回调
- 尝试创建回调时出错
- 如何从C++创建c_void_p PyObject,将其传递给Python并将其检索回C++
- 在MSVC Windows表单中使用DLL中创建回调
- C++矢量推回方法和临时对象创建
- 创建和回推函数向量
- 创建具有自动存储的自定义对象并推送回 std::vector 时访问冲突
- hiredis Redis 库是否为异步回调创建了自己的线程
- 删除 new 在回调函数中创建的指针
- C++创建文件(紧凑型闪存卡写入器)
- 使用数组和无指针创建回文字符串检查器C++
- 需要帮助创建数组并在另一个函数中编辑它,并将其发送回初始函数
- QDialog创建后闪回