0%

Qt元对象系统

元对象系统

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 false
  • qobject_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); // error
  • QObject::tr()QObject::trUtf8()用于翻译字符串,用于多语言界面设计
  • QObject::setProperty()QObject::property()函数用于通过属性名称动态设置和获取属性值