我的QMainWindow上有一个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对象被删除了,但是我没有删除指针,所以我感到很困惑。
myDialog,但它没有效果。popUpMyDialog(QListWidgetItem*)中添加一个for循环:
QMyDialog *myDialog =新QMyDialog( this );连接(myDialog,信号(销毁(QObject*)),此,时隙(handleQMyDialogClose(QObject*));myDialog>show();for(int i= 0;i< 100;++i) {qDebug() << i;}
要阻止线程,并发现myDialog窗口正常工作,但是如果我注释for循环代码,它会再次闪回。因此,我想知道我的代码发生了什么错误,以及如何处理它。
我的编码环境是:Windows 10和Mac OS X 10.10.4 Yosemite,Qt的版本是Qt5.5.0,在我的Windows上,Qt与mingw一起运行。
发布于 2015-08-10 15:18:11
因此,您有以下方法:
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属性。
发布于 2015-08-10 13:27:45
QDialog有一个“阻止”执行的主管()函数(就像您对循环所做的那样),可以使用而不是show(),这样您的对话框就可以保持可见。这不是你要找的吗?
https://stackoverflow.com/questions/31920395
复制相似问题