当前位置: 首页 > wzjs >正文

mi2设计公司网站设计网站公司地址

mi2设计公司网站,设计网站公司地址,杭州企业网站制作,个人如何制作网站文章目录 一、对象树的概念二、对象拥有权(Ownership)三、Qt Widgets 中的特殊情况四、对象树与拥有权的实例 一、对象树的概念 在 Qt 中,对象树(Object Tree)与对象的拥有权(Ownership)密切相…

文章目录

    • 一、对象树的概念
    • 二、对象拥有权(Ownership)
    • 三、Qt Widgets 中的特殊情况
    • 四、对象树与拥有权的实例

一、对象树的概念

在 Qt 中,对象树(Object Tree)与对象的拥有权(Ownership)密切相关,它们是Qt 对象管理机制的重要组成部分,能够帮助开发者管理对象的生命周期,避免内存泄漏。

Qt 使用 QObject 作为所有 Qt 对象的基类,并引入了 父子关系(Parent-Child Relationship),即:

  • 每个 QObject 对象可以有一个 父对象。
  • 一个 父对象 可以拥有多个 子对象。

这个关系形成了一棵对象树(Object Tree)。可以通过 QObject::children() 方法获取当前对象的所有子对象。

QWidget *parentWidget = new QWidget;
QPushButton *button = new QPushButton(parentWidget); // 设定父对象
qDebug() << parentWidget->children(); // 输出 button 作为子对象

二、对象拥有权(Ownership)

(1) Qt 的内存管理规则
Qt 采用父对象管理子对象的方式,当一个 QObject 被销毁时,它的所有子对象也会被自动销毁。

QObject *parent = new QObject;
QObject *child = new QObject(parent); // child 的父对象是 parent
delete parent; // child 也会自动被销毁

因此:

  • 子对象的生命周期受父对象管理,一般不需要手动 delete。
  • 手动 delete 子对象不会影响父对象。

(2) 动态创建但无父对象的情况
如果 QObject 没有父对象,那么需要手动 delete,否则会造成 内存泄漏:

QObject *obj = new QObject; // 没有父对象
// delete obj;  // 需要手动释放

(3) setParent() 变更父对象
可以动态修改 QObject 的父对象:

QObject *parent1 = new QObject;
QObject *parent2 = new QObject;
QObject *child = new QObject(parent1); // 初始父对象是 parent1
child->setParent(parent2); // 转移到 parent2

注意: setParent() 会自动从旧的父对象 parent1 的 children() 列表中移除 child,并加入 parent2 的管理。

(4)特殊情况:QObject 对象的删除行为
直接 delete 一个对象

QObject *obj = new QObject;
delete obj; // 直接删除,释放内存

deleteLater() 的延迟删除
Qt 提供了 deleteLater(),它不会立即删除对象,而是在事件循环(Event Loop)空闲时进行删除:

QObject *obj = new QObject;
obj->deleteLater(); // 标记为删除,稍后自动清理

适用于:

  • 防止直接 delete 影响正在执行的事件处理逻辑。
  • 适合异步删除对象,尤其是 GUI 组件。

三、Qt Widgets 中的特殊情况

(1) QWidget 的 parent 影响显示
对于 QWidget,设置 parent 还影响 显示层级:

  • QWidget 子对象会 自动成为父对象的子窗口。
  • 没有 parent 的 QWidget 会成为 独立窗口。
QWidget *window = new QWidget;
QWidget *child = new QWidget(window); // child 作为子窗口
window->show(); // 显示 window,同时 child 也会显示

(2) QMainWindow 与 setCentralWidget()
QMainWindow 有特殊的对象管理方式,它不使用 Qt 的父子关系,而是通过 setCentralWidget() 来管理主窗口部件:

QMainWindow *mainWindow = new QMainWindow;
QWidget *centralWidget = new QWidget;
mainWindow->setCentralWidget(centralWidget); // centralWidget 并不会被 mainWindow->children() 获取

这里 QMainWindow 不会 直接拥有 centralWidget,但会在 QMainWindow 被销毁时删除 centralWidget。

四、对象树与拥有权的实例

Qt中使用对象树(object tree)来组织和管理所有的QObject类及其子类的对象。当创建一个QObject 时,如果使用了其他的对象作为其父对象(parent),那么这个QObject就会被添加到父对象的children()列表中;当父对象被销毁时,这个QObject也会被销毁。实践表明,这个机制非常适合于管理GUI对象。例如,一个QShortcut(键盘快捷键)对象是相应窗口的一个子对象,当用户关闭这个窗口时,快捷键对象也会被销毁。QWidget作为Qt Widgets 模块的基础类,扩展了对象间的父子关系。一个子对象一般也就是一个子部件,因为它们要显示在父部件的坐标系统之中。例如,当关闭一个消息对话框(messagebox)后要销毁它时,消息对话框中的按钮和标签也会被销毁,这也正是我们所希望的,因为按钮和标签是消息对话框的子部件。当然,也可以自己手动来销毁一个子对象,这时会将它们从其父对象中移除。

自定义类MyButton,代码实现如下:

#ifndef MYBUTTON_H
#define MYBUTTON_H#include <QWidget>
#include <QPushButton>
#include <QDebug>class MyButton : public QPushButton
{Q_OBJECT
public:explicit MyButton(QWidget *parent = nullptr) : QPushButton(parent) {}~MyButton() {qDebug() << "delete my button";}
};#endif // MYBUTTON_H

调用代码如下:

#include "mainwindow.h"
#include "mybutton.h"MainWindow::MainWindow(QWidget *parent): QWidget(parent)
{MyButton *button = new MyButton(this);button->setText(tr("button"));
}MainWindow::~MainWindow()
{qDebug() << "delete widget";
}

显示窗口后然后关闭窗口打印结果:
在这里插入图片描述
可以看出MyButton对象在父对象MainWindow释放后,也会自动释放。

http://www.dtcms.com/wzjs/564109.html

相关文章:

  • 建筑工人招聘网站怎么做接网站开发哪里好
  • 德州宁津网站建设wordpress设置图片大小
  • 彩妆网站模板中小企业网络拓扑图绘制
  • 深圳网站建设服务莱芜人力资源部最新招聘信息
  • 公司网站开发费用济南兴田德润o评价深圳最近流感多吗
  • 合肥网站seo整站优化保定网络营销网站
  • 学做网站用到哪些知识建设运营网络或提供网络服务
  • 公司网站建设企划书微山县建设局官方网站
  • 关于手机电子商务网站建设wordpress 添加文章列表
  • 中国建设银行官网站陕西西安网页设计师联盟网站
  • python做网站方便么网站做推广有用
  • 企业简介模板word网站优化自已做还是请人做
  • 开发网站通过第三方微信认证登录开发费用非法网站怎么推广
  • 网站建设视频教程下载免费数据库网站空间
  • 贵州网站建设公司代理网店怎么开
  • 网站换新的空间域名解析怎么做给网站做rss
  • 网站访问统计报告模板怎么建设网站阿里云
  • 重庆建设公司网站长春市宽城区建设局网站
  • 网站备案ip地址段网站建设的钱计入什么科目
  • 定制旅游哪个网站好用网站建设及编辑岗位职责
  • 安徽省工程建设监理协会网站跨境电商网站建设方案书
  • 做网站为什么可以自学做网站用虚拟机还是服务器
  • 网站建设的布局种类dede重工蓝色企业免费网站模板
  • 怎么做音乐mp3下载网站h5网站是什么意思
  • 中国建设银行巴黎分行网站东莞建设教育网站
  • 沈阳网站哪家做的好公司网站建设比较好的公司
  • 北京网站搭建公司排行天价索赔背后的平台版权对垒
  • 广安网站建设公司ps做网站宽度
  • 网站未备案怎么访问网站制作建设
  • 做厂房出租有那些推广网站轻松seo优化排名