【问题标题】:Is it possible to use WA_DeleteOnClose attribute with a main window that has no parent?是否可以在没有父窗口的主窗口中使用 WA_DeleteOnClose 属性?
【发布时间】:2015-07-16 18:22:33
【问题描述】:

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

【问题讨论】:

  • 那是什么平台?
  • 我在我的答案中添加了一个测试用例,检查它并用它的输出评论。

标签: c++ qt qt5 qwidget qtwidgets


【解决方案1】:

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

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

WA_DeleteOnClose 应用于没有父级,它不会被删除

WA_DeleteOnClose 行为的实现中没有代码受具有父级的小部件影响。只要widget是-aQt::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;
}

【讨论】:

  • "这可能适用于任何 QWidget,而不仅仅是 QMainWindow" - 对。 “一个简单的测试窗口是否被删除将是......” - 在发布之前尝试过。它肯定不会被删除,它显然是通过设置父级来触发的。我忘记了实现细节,但这是事实。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-24
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
相关资源
最近更新 更多