我的QListWidget
上有一个QMainWindow
,我将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对象,但我没有删除指针,所以我感到困惑。
我用Google搜索并尝试将模式属性设置为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
运行。
答案 0 :(得分:2)
所以,你有以下方法:
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
属性。
答案 1 :(得分:0)
QDialog具有exec()功能,可阻止&#34;阻止&#34;执行(与循环一样),使用而不是show()
,因此您的对话框可以保持可见。不是你想要的吗?