c++ - QDialog创建后闪退

标签 c++ qt

我的 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对象被删除了,但是我并没有删除指针,所以感觉很迷惑.

  1. 我用谷歌搜索并尝试将 setModal 属性设置为 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();
}

如果该对话框仍然可见,那么您就知道您给了它一个错误的、短命的父级。解决办法是找另一位 parent 。为避免泄漏对话框,您可以为对话框提供 Qt::WA_DeleteOnClose 属性。

关于c++ - QDialog创建后闪退,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31920395/

相关文章:

c++ - 如何在 C++ 中将单个字节写入文件

c++ - 自动填充以更正 Qt 表中的大小

c++ - 信号/槽多线程 Qt

C++、Qt、防止窗口调整大小超过实际布局高度

c++ - Qt Version 5.3 将数据从一个论坛发送到另一个

c++ - 通过基类特化类模板

c++ - 积分推广与算子+=

c++ - += 在没有 boost 的 vector 上

qt - QDir::count() 的实现是什么

c++ - QMetaObject::invokeMethod 执行被推迟