Qt5 QMainWindow 组件删除

Posted

技术标签:

【中文标题】Qt5 QMainWindow 组件删除【英文标题】:Qt5 QMainWindow components deletion 【发布时间】:2016-10-04 17:00:54 【问题描述】:

我们的一位老师要求我们为主窗口(QMainWindow)创建一个没有任何 UI 文件的 Qt 应用程序。通常我总是创建一个,将其留空并让 uic 处理它。

我知道如果一个小部件(子)和它的父级之间定义了父级关系,那么就不需要删除这个小部件(删除父级时删除)。因此,当 UI 被删除时,所有子项都将被销毁。

如果我们不使用 UI 文件(未生成),我们是否必须手动删除所有添加到 GUI 的小部件?

一个小样本:

MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
     layout = new QHBoxLayout(this);
     aButton = new QButton(this);
     layout->addWidget(aButton);
     ...


MainWindow::~MainWindow()
    delete ui; // No need to delete more if parental relation.
    // However, what do we do if no ui has been generated?
    // Do we have to delete aButton?

parent的值为0,是应用程序的主入口。

谢谢

【问题讨论】:

实际上不清楚你在问什么,但假设uinullptr delete ui; 是NOP。所以看起来还不错。 我们必须手动删除每个小部件吗? 不需要。小部件应该是父小部件的子小部件。当父对象被删除时,QObject 会处理它们。 它应该有一个父 QObject(或者在堆栈上或者被手动删除......)否则 MainWindow 本身就会泄漏。 .ui 文件不会做任何神奇的事情,它们会转换为您可以自己编写的 C++ 代码(至少理论上如此)。请检查生成的简单 UI 的 ui_XXX.h 以获得一些见解。 另一件让你的生活更轻松的事情:addWidget、setLayout 等重置父级,所以你不需要在创建时将 this 作为构造函数参数小部件、布局等 【参考方案1】:

请参考this article

Qt Widgets 模块的基础类QWidget,扩展了父子关系。一个孩子通常也成为一个孩子小部件,即它显示在其父级的坐标系中,并被其父级的边界以图形方式裁剪。例如,当应用程序在关闭消息框后删除它时,消息框的按钮和标签也会被删除,正如我们想要的那样,因为按钮和标签是消息框的子级。

所以,你使用ui 没有区别。当您删除窗口时,它的所有子窗口也将被删除。

【讨论】:

以上是关于Qt5 QMainWindow 组件删除的主要内容,如果未能解决你的问题,请参考以下文章

QT5之三大重要窗体

如何从父级不是 QMainWindow 的 QWidget 访问 QMainWindow

如何使用 QWinThumbnailToolBar 与 QMainWindow

13.QT-QMainWindow组件使用

如何从另一个类调用 QMainWindow 组件?

qt multiple definition of qmain