【QT小记】QT元对象系统简单认识

元对象系统

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帮助文档
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值