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,是应用程序的主入口。
谢谢
【问题讨论】:
实际上不清楚你在问什么,但假设ui
是nullptr
delete ui;
是NOP。所以看起来还不错。
我们必须手动删除每个小部件吗? 不需要。小部件应该是父小部件的子小部件。当父对象被删除时,QObject 会处理它们。
它应该有一个父 QObject(或者在堆栈上或者被手动删除......)否则 MainWindow 本身就会泄漏。
.ui 文件不会做任何神奇的事情,它们会转换为您可以自己编写的 C++ 代码(至少理论上如此)。请检查生成的简单 UI 的 ui_XXX.h 以获得一些见解。
另一件让你的生活更轻松的事情:addWidget、setLayout 等重置父级,所以你不需要在创建时将 this 作为构造函数参数小部件、布局等
【参考方案1】:
请参考this article
Qt Widgets 模块的基础类QWidget,扩展了父子关系。一个孩子通常也成为一个孩子小部件,即它显示在其父级的坐标系中,并被其父级的边界以图形方式裁剪。例如,当应用程序在关闭消息框后删除它时,消息框的按钮和标签也会被删除,正如我们想要的那样,因为按钮和标签是消息框的子级。
所以,你使用ui
没有区别。当您删除窗口时,它的所有子窗口也将被删除。
【讨论】:
以上是关于Qt5 QMainWindow 组件删除的主要内容,如果未能解决你的问题,请参考以下文章
如何从父级不是 QMainWindow 的 QWidget 访问 QMainWindow