qt-C++笔记之命令行编译程序,特别是使用Q_OBJECT宏包含了moc(Meta-Object Compiler)的情况

qt-C++笔记之命令行编译程序,特别是使用Q_OBJECT宏包含了moc(Meta-Object Compiler)的情况

—— 杭州 2024-01-24

code review!

文章目录

  • qt-C++笔记之命令行编译程序,特别是使用Q_OBJECT宏包含了moc(Meta-Object Compiler)的情况
    • 1.问题现象:qtcreator编译带有Q_OBJECT宏的类需要Meta-Object Compiler (moc)元对象系统支持,qtcreator编译报错:
    • 2.解决方法:不要用qtcreator编译,用命令行编译
    • 3.附:元对象系统简述
      • Q_OBJECT Macro
      • Meta-Object Compiler (moc)
      • 信号和槽
      • 动态属性系统
      • 反射
      • moc的使用

1.问题现象:qtcreator编译带有Q_OBJECT宏的类需要Meta-Object Compiler (moc)元对象系统支持,qtcreator编译报错:

在这里插入图片描述

包含的代码特征:

#include "main.moc" // 如果你使用的是qmake,确保这个文件可以被moc工具找到
class MyTarget : public QObject {
    Q_OBJECT

2.解决方法:不要用qtcreator编译,用命令行编译

问题:直接运行qmake xxx.pro很多情况下也会报错:
在这里插入图片描述

原因:这里qmake可能是默认的qt4,和实际使用的qt5不一致:
在这里插入图片描述

找到qt5路径
在这里插入图片描述

命令行编译:成功!

/usr/lib/qt5/bin/qmake test.pro
make

在这里插入图片描述

3.附:元对象系统简述

Qt的元对象系统是一个非常核心的特性,它为Qt对象提供了一些高级功能,如信号和槽机制、对象属性、对象序列化和反射等。这些功能主要依赖于Q_OBJECT宏和moc(Meta-Object Compiler)。

Q_OBJECT Macro

Q_OBJECT宏位于Qt类定义的私有部分,是Qt对象系统的基础。这个宏必须在任何使用了Qt对象系统的类的定义中出现一次。它声明了几个必要的构造函数和函数,以及一些静态的元对象信息。

在类定义中使用Q_OBJECT宏,例如:

#include <QObject>

class MyClass : public QObject {
    Q_OBJECT

public:
    MyClass(QObject *parent = 0);
    ~MyClass();

signals:
    void mySignal(int someValue);

public slots:
    void mySlot(int someValue);
};

Meta-Object Compiler (moc)

moc是一个由Qt提供的工具,用于处理带有Q_OBJECT宏的类定义。它会读取这些类定义,并生成一个包含元对象信息的C++源文件。这个生成的源文件包含了执行信号和槽机制、动态属性系统等所必需的元数据和标准方法的实现。

信号和槽

信号和槽是Qt中实现对象之间通信的机制。信号是在某个事件发生时由对象发出的消息,而槽则是可以响应特定信号的函数。使用moc,我们可以将信号和槽连接起来,这样当信号被发射时,连接到该信号的槽就会被调用。

动态属性系统

Qt还允许开发者在运行时为对象动态添加属性,并且可以在不修改类定义的情况下查询和设置这些属性的值。这些属性可以通过QObject::setPropertyQObject::property方法访问。

反射

Qt的元对象系统还支持反射,这意味着可以在运行时查询对象的类型信息,比如它是否包含某个信号、槽或者属性。

moc的使用

在使用qmake作为构建工具时,moc的调用通常是自动的。qmake会在构建过程中检查所有的源文件,找出所有包含Q_OBJECT宏的类声明,并为这些类调用moc。生成的文件通常会有一个moc_前缀,并且会自动包含在构建过程中。

当编写一个Qt程序时,你不需要手动运行moc,只需要确保每个使用了Q_OBJECT宏的类都有对应的.cpp文件,并且.pro文件中有相应的条目,qmakemake会处理剩下的工作。

如果你不使用qmake,而是使用如CMake这样的替代构建系统,你需要确保构建脚本配置了对moc的支持,以便自动处理这些步骤。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/346742.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

eNSP学习——交换机配置Trunk接口

目录 原理概述 实验内容 实验目的 实验步骤 实验拓扑 实验编址&#xff1a; 试验步骤 基本配置 创建VLAN&#xff0c;配置Access接口 配置Trunk接口 思考题 原理概述 在以太网中&#xff0c;通过划分VLAN来隔离广播域和增强网络通信的安全性。以太网通常由多台交换机组…

架构师之路(十五)计算机网络(网络层协议)

前置知识&#xff08;了解&#xff09;&#xff1a;计算机基础。 作为架构师&#xff0c;我们所设计的系统很少为单机系统&#xff0c;因此有必要了解计算机和计算机之间是怎么联系的。局域网的集群和混合云的网络有啥区别。系统交互的时候网络会存在什么瓶颈。 ARP协议 地址解…

水雾发生器走过路过不要错过

一、细水雾灭火机理与结构特征如下&#xff1a; 瓦斯输送管道细水雾发生器&#xff0c;是根据细水雾灭火机理及煤矿瓦斯的燃烧特性而进行研制的。其灭火机理&#xff1a; 一是冷却&#xff0c;细水雾颗粒容易气化&#xff0c;大量吸热&#xff0c;迅速降温&#xff0c;终止燃烧…

【JavaWeb】会话管理 cookie session 三大域对象总结

文章目录 会话管理一、Cookie1.1 Cookie的使用1.2 Cookie的时效性1.3 Cookie的提交路径 二、Session2.1 HttpSession的使用2.2 HttpSession时效性 三、三大域对象3.1 域对象概述3.2 域对象的使用 总结 会话管理 HTTP是无状态协议 无状态就是不保存状态,即无状态协议(stateless)…

解决Sublime Text V3.2.2中文乱码问题

目录 中文乱码出现情形通过安装插件来解决乱码问题 中文乱码出现情形 打开一个中文txt文件&#xff0c;显示乱码&#xff0c;在File->Reopen With Encoding里面找不到支持简体中文正常显示的编码选项。 通过安装插件来解决乱码问题 安装Package Control插件 打开Tool->…

【数据结构与算法】栈(Stack)之 浅谈数组和链表实现栈各自的优缺点

文章目录 1.栈介绍2. 哪种结构实现栈会更优&#xff1f;3.栈代码实现&#xff08;C语言&#xff09; 往期相关文章&#xff1a; 线性表之顺序表线性表之链表 1.栈介绍 栈是一种特殊的线性表&#xff0c;只允许在栈顶&#xff08;Top&#xff09;进行插入和删除元素操作&#…

【项目日记(四)】第一层: 线程缓存的具体实现

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:项目日记-高并发内存池⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你做项目   &#x1f51d;&#x1f51d; 开发环境: Visual Studio 2022 项目日…

Unity中URP下获取每一个额外灯数据

文章目录 前言一、我们先来看一下 SimpleLit 中的调用二、获取额外灯索引1、非移动平台2、非GLES平台3、大多数平台 三、获取额外灯数据 前言 在上一篇文章中&#xff0c;我们知道了URP下是怎么获取额外灯数量的。 Unity中URP下获取额外灯数量 在这篇文章中&#xff0c;我们…

场内基金出货是什么意思?出货和洗盘有什么区别?

场内基金出货是股市中常见的一种操作策略&#xff0c;指股市中的投资大户或者机构大量或者批次买入某只股票&#xff0c;并散发利好该股票的消息&#xff0c;导致该股票在短时间内股价升高&#xff0c;从而吸引投资散户购买该股票。等到股价上升到一定的阶段时&#xff0c;庄家…

nextjs中beforePopState使用

在某些情况下&#xff0c;希望监听popstate并在路由器对其进行操作之前执行某些操作。可以使用beforePopState。 在Next.js中&#xff0c;beforePopState是一个可选的生命周期函数&#xff0c;用于在浏览器的历史记录发生更改之前执行一些操作。具体来说&#xff0c;beforePopS…

两千字讲明白java中instanceof关键字的使用!

写在开头 在过往的内容中&#xff0c;我们讲了不少的Java关键字&#xff0c;比如final、static、this、super等等&#xff0c;Java中的关键字非常之多&#xff0c;下图是整理的关键字集合 而我们今天要学习的就是其中的instanceof关键字&#xff01; instanceof的定义 instanc…

k8s安全机制

安全机制&#xff1a;k8s的安全机制&#xff0c;分布式集群管理工具&#xff0c;就是容器编排。 安全机制的核心&#xff1a;API SERVER作为整个集群内部通信的中介&#xff0c;也是外控控制的入口。所有的安全机制都是围绕api server来进行设计&#xff1a; 请求api资源&#…

数据结构·单链表

不可否认的是&#xff0c;前几节我们讲解的顺序表存在一下几点问题&#xff1a; 1. 中间、头部的插入和删除&#xff0c;需要移动一整串数据&#xff0c;时间复杂度O(N) 2. 增容需要申请新空间&#xff0c;拷贝数据&#xff0c;释放旧空间。会有不小的消耗 3. 增容一般是2倍的增…

MySQL安装及可视化工具SQLyog下载

编程如画&#xff0c;我是panda&#xff01; 最近学习Web开发的时候要用到数据库&#xff0c;一开始下载的ZIP版本的&#xff0c;还得修改配置文件&#xff0c;挺麻烦的&#xff0c;后来发现可以直接使用msi版的安装包疯狂next&#xff0c;所以就出一期教程。 前言 MySQL 是一…

链表--104. 二叉树的最大深度/medium 理解度A

104. 二叉树的最大深度 1、题目2、题目分析3、复杂度最优解代码示例4、适用场景 1、题目 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,n…

22款奔驰GLS450升级香氛负离子车载香薰功能

奔驰原厂香氛系统激活原车自带系统&#xff0c;将香气加藏储物盒中&#xff0c;通过系统调节与出风口相结合&#xff0c;再将香味传达至整个车厢&#xff0c;达到净化车厢空气的效果&#xff0c;让整个车厢更加绿色健康&#xff0c;清新淡雅。星骏汇小许Xjh15863 产品功能&…

Vue3+Vite使用Puppeteer进行SEO优化(SSR+Meta)

1. 背景 【笑小枫】https://www.xiaoxiaofeng.com上线啦 资源持续整合中&#xff0c;程序员必备网站&#xff0c;快点前往围观吧~ 我的个人博客【笑小枫】又一次版本大升级&#xff0c;虽然知道没有多少访问量&#xff0c;但我还是整天没事瞎折腾。因为一些功能在Halo上不太好实…

MES管理系统计划排产有哪些重要作用

在当今制造业中&#xff0c;MES管理系统解决方案已经成为提高生产效率、优化资源利用以及提升企业整体运营水平的关键工具。尤其是在生产计划排产这一核心环节&#xff0c;MES管理系统发挥着无可替代的作用。通过精准的计划和调度&#xff0c;MES管理系统帮助企业实现生产过程的…

SAP EXCEL上传如何实现指定读取某一个sheet页(ALSM_EXCEL_TO_INTERNAL_TABLE)

如何读取指定的EXCEL sheet 页签&#xff0c;比如要读取下图中第二个输出sheet页签 具体实现方法如下&#xff1a; 拷贝标准的函数ALSM_EXCEL_TO_INTERNAL_TABLE封装成一个自定义函数ZCALSM_EXCEL_TO_INTERNAL_TABLE 在自定义函数导入参数页签新增一个参数SHEET_NAME 在源代码…

【word密码】Word 文档设置了只读为什么还能编辑?

有些朋友可能会遇到这种疑问&#xff0c;为什么我的Word文档设置了只读模式&#xff0c;还是可以编辑的&#xff0c;这是什么原因呢&#xff1f; 其实是因为大部分的只读模式&#xff0c;设置完成之后都是可以编辑的&#xff0c;但是当我们进行保存的时候就会发现&#xff0c;…