大佬教程收集整理的这篇文章主要介绍了Qt之Meta-Object系统,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
Qt的元对象系统(Meta-Object System)提供了信号与槽机制,可用于对象间通信、运行时类别信息和动态属性系统。
元对象系统基于三个方面:
除了为对象间的通信提供信号与槽(引入元对象系统的主要原因)机制外,元对象还提供以下特性:
QMetaObject::className()在运行时以字符串的形式返回类名,无需C++编译器提供运行时类别信息(RTTI)的支持。
QObject::setproperty()和QObject::property()通过名称动态设置和获取属性。
除此之外,还可以用qobject_cast()动态转换QObject类的类型。qobject_cast()函数和标准C++的dynamic_cast()功能类似,它的优点在于:不需要RTTI的支持,而且可以跨越动态连接库的转换。它尝试将它的参数转换成尖括号内的指针类型,如果对象是正确的类型(在运行时检查),则返回非零指针;否则,返回0,说明对象类型不兼容。
例如,假设MyWidget继承自QWidget,同时也声明了Q_OBjeCT宏。
QObject *obj @H_419_83@= new MyWidget;@H_419_83@
QObject *类型的变量obj实际上指向@L_353_3@myWidget对象,因此,我们可以适当地进行类型转换:
QWidget *widget @H_419_83@= qobject_cast<QWidget *>(obj);@H_419_83@
因为obj实际上是@L_353_3@myWidget,而myWidget是QWidget的子类,所以,从QObject转换为QWidget成功了。既然知道了obj是MyWidget类型的,那么我们也可以将其转换为MyWidget *:
@H_387_78@myWidget *myWidget @H_419_83@= qobject_cast<MyWidget *>(obj);@H_419_83@
到MyWidget类型的转换也是成功的,因为qobject_cast()并不区分内建的Qt类型和自定义类型。
QLabel *label@H_419_83@ = qobject_cast<QLabel *>(obj);
// label@H_419_83@ 为 0@H_419_83@
可是,转换到QLabel却失败了,返回的指针为0。这使得我们可以在运行时根据对象的类型而做不同的操作:
if@H_419_83@ (QLabel *label@H_419_83@ = qobject_cast<QLabel *>@H_419_83@(obj)) {
label->setText(tr@H_419_83@("Ping"@H_419_83@));
} else@H_419_83@ if@H_419_83@ (QPushButton *button@H_419_83@ = qobject_cast<QPushButton *>@H_419_83@(obj)) {
button->setText(tr@H_419_83@("Pong!"@H_419_83@));
}
尽管可以在不用Q_OBjeCT宏(即:不用任何元对象代码)的情况下仍旧使用QObject作为基类,但是像信号和槽以及上面所说的其它特性都将无法使用。从元对象系统的角度来看,一个没有元对象代码的QObject子类等同于它最接近的有元对象代码的祖先。这意味着,QMetaObject::className()将不会返回你的类的真实名称,而是返回其祖先的名字。
因此,强烈建议所有QObject的子类都使用Q_OBjeCT宏,不管实际上是否使用信号和槽,以及属性。
以上是大佬教程为你收集整理的Qt之Meta-Object系统全部内容,希望文章能够帮你解决Qt之Meta-Object系统所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。