元对象系统
Qt的元对象编译器(Meta-Object Compiler, MOC)是一个预处理器,它用于将Qt特性的程序转换为标准C++兼容的形式,再由标准C++编译器进行编译。例如,在使用信号与槽机制的类里,通过添加一个Q_OBJECT
宏,MOC才对类中的信号与槽的代码进行预处理。
Qt的元对象系统(Meta-Object System)提供了对象之间通信的信号与槽机制、运行时类型信息和动态属性系统。
除了信号与槽机制,元对象还提供如下一些功能:
QObject::metaObject()
:返回类关联的元对象,元对象类QMetaObject
包含了访问元对象的接口函数1
2
3// e.g. 运行时返回类的名称字符串
QObject *obj = new QPushButton;
obj->metaObject()->classNmae; // 返回"QPushButton"QMetaObject::newInstance()
:创建类的一个新的实例QObject::inherits(const char *className)
:判断对象是否是名为className的类,或者QObject的子类的实例1
2
3
4
5// e.g.
QTimer *timer = new QTimer;
timer->inherits("Qtimer"); // return true
timer->inherits("QObject"); // return true
timer->inherits("QABstraactButton");// return falseqobject_cast()
:dynamic cast功能1
2
3
4
5// e.g. 假设QMyWidget是QWidget的子类并且类中声明了Q_OBJECT宏
QObject *obj = new QMyWidget;
QWidget *widget = qobject_cast<QWidget *>(obj); // 向上转型
QMyWidget *myWidget = qobject_cast<QMyWidget *>(obj); // 向下转型
QLabel *label = qobject_cast<QLabel *>(obj); // errorQObject::tr()
和QObject::trUtf8()
用于翻译字符串,用于多语言界面设计QObject::setProperty()
和QObject::property()
函数用于通过属性名称动态设置和获取属性值