是否可以将WA_DeleteClose属性用于没有父窗口的主窗口

Is it possible to use WA_DeleteOnClose attribute with a main window that has no parent?

本文关键字:窗口 用于 属性 WA DeleteClose 是否      更新时间:2023-10-16

我正在试验WA_DeleteOnClose属性,它正好实现了我所需要的。比手动操作要整洁得多。然而,有一个问题:如果我在没有父级的情况下构造WA_DeleteOnClose应用到的QMainWindow,它在关闭时不会被删除。如果我确实设置了一个父级(应用程序的主QMainWindow(,则有问题的辅助QMainWindow将丢失其任务栏按钮,这是不可接受的。我该如何解决这个难题?

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

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

WA_DeleteClose应用于没有父项的情况,它不会被删除

WA_DeleteOnClose行为的实现中没有任何代码受到具有父级的小部件的影响。只要小部件是Qt::Window,它就会被删除。参见closeHelper

有问题的辅助QMainWindow丢失了任务栏按钮,这是不可接受的

这可能适用于任何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;
}