Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.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++ 是否可以在没有父窗口的主窗口中使用WA_DeleteOnClose属性?_C++_Qt_Qt5_Qwidget_Qtwidgets - Fatal编程技术网

C++ 是否可以在没有父窗口的主窗口中使用WA_DeleteOnClose属性?

C++ 是否可以在没有父窗口的主窗口中使用WA_DeleteOnClose属性?,c++,qt,qt5,qwidget,qtwidgets,C++,Qt,Qt5,Qwidget,Qtwidgets,我正在试验WA_DeleteOnClose属性,它正好实现了我需要的功能。比手工操作更简洁。但是,有一个问题:如果我构造了QMainWindow,而WA_DeleteOnClose在没有父对象的情况下应用于该窗口,则关闭时不会将其删除。如果我确实设置了父级(应用程序的主QMainWindow),则所讨论的次QMainWindow将丢失其任务栏按钮,这是不可接受的。如何解决这个难题?任何顶级小部件都应该使用WA_DeleteOnClose。如果没有,那就是一个bug,或者您正在做其他错误的事情,比

我正在试验
WA_DeleteOnClose
属性,它正好实现了我需要的功能。比手工操作更简洁。但是,有一个问题:如果我构造了
QMainWindow
,而
WA_DeleteOnClose
在没有父对象的情况下应用于该窗口,则关闭时不会将其删除。如果我确实设置了父级(应用程序的主
QMainWindow
),则所讨论的次
QMainWindow
将丢失其任务栏按钮,这是不可接受的。如何解决这个难题?

任何顶级小部件都应该使用
WA_DeleteOnClose
。如果没有,那就是一个bug,或者您正在做其他错误的事情,比如运行嵌套事件循环。对于窗口是否被删除,一个简单的测试是:

QObject::connect(widget, &QObject::destroyed, [](QObject * obj){
  qDebug() << obj << "was destroyed";
});

这是在什么平台上?我已经在我的答案中添加了一个测试用例,检查它并用它的输出进行评论。“这可能适用于任何QWidget,而不仅仅是QMainWindow”-对。“一个关于窗口是否被删除的简单测试是…”-在发布之前尝试过。它肯定不会被删除,而且它显然是通过设置父项触发的。我不知道实现的细节,但这是事实。
#include <QLabel>
#include <QPointer>
#include <QApplication>

int main(int argc, char ** argv) {
  QApplication app(argc, argv);
  QPointer<QLabel> label = new QLabel("Hello, world");
  label->setAttribute(Qt::WA_DeleteOnClose);
  label->setAttribute(Qt::WA_QuitOnClose);
  label->show();
  app.exec();
  qDebug() << qVersion() << label; // will be null if label was deleted
  return 0;
}