文章目录
概述
Qt本身并不是一种编程语言,它实质上是一个跨平台的C++开发类库,是用标准C++编写的类库,它为开发GUI应用程序和非GUI应用程序提供了各种类。Qt对标准C++进行了扩展,引入了一些新的概念和功能,例如信号与槽、对象属性等。Qt的元对象编译器(Meta-Object Compiler, MOC)是一个预处理器,在源程序被编译前先将这些Qt特性的程序转换为标准C++兼容的形式,然后再由标准C++编译器进行编译。这就是为什么在使用信号与槽机制的类里,必须添加一个Q_OBJECT宏的原因,只有添加了这个宏,moc才能对类里的信号与槽的代码进行预处理。Qt Core模块是Qt类库的核心,所有其他模块都依赖于此模块,如果使用qmake来构建项目,Qt Core模块则是被自动加入的。Qt为C++语言增加的特性就是在Qt Core模块里实现的,这些扩展特性由Qt的元对象系统实现,包括信号与槽机制、属性系统、动态类型转换。
元对象系统的概念和组成
QObject是Qt的元对象系统的基础类,它为对象提供了信号与槽机制、对象树、事件处理等功能。QMetaObject是描述类元信息的对象,用于存储类的元数据,包括类名、信号、槽、属性、方法等。每个继承QObject的类都隐式包含一个静态的QMetaObject。另外QMetaProperty表示类的属性,可以通过它动态访问对象的属性。QMetaMethod表示类的方法,可以用于动态调用对象的方法。
元对象系统由以下三个基础组成:
- QObject类是所有使用元对象系统的类的基类。
- 在一个类的private部分声明Q_OBJECT宏,使得类可以使用元对象的特性,如动态属性、信号与槽。
- MOC(元对象编译器)为每个QObject的子类提供必要的代码来实现元对象系统的特性。构建项目时,MOC工具读取C++源文件,当它发现类的定义里有Q_OBJECT宏时,它就会为这个类生成另一个包含有元对象支持代码的C++源文件,这个生成的源文件连同类的实现文件一起被编译和链接。
QObject 的详细介绍
QObject 是 Qt 框架中所有对象模型的基础类,几乎所有的 Qt 类(如 QWidget, QTimer, QThread 等)都直接或间接继承自 QObject。它提供了 Qt 元对象系统的核心功能,包括信号与槽机制、动态属性、事件处理、对象树结构等。
1.QObject 的主要特性
信号与槽机制
支持对象间松耦合的通信。
定义信号和槽的方式:用 signals 关键字定义信号;用 slots 关键字或使用任何公开的 public 方法定义槽。
信号与槽机制常用成员函数:
QObject::connect():连接信号与槽。
QObject::disconnect():断开信号与槽。
QObject::signalsBlocked():检查信号是否被阻塞。
QObject::blockSignals():阻塞或恢复信号。
#include <QObject>
#include <QDebug>
class MyObject : public QObject {
Q_OBJECT
public:
MyObject(QObject *parent = nullptr) : QObject(parent) {
}
signals:
void mySignal(int value);
public slots:
void mySlot(int value) {
qDebug() << "Slot received value:" << value;
}
};
int main() {
MyObject obj1, obj2;
QObject::connect(&obj1, &MyObject::mySignal, &obj2, &MyObject::mySlot);
emit obj1.mySignal(42); // 触发信号
return 0;
}
动态属性
QObject 提供了动态属性支持,可以在运行时为对象添加或修改属性。
属性常用成员函数:
QObject::setProperty(const char *name, const QVariant &value):设置动态属性。
QObject::property(const char *name):获取动态属性。
QObject::dynamicPropertyNames():获取所有动态属性的名称。
#include <QObject>
#include <QDebug>
int main() {
QObject obj;
obj.setProperty("dynamicProperty", 123);
qDebug() << "Property value:" << obj.property("dynamicProperty").toInt();
foreach (const QByteArray &propName, obj.dynamicPropertyNames()) {
qDebug() << "Property name:" << propName;
}
return 0;
}
对象树(Object Trees)
QObject 通过父子关系管理对象生命周期。
一个对象的子对象会在父对象销毁时自动销毁。
对象树管理常用成员函数:
QObject::setParent(QObject *parent):设置父对象。
QObject::parent():获取父对象。
QObject::children():获取子对象列表。
#include <QObject>