我的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 10Mac 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/

10-09 06:23