Qt中Q_OBJECT与生成的moc文件的作用

一、先来了解Q_OBJECT

只有继承了QObject类的类,才具有信号槽的能力。所以,为了使用信号槽,必须继承QObject。凡是QObject类(不管是直接子类还是间接子类),都应该在第一行代码写上Q_OBJECT。不管是不是使用信号槽,都应该添加这个宏。这个宏的展开将为我们的类提供信号槽机制、国际化机制以及 Qt 提供的不基于 C++ RTTI 的反射能力。因此,如果你觉得你的类不需要使用信号槽,就不添加这个宏,就是错误的。其它很多操作都会依赖于这个宏。

注意:由于 moc 只处理头文件中的标记了Q_OBJECT的类声明,不会处理 cpp 文件中的类似声明(这个不信的同学私下可以试下去掉Q_OBJECT看信号槽还能正常连接?)。因此,如果我们的类位于 main.cpp 中,是无法得到 moc 的处理的。解决方法是,我们手动调用 moc 工具处理 main.cpp,并且将 main.cpp 中的#include “xxx.h”改为#include “moc_xxx.h”就可以了。不过,这是相当繁琐的步骤,为了避免这样修改,我们还是将其放在头文件中。许多初学者会遇到莫名其妙的错误,一加上Q_OBJECT就出错,很大一部分是因为没有注意到这个宏应该放在头文件中

二、moc_class作用

Qt 将源代码交给标准 C++ 编译器,如 gcc 之前,需要事先将这些扩展的语法去除掉。完成这一操作的就是 moc。

moc 全称是 Meta-Object Compiler,也就是“元对象编译器”。Qt 程序在交由标准编译器编译之前,先要使用 moc 分析 C++ 源文件。如果它发现在一个头文件中包含了宏 Q_OBJECT,则会生成另外一个 C++ 源文件。这个源文件中包含了 Q_OBJECT 宏的实现代码。这个新的文件名字将会是原文件名前面加上 moc_ 构成。这个新的文件同样将进入编译系统,最终被链接到二进制代码中去。因此我们可以知道,这个新的文件不是“替换”掉旧的文件,而是与原文件一起参与编译。另外,我们还可以看出一点,moc 的执行是在预处理器之前。因为预处理器执行之后,Q_OBJECT 宏就不存在了。

在命令行下输入moc yourfilename.h -o moc_youfilename.cpp生成不带Q_OBJENT的源文件

总结起来就是:

moc 就是“元对象编译器”;

Qt程序在交给标准编译器预编译之前要使用 moc 分析 C++ 源文件;

如果有宏 Q_OBJECT,则生成一个包含Q_OBJECT 宏的实现代码的C++源文件;

新生成的源文件参与到标准编译器的编译中;

编译过程中如果找不到对应的moc文件就会出现链接错误,此时要添加上对应的moc文件;

遇到的问题:

1.  error PRJ0019: A tool returned an error code from "Moc'ing treenodepreferencepage.h..." imediago

1)主要是.h文件的属性配置有问题,详细解决方案参见下面链接;

https://jingyan.baidu.com/article/3065b3b68518adbecef8a477.html

有时候简单的修改这个属性还不能起到想要的效果,具体原因以及应对方法等到下周一分解

2)有可能是定义的类没有继承QObject这样的Qt类导致的;

================== End

qmoc文件_Qt中Q_OBJECT与生成的moc文件的作用相关推荐

  1. Qt中Q_OBJECT与生成的moc文件的作用

    一.先来了解Q_OBJECT 只有继承了QObject类的类,才具有信号槽的能力.所以,为了使用信号槽,必须继承QObject.凡是QObject类(不管是直接子类还是间接子类),都应该在第一行代码写 ...

  2. android 生成 资源文件,SVG-Android开源库——SVG生成Vector资源文件的编辑预览工具...

    Vector矢量图在Android项目中的利用愈来愈广泛,但是如果你想用Android Studio自带的工具将SVG图片转化成Vector资源文件却是相当麻烦,首先能支持的SVG规范较少,其次操作流 ...

  3. R语言使用fs包的path_wd函数基于自定义文件路径规则,批量生成多个文件或者文件夹对应的绝对(absolute)文件路径(constructs absolute path)

    R语言使用fs包的path_wd函数基于自定义文件路径规则,批量生成多个文件或者文件夹对应的绝对(absolute)文件路径(constructs an absolute path from the ...

  4. html设置选择多个文件,选取多个连续文件或文件夹 怎样在文件夹中一次选中多个文件?...

    在Windows资源管理器中,选定多个连续文件的操作为 (A) 按住Shift键,单击每一个要选定的文件名 (B) 按住Alt键,单击每一个ctrl键.一,选定单个文件或文件夹:单击该文件或文件夹.二 ...

  5. 【解决方法】因为 'PRIMARY' 文件组已满。请删除不需要的文件、删除文件组中的对象、将其他文件添加到文件组或为文件组中的现有文件启用自动增长,以便增加可用磁盘空间

    文章目录 平台 问题描述 解决问题 1.查看数据库数据文件存放路径 2.查看存放路径的盘是否已满 3.更改数据库设置 平台 sqlserver 2012 问题描述 正常运行的生产系统,今天下午突然发现 ...

  6. java 字符串转pdf文件_java中根据模板生成pdf文件

    原标题:java中根据模板生成pdf文件 阅读目录 简介 业务需求 引入jar包 pdf模板文件与方法参数 代码部分 总结归纳 回到顶部 简介 本文使用java引入apach提供的pdf操作工具生成p ...

  7. Matlab替换A2L文件中的地址生成完整A2L文件的方法小结

    引言 基于模型的开发(MBD)方式在汽车电子嵌入式软件行业中发展迅速.关于其N多好处不去瞎说了,自然有mathwork的工作人员去宣传.基于模型的开发在模型生成代码的过程中,如果软件工程师在matla ...

  8. 利用python读取tomcat中log文件提取出错误日志生成新的文件

    人生苦短,我用python 废话不多说,直接上代码! #!/usr/bin/env python # coding=utf-8 import redef find_error_log(log_name ...

  9. vs生成qt moc文件

    1. 右键需要生成moc文件的头文件 2. 将生产的moc加入工程中

最新文章

  1. 第十六届全国大学生智能车竞赛创意组别-航天智慧物流
  2. FPGA之道(5)MOS管简介
  3. 二维数组按行和按列遍历的效率
  4. uni-app中text文本组件的基本使用
  5. VSCode使用记录三:中文显示乱码、设置字体大小、常用快捷键
  6. NIO server client
  7. Html静态页面更新,解决浏览器缓存不更新问题
  8. 不要只关注马斯克猎鹰,中国SpaceX在哪?商业航天我们不能缺席!
  9. VIOS 磁盘映射简介
  10. 如何构建企业内的 TiDB 自运维体系
  11. 企业级docker安装kong,konga实战
  12. 首都师范大学计算机调剂被拒绝,首都师范大学考研调剂注意事项有哪些?
  13. 基于JavaWeb的表格实例
  14. Bloom泛光后期处理效果
  15. 使用模拟退火算法解决旅行家问题——C
  16. Java SpringBoot发送邮件,自定义发件人昵称/名称
  17. python字符串知识点_python字符串的相关知识点
  18. FTP客户端软件FileZilla使用教程
  19. 光耦合器的定义与概述
  20. ios修改hosts文件后访问网址114导航域名无法解析问题

热门文章

  1. 怎样使用Spring Boot项目的单元测试?
  2. 考个计算机一级要学多久,本科需要考计算机一级吗,大学毕业要求必须考计算机一级,这种情况怎么办?...
  3. oracle怎么设置能使用别的账户存储过程的全向_教你怎么重装100%纯净的Win10系统,告别蓝屏,卡顿。...
  4. spring boot基础教程:入门程序Hello World的编写
  5. Uipath 学习栏目基础教学:10、数据抓取
  6. Uipath 学习栏目基础教学:1Uipath设计器介绍
  7. PyInstaller库的安装、使用
  8. jdk1.8 源码分析导图
  9. VTK:绘制箱形图 BoxChart用法实战
  10. OpenCASCADE绘制测试线束:形状修复命令之一般命令