QT的Meta-Object系统
来源:互联网 发布:office包含哪些软件 编辑:程序博客网 时间:2024/05/22 00:23
原文:http://doc.qt.io/qt-5/metaobjects.html
Qt的meta-object system为对象间通信提供了signals和slots机制, 运行时类型检查(RTTI),和动态属性系统(dynamic property system)。
meta-object系统基于3件事情:
- QObject为利用meta-object系统的对象提供了一个基类;
- 在类声明的私有段的Q_OBJECT宏被用来enable meta-object系统,比如dynamic property,signals和slots;
- moc(Meta-Object Compiler)为每个QObject的子类提供必要的代码以实现meta-object的功能。
除了为对象间通信提供signals和slots机制外(引入meta-object系统的主要原因),meta-object代码还提供如下的功能:
- QObject::metaObject() 返回和该类相关的meta-object.
- QMetaObject::className() 可以在运行时以string的形式返回类名,而不需要编译器的运行时类型检查(RTTI)的支持。
- QObject::inherits() 返回一个对象是否是一个类的实例,该类继承了QObject继承树种的某个类。
- QObject::tr()和QObject::trUtf8() 为国际化而翻译字符串。
- QObject::setProperty()和QObject::property() 通过名称动态地set和get属性;
- QMetaObejct::newInstance() 构造该类的一个新的实例
比如,假设MyWidget继承了QWidget,并且Q_OBJECT宏已经被声明:
QObject *obj = new MyWidget;QWidget *widget = qobject_cast<QWidget *>(obj); // correctMyWidget *myWidget = qobject_cast<MyWidget *>(obj); // correctQLabel *label = qobject_cast<QLabel *>(obj); // label is 0转换到QLabel失败了。指针被设为0. 这使得在运行时基于类型来处理不同类型的对象成为可能:
if (QLabel *label = qobject_cast<QLabel *>(obj)) { label->setText(tr("Ping"));} else if (QPushButton *button = qobject_cast<QPushButton *>(obj)) { button->setText(tr("Pong!"));}
使用QObject作为基类而不使用Q_OBJECT宏和meta-object代码是可能的。如果Q_OBJECT宏没有被使用,signals和slots,以及这里描述的其他功能就没有办法用了。从meta-object系统的观点来看,一个没有meta-object代码的QObject子类的对象,和它最近的祖先在meta-object code上是一致的。也就是说,比如,QMetaObject::className()将不会返回你的类的真正的名字,而是返回它的祖先的类名。
因此,我们强烈建议所有QObject的子类,都应该使用Q_OBJECT宏,无论它们是否使用了
signals、slots和properties.
1 0
- QT的 Meta-Object系统
- QT的Meta-Object系统
- QT: Meta-Object 系统
- Qt之Meta-Object系统
- Qt的元对象(Meta-Object)系统简介
- Qt的元对象(Meta-Object)系统简介
- Qt的元对象(Meta-Object)系统简介
- Qt的元对象(Meta-Object)系统简介
- Qt的元对象(Meta-Object)系统简介
- QT的元对象系统(Meta-Object System)
- Qt的元对象(Meta-Object)系统简介
- Qt的元对象(Meta-Object)系统简介
- Qt 元对象系统(Meta-Object System)
- Qt 元对象系统(Meta-Object System)
- Qt 元对象系统(Meta-Object System)
- Qt 如何实现的 Meta Object
- Qt 如何实现的 Meta Object
- qt meta-object system
- nyoj301 递推求值(矩阵快速幂)
- 后缀数组
- 深入理解Java虚拟机----(十一)线程安全与锁优化
- vs2013连接mysql mysql_init未定义
- poj--2516--Minimum Cost(最小费用流)
- QT的Meta-Object系统
- 相当重要---部署OGG对Oracle Database 补丁的要求
- 从初识Linux到离不开系列(四)循序渐进
- Android Studio API23以后HttpClient
- NYOJ-组合数
- ATL与COM之间的关系、ATL的特点与基本使用方法
- Android TV Studuy1-2
- 后缀平衡树 nbut1653 String in the tree
- 需要经常看的故事