我的 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的item of item时,控制台打印myDialog is closed
,意思是myDialog对象被删除了,但是我并没有删除指针,所以感觉很迷惑.
我用谷歌搜索并尝试将 setModal 属性设置为
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();
}
如果该对话框仍然可见,那么您就知道您给了它一个错误的、短命的父级。解决办法是找另一位 parent 。为避免泄漏对话框,您可以为对话框提供 Qt::WA_DeleteOnClose
属性。
关于c++ - QDialog创建后闪退,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31920395/