【问题标题】:Qt5 QMainWindow components deletionQt5 QMainWindow 组件删除
【发布时间】: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 作为构造函数参数小部件、布局等

标签: c++ qt qt5


【解决方案1】:

请参考this article

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 2013-05-19
    • 2011-10-25
    • 1970-01-01
    • 2016-10-17
    相关资源
    最近更新 更多