创建

时间:2015-08-10 13:06:14

标签: c++ qt

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

  1. 我用Google搜索并尝试将模式属性设置为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循环代码,它会再次闪回。

  4. 所以,我想知道我的代码发生了什么错误,以及我如何尝试处理它。

    我的编码环境是:  Windows 10Mac OS X 10.10.4 Yosemite,Qt的版本为Qt5.5.0,在我的Windows上,Qt以mingw运行。

2 个答案:

答案 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(),因此您的对话框可以保持可见。不是你想要的吗?