QDialog创建后闪回

QDialog flash back after create

本文关键字:闪回 创建 QDialog      更新时间:2023-10-16

我的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对象被删除了,但我没有删除指针,所以我感到困惑。

  1. 我在谷歌上搜索了一下,并试图将Modal属性设置为myDialog,但没有效果。

  2. 我试着把同样的代码复制到我的Mac上,奇怪的是它运行得很完美。

  3. 我试着在我的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属性。

QDialog有一个exec((函数,它可以"阻止"执行(就像你对循环所做的那样(,用来代替show(),这样你的对话框就可以保持可见。这不是你想要的吗?