当前位置: 首页 > news >正文

Qt的MOC机制

Qt的MOC机制

Qt扩展了C++,使得开发者拥有很多方便使用的工具。如何使用Qt提供的特性呢?比如信号与槽,那就需要开发者在类中声明Q_OBJECT宏,这样程序员就能使用Qt提供的功能了。为什么这样可以呢?先从C++文件的编译过程开始讲。

一般C++的编译过程就是传统的:预处理,编译、汇编、链接四个步骤。如果使用了Qt,Qt的MOC(Meta-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() 函数的。

该文章会更新,欢迎大家批评指正。

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,
分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:
服务器课程:C++服务器

http://www.lryc.cn/news/20805.html

相关文章:

  • Linux驱动——设备模型
  • .NET基础加强第一课--面向对象(OO)
  • 从Linux源码角度看套接字的Listen及连接队列
  • cesium: 显示闪烁的点(004)
  • 常见代码审计工具,代码审计为什么不能只用工具?
  • es8集群模式部署
  • OAuth2
  • 一、简单排序
  • 慢SQL出现原因、优化、开启慢查询日志
  • 要理解网络,其实不就是理解这三张表吗
  • Java异常架构与异常关键字
  • 【阅读笔记】SecureML: A System for ScalablePrivacy-Preserving Machine Learning
  • 【2023美赛】C题Wordle预测27页中文论文及Python代码详解
  • 【C++修行之路】STL——模拟实现string类
  • CorelDRAW2023最新版序列号使用教程
  • 【一天一门编程语言】Python 语言程序设计极简教程
  • 14、KL散度
  • TypeError: load() missing 1 required positional argument: ‘Loader‘解决方案
  • 【设计模式】 观察者模式介绍及C代码实现
  • 01-Maven基础-简介安装、基本使用(命令)、IDEA配置、(写jar,刷新自动下载)、依赖管理
  • 一、前端稳定性规约该如何制定
  • Docker(三)Docker网络
  • Js高级API
  • 团队:在人身上,你到底愿意花多大精力?
  • Linux-Poolkit提权
  • 【React全家桶】React Hooks
  • CLIP论文阅读
  • 华为OD机试真题Python实现【身高排序】真题+解题思路+代码(20222023)
  • Spring Cache的使用--快速上手篇
  • (三十八)MySQL是如何支持4种事务隔离级别的?Spring事务注解是如何设置的?