news 2026/6/8 4:39:29

Qt 入门 05|QObject 基类、父子对象内存管理、MOC 元对象系统完整详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Qt 入门 05|QObject 基类、父子对象内存管理、MOC 元对象系统完整详解

一、QObject 介绍

QObject 是 Qt 绝大多数类的顶层父类,所有控件 (QWidget 派生)、定时器 QTimer、网络 QTcpSocket 均继承 QObject,提供三大核心能力:父子内存管理、信号槽、元对象系统


二、父子对象自动内存管理(Qt 内存核心)

  1. 创建 QObject 派生对象时,构造函数传入父指针QObject *parent = nullptr
  2. 父对象被析构时,自动遍历子对象链表,逐个 delete 所有子对象,无需手动 delete,杜绝内存泄漏;

cpp

运行

QWidget w; QPushButton btn(&w); // btn父对象是w,w销毁自动释放btn
  1. 注意:栈对象不能指定父为堆对象 / 其他栈对象,栈变量生命周期结束自动析构,父析构再次 delete 子对象造成双重释放崩溃。

三、MOC 元对象系统

  1. 启用条件:类继承 QObject + 类内添加Q_OBJECT宏;
  2. MOC 编译流程:
    1. qmake/CMake 收集带 Q_OBJECT 的头文件;
    2. MOC 工具扫描头,生成moc_xxx.cpp源文件;
    3. 生成的 moc 文件参与项目编译,实现信号槽、元类型反射;
  3. 元对象核心 API:
    • metaObject ():获取类元信息,运行时查询类名、函数名;
    • qobject_cast:安全动态类型转换,替代 C++ dynamic_cast。

四、补充要点

  1. QObject 禁用拷贝构造与赋值运算符(Q_DISABLE_COPY),所有 QObject 对象不能直接拷贝;
  2. 堆创建对象推荐指定父,依靠 Qt 自动内存回收。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/8 4:36:08

电机驱动板EMC翻车实录:从EFT群脉冲到静电放电,我的PCB布线血泪史

电机驱动板EMC实战避坑指南:从EFT群脉冲到静电放电的PCB设计优化作为一名长期奋战在电机驱动硬件设计一线的工程师,我至今记得第一次送检EMC实验室时的惨痛经历。那是一款基于STM32F4的BLDC电机驱动板,在实验室里接连倒在了EFT群脉冲和静电放…

作者头像 李华
网站建设 2026/6/8 4:34:01

GraspNet1BGeomGraspAscend混合精度量化:如何在昇腾上实现内存减半

GraspNet1BGeomGraspAscend混合精度量化:如何在昇腾上实现内存减半 【免费下载链接】GraspNet1BGeomGraspAscend 项目地址: https://ai.gitcode.com/quzhi_1981/GraspNet1BGeomGraspAscend GraspNet1BGeomGraspAscend是一个面向昇腾AI处理器(Ascend 310P)的…

作者头像 李华
网站建设 2026/6/8 4:29:26

跟我一起学“仓颉”编程语言-线程管理

一、线程和进程程序是静态的代码集合,当程序运行时,对应的程序实例就是进程。进程是操作系统分配资源的基本单位。线程是操作系统能够进行运算调度的最小单位。线程被包含于进程之中,是进程中实际执行单位。二、并发和并行并发指的是多个任务…

作者头像 李华