这个宏首先创建了两个内联函数,返回值都是QObjectPrivate *,并且声明QObjectPrivate为友元类,QObjectPrivate这个类是在qobject_p.h中定义,它继承至QObjectData,你可以看到d_func()是将d_prt强制转换为QObjectPrivate *类型,而d_prt这个指针在QObject里面定义的是QObjectData的指针类型,所以这里可以进行强转,QObje...
Q_OBJECT宏必须出现在类定义的私有部分中,该类定义声明自己的信号和槽函数,或者使用Qt元对象系统提供的其他支持。 Q_PROPERTY(...) 此宏用于在继承QObject的类中声明属性。属性的行为类似于类数据成员,但它们具有可通过元对象系统访问的其他特性。如下代码: Q_PROPERTY(typename (READgetFunction[WRITEsetFunction]|...
Q_OBJECT宏有着连接信号与宏的功能,一旦类中没有这个宏定义的话,信号与槽的关联也就消失了,有兴趣的小伙伴们可以做个测试,你把这个宏给注释掉,你就会发现程序一样可以正常编译通过,且成功运行,但是我点击按钮后,图片是不会显示的,原因就是缺少这个宏!
Q_OBJECT_NO_OVERRIDE_WARNING和Q_OBJECT_NO_ATTRIBUTES_WARNING这两个宏用于控制是否发出关于未覆盖(override)的警告或者关于某些属性的警告。 QT_TR_FUNCTIONS这个宏用于启用Qt的国际化(internationalization)功能,使得文本可以被翻译为不同的语言。 关于Q_DECL_HIDDEN_STATIC_METACALL,找到定义: //qobjectdefs.h#defi...
Q_OBJECT作为Qt中的一个很重要的宏定义,有的人可能不太会去了解它,直接按部就班的在类里的头部复制粘贴,但是有时忘记粘贴了就出大问题了。正如MFC里的消息映射宏,小白总是会抓狂,明明我啥都没改,为啥编译不过去。在Qt中,当派生类需要用到信号与槽机制时,需要做以下两件事情:1.该类派生QObject类,...
_ZTS7QObject 一、Q_D的在文件中的提法 Q_D的设置意在方便地获取私有类指针,文件为qglobal.h。下面的##是宏定义的连字符。假设类名是A,那么A##Private翻译过来就是APrivate。 #define Q_D(Class) Class##Private * const d = d_func()
定义:元对象系统是 Qt 框架中的一个特性,它允许在运行时进行类型的查询(introspection)和修改。这种能力是通过一种名为元对象编译器(Meta-Object Compiler, moc)的特殊工具实现的,它在编译阶段处理源代码中的 Qt 特有宏。 重要性:元对象系统为 Qt 提供了几个关键功能,其中包括信号和槽机制、动态属性系统,以及对象...
错误原因:出现上面这样的问题,就是因为没有生成头文件中带有宏Q_OBJECT的moc_前缀文件,导致在链接的时候(不是编译阶段的问题)出了问题,如下,没有生成moc_test.cpp,所以程序在链接的时候出了问题。
QT的实现方式是宏定义加moc编译,定义宏Q_OBJECT,并对语言本身做了部分扩展,因此需要用QT的moc编译器特殊处理一下,产生一个moc_XXX.cpp的文件,然后就可以使用通用C++编译器编译了。Q_OBJECT的定义如下:#define Q_OBJECT \public: \ virtual QMetaObject *metaObject() const { \ return staticMetaObject(); \ ...
QT_ANNOTATE_CLASS(qt_qobject, "") 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 从定义中可以看出该宏的作用有两个:一是对与自己相关的QMetaObject中间类操作进行声明,另一个是对信号的释放操作和反应槽的激活操作进行声明。当moc.exe对头文件进行预编译之后,将会产生一个...