当前位置:网站首页>Qt | 关于对象树和元对象的相关问题
Qt | 关于对象树和元对象的相关问题
2022-08-02 14:41:00 【华为云】
前言:
Qt中使用对象树来组织和管理所有的QObject类及其子类的对象。对象树是一个抽象概念,即所有的QObject对象的父子关系通过树结构来表现它们的层级关系。
Qt中的元对象系统(Meta-Object System)提供了对象间通信的信号和槽机制、运行时类型信息和动态属性系统。元对象(meta object)意思是描述另一个对象结构的对象,比如获得一个对象有多少成员函数,有哪些属性。
对象树:
问题:在Qt中经常看到使用new创建了对象,但是没有使用delete销毁对象的用法,这样不会造成内存泄露吗?
答案: 当创建一个QObject对象时,如果使用了其他的Object对象作为其父对象,那么这个QObject就会被添加到父对象的children()类表中。当父对象被销毁时,这个QObject也会被销毁。因此,当点击子部件的关闭时,子部件只是隐藏,而当父部件进行销毁时,子部件就会被父部件销毁,不会造成内存泄漏。
注意:
Qt中的main()函数中的主窗口部件要创建在栈上,这样在关闭程序时主窗口对象会自动销毁。
对于其它窗口部件,可以使用new操作符在堆上进行创建,这时要指定父部件,在父部件销毁时就会将它销毁,不需要使用delete操作符销毁。如果没有指定父部件,也不是顶层窗口,需要使用delete操作符进行销毁。
元对象:
问题:moc文件是如何生成的?
答案:对象编译器Meta-Object Compiler工具读取一个C++源文件,如果它发现一个或者多个类的声明中包含Q_OBJECT宏,则会另外创建一个C++源文件(就是项目中的moc开头的.cpp文件)。其中包含了为每一个类生成的元对象代码。
moc的实现是一个预处理器,使用moc的方式,所有平台上的标准的C++编译器都能支持Qt。从而不需要实现一个新的跨平台的Qt编译器。moc是为了解决反射问题的,但是一些动态的编程语言(如Python,Ruby等)中,语言本身自带反射功能。Qt程序之所以编译速度慢,主要是因为在 Qt 将源代码交给标准C++编译器,如gcc之前,需要事先将这些扩展的语法去除掉。完成这一操作的就是 moc。
元对象系统主要是为了实现信号和槽机制才被引入的,不过除了信号和槽机制以外,元对象系统还提供了一些其他特性:
QObject::metaObject(): 返回一个类的元对象。
QMetaObject::className(): 在运行时以字符串形式返回类名。
QObject::inherits(): 返回一个对象是否是QObject继承树上一个类的实例的信息。
QObject::tr()和QObject::trUtf8(): 进行字符串翻译来实现国际化。
QObject::setProperty()和QObject::property(): 通过名字来动态设置或者获取对象属性。
QMetaObject::newInstance(): 构造类的一个实例。
qobject_cast(): 对QObject类进行动态类型转换。这个函数类似于C++中的dynamic_cast()函数,但它不再需要RTTI的支持。这个函数尝试将它的参数转换为尖括号中的类型的指针,如果是正确类型,则返回一个非零的指针;否则返回0。
例如:
QObject *obj = new MyWidget;
QWidget *widget = qobject_cast<QWidget *>(obj);
注意, 元对象系统是基于以下3个条件的:
该类必须继承自QObject类
必须在类的私有声明区声明Q_OBJECT宏(在类定义时,如果没有指定public或者private,则默认为private);
元对象编译器Meta-Object Compiler(moc)为QObject的子类实现元对象特征提供必要的代码。
边栏推荐
猜你喜欢
随机推荐
树状DP(记忆化搜索)PAT甲级 1079 1090 1106
2022 Security Officer-A Certificate Exam Questions and Mock Exam
祝蔡徐坤生日快乐!
A status code, and access baidu process
H5中的拖放(Drag 和 Drop)
2022-07-20 第六小组 瞒春 学习笔记
什么是Nacos?
codeforces Linova and Kingdom
lambda表达式、Stream接口及Optional类
js中的数组方法和循环
什么是Knife4j?
基于ip的证书
MySQL 自增主键
PAT serie a 1137 final grades
该死的单元测试,写起来到底有多痛?
一文让你快速手写C语言-三子棋游戏
MySQL 的几种碎片整理方案总结(解决delete大量数据后空间不释放的问题)
单例模式(singleton pattern)
中科驭数等单位牵头发布行业首部DPU评测方法技术白皮书
兆骑科创创业赛事活动路演,高层次人才引进平台