Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QDialog在创建后回闪_C++_Qt - Fatal编程技术网

C++ QDialog在创建后回闪

C++ QDialog在创建后回闪,c++,qt,C++,Qt,在我的QMainWindow上有一个QListWidget,我将itemDoubleClicked(QListWidgetItem*)信号连接到一个插槽,如下代码所示: connect(listWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(popUpMyDialog(QListWidgetItem*))); MypopUpMyDialog(QListWidgetItem*)函数类似于: QMyDialog *my

在我的
QMainWindow
上有一个
QListWidget
,我将
itemDoubleClicked(QListWidgetItem*)
信号连接到一个插槽,如下代码所示:

connect(listWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(popUpMyDialog(QListWidgetItem*)));
My
popUpMyDialog(QListWidgetItem*)
函数类似于:

QMyDialog *myDialog = new QMyDialog(this);
myDialog->show();
QMyDialog
是我从
QDialog
中固有的一个类,除了
ui->setupUi(这个)之外,没有任何操作已完成

但是,当我试图双击
QListWidget
的项目时,
myDialog
闪烁并很快消失

因此,我试着编写一些代码来判断
myDialog
是否像这样被删除:

QMyDialog *myDialog = new QMyDialog(this);
connect(myDialog, SIGNAL(destroyed(QObject*)), this, SLOT(handleQMyDialogClose(QObject*)));
myDialog->show();
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;}
插槽功能
handleQMyDialogClose(QObject*)
只需执行以下操作:

qDebug() << "myDialog is closed";
阻止线程,并发现
myDialog
窗口工作正常,但如果我对for循环代码进行注释,它会再次闪烁

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

我的编码环境是:
Windows 10
Mac OS X 10.10.4 Yosemite
,Qt的版本是
Qt5.5.0
,在我的Windows上,Qt使用
mingw

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

因此,你有以下方法:

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()
是个坏主意。请不要推荐这样的黑客行为。@KubaOber请解释原因?我不明白,exec()是怎么一种黑客行为的?它是一种黑客行为,因为它创建了一个嵌套的事件循环,突然之间,所有你不想看的代码都变成了可重入的。你必须检查它以证明它是安全的!不要介意这种伪同步的心态是一个不好的地方。如果你继续写这样的代码,你就会不断地失败,不断地战斗。现实生活是异步的。你必须迎头赶上。在Qt中使用
exec
有两个正当理由:1。在一个迄今没有的线程中启动事件循环。2.使用
QDrag
,因为它不提供异步api(叹气)。有趣的是,你有提供更多信息的链接吗?我找不到。据我所知,QDialog::exec()处理事件循环的方式与QApplication::exec()处理事件循环的方式相同,因此我看不出问题所在(我也从未听说过)。我试图创建一个无父对话框,但也没有效果。@kemiya您需要复制项目并开始最小化它,这样就只留下足够的代码来显示这个问题,而没有其他问题。你的问题没有足够的细节来解释问题发生的原因。我唯一的想法是你正在阻止事件循环。“显示”对话框后,暂停调试器中的执行,查看主线程中的调用堆栈中是否有
QApplication::exec