我的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搜索了它,并尝试将ModModal属性设置为
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
属性。关于c++ - 创建后QDialog闪回,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31920395/