正规的镇江网站建设,怎样在我的世界做汽车视频网站,今晚24时油价调整最新消息,安全的赣州网站建设Qt的MOC机制
Qt扩展了C#xff0c;使得开发者拥有很多方便使用的工具。如何使用Qt提供的特性呢#xff1f;比如信号与槽#xff0c;那就需要开发者在类中声明Q_OBJECT宏#xff0c;这样程序员就能使用Qt提供的功能了。为什么这样可以呢#xff1f;先从C文件的编译过程开始…Qt的MOC机制
Qt扩展了C使得开发者拥有很多方便使用的工具。如何使用Qt提供的特性呢比如信号与槽那就需要开发者在类中声明Q_OBJECT宏这样程序员就能使用Qt提供的功能了。为什么这样可以呢先从C文件的编译过程开始讲。
一般C的编译过程就是传统的预处理编译、汇编、链接四个步骤。如果使用了QtQt的MOCMeta-Object Compiler元对象编译器会在预处理之前找出所有的带有Q_OBJECT宏的类生成 moc_xxx.cpp。然后才是正常的C编译流程。
为了查看 moc 生成的文件我们使用一个很简单的 cpp 来测试
test.cpp
class Test : public QObject
{ Q_OBJECT
public: explicit Test(QObject *parent 0);
signals:
public slots:
};这是一个空白的类什么都没有实现。在经过编译之后我们会在输出文件夹中找到 moc_test.cpp。
可以看到moc_test.cpp 里面为 Test 类增加了很多函数。然而我们并没有实际写出这些函数它是怎么加入类的呢别忘了我们还有 Q_OBJECT 这个宏呢在 qobjectdefs.h 里面找到 Q_OBJECT 宏的定义
#define Q_OBJECT
public: Q_OBJECT_CHECK static const QMetaObject staticMetaObject; Q_OBJECT_GETSTATICMETAOBJECT virtual const QMetaObject *metaObject() const; virtual void *qt_metacast(const char *); QT_TR_FUNCTIONS virtual int qt_metacall(QMetaObject::Call, int, void **);
private:这下了解了正是对 Q_OBJECT 宏的展开使我们的 Test 类拥有了这些多出来的属性和函数。注意QT_TR_FUNCTIONS 这个宏也是在这里定义的。也就是说如果你要使用 tr() 国际化就必须使用 Q_OBJECT 宏否则是没有 tr() 函数的。
该文章会更新欢迎大家批评指正。
推荐一个零声学院免费公开课程个人觉得老师讲得不错 分享给大家[LinuxNginxZeroMQMySQLRedis fastdfsMongoDBZK流媒体CDNP2PK8SDocker TCP/IP协程DPDK等技术内容点击立即学习: 服务器课程C服务器