元对象系统
QT的元对象系统提供了:
- 信号与槽
- 运行时类型信息
- 动态属性系统
元对象系统基于以下三点实现:
- 使用QObject作为基类
- 在类中使用宏Q_OBJECT来开启元对象特性,如:动态属性、信号和槽
- 使用元对象编译器(moc)为每一个QObject子类提供必要的代码来实现元对象特性
元对象编译器在编译C++源码时,如果在源码中检测到包含Q_OBJECT宏,则它会生成一份新的带有元对象代码信息的源码
元对象系统提供的特性
- 信号与槽
- QObject::metaObject()返回类的元对象
- QMetaObject::className()在运行时以字符串的形式返回类名,不需要C++编译器对原生RTTI的支持
- QObject::inherits()函数返回对象是否是继承 QObject 继承树中指定类的类的实例。
- QObject::tr()和QObject::trUtf8()国际化翻译字符串
- QObject::setProperty和QObject::property()根据属性名动态设置和获取属性
- QMetaObject::newInstance()构造一个新的类的实例
在QObject类上,可以使用qobject_cast()执行动态转换,QT中的qobject_cast()类似于标准C++中的dynamic_cast(),它的优点是不需要RTTI支持并且可以跨动态库边界工作。如果类型转换成功,则返回非零指针;如果转换失败,则返回nullptr
举个例子:
const QMetaObject *QObject::metaObject() const
const char *QMetaObject::className() const
QObject *obj = new QPushButton;
obj->metaObject()->className(); // returns "QPushButton"
QPushButton::staticMetaObject.className(); // returns "QPushButton"
bool QObject::inherits(const char *className) const
QTimer *timer = new QTimer; // QTimer inherits QObject
timer->inherits("QTimer"); // returns true
timer->inherits("QObject"); // returns true
timer->inherits("QAbstractButton"); // returns false
bool QObject::setProperty(const char *name, const QVariant &value)
QTimer *timer = new QTimer;
timer->setProperty("interval", 1000);
T qobject_cast(const QObject *object)
QObject *obj = new QTimer; // QTimer继承于QObject
QTimer *timer = qobject_cast<QTimer *>(obj); // 类型转换成功
QPushButton *btn = qobject_cast<QPushButton *>(obj); //类型转换失败,QPushButton于QTimer类型不兼容
// 所以,btn == nullptr
学习资料
- QT帮助文档