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

这篇具有很好参考价值的文章主要介绍了qt-C++笔记之命令行编译程序,特别是使用Q_OBJECT宏包含了moc(Meta-Object Compiler)的情况。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

—— 杭州 2024-01-24

code review!

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

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

包含的代码特征:

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

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

问题:直接运行qmake xxx.pro很多情况下也会报错:
qt-C++笔记之命令行编译程序,特别是使用Q_OBJECT宏包含了moc(Meta-Object Compiler)的情况,qt-C++语法笔记,qt,c++,笔记

原因:这里qmake可能是默认的qt4,和实际使用的qt5不一致:
qt-C++笔记之命令行编译程序,特别是使用Q_OBJECT宏包含了moc(Meta-Object Compiler)的情况,qt-C++语法笔记,qt,c++,笔记

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

命令行编译:成功!

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

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

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的支持,以便自动处理这些步骤。

4.什么时候不需要Q_OBJECT宏以及#include “main.moc”?

Q_OBJECT 宏在Qt C++开发中通常用于以下几个方面:

  1. 声明槽(slots):为了能在类中使用槽,你需要在类定义中包含 Q_OBJECT 宏。
  2. 使用信号(signals):如果你想声明和定义信号,你需要在类定义中包含 Q_OBJECT 宏。
  3. 使用Qt的元对象系统:包括使用 qobject_cast,以及动态属性、属性系统等。
  4. 国际化(i18n):如果想使用 tr() 函数来翻译你的应用程序,你需要包含 Q_OBJECT 宏。

如果你的类不需要使用上述功能,那么你的类不需要包含 Q_OBJECT 宏。例如:

  • 简单的数据类(POD,plain-old-data)。
  • 只是作为命名空间的类,不含成员函数。
  • 只包含静态成员函数的类。
  • 模板类(因为Qt的元对象系统不支持模板类)。

使用 #include "main.moc" 或者类似的包含 .moc 文件的情况,通常出现在以下两种情况:

  1. 当你在.cpp源文件中定义了一个Q_OBJECT宏的类时。
  2. 当你手动调用 moc 命令来处理一个头文件,并将生成的源文件包含到你的项目中时。

如果你没有在 .cpp 文件中定义 Q_OBJECT 宏的类,并且没有手动使用 moc,那么你不需要包含 .moc 文件。通常,在用 qmakeCMake 等构建系统生成的项目中,.moc 文件会自动被处理和包含,不需要你手动包含。文章来源地址https://www.toymoban.com/news/detail-823423.html

到了这里,关于qt-C++笔记之命令行编译程序,特别是使用Q_OBJECT宏包含了moc(Meta-Object Compiler)的情况的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 3:Ubuntu上配置QT交叉编译环境并编译QT程序到Jetson Orin Nano(ARM)

       GCC配置同上   最后配置Kits 上面设置完成之后 ,设置Kits 中的Device(这是为了能够直接把项目部署到arm设备上)      点击NEXT之后会出现连接被拒绝,不用担心 ,下面会对其设置密码。 验证arm设置的密码。                 代码: 此代码是抄的别人的,具体是哪位博主的

    2024年02月11日
    浏览(44)
  • 【Java可执行命令】(四)反编译工具javap:深入解析应用程序反编译工具javap ~

    javap 是Java开发工具包(JDK)提供的一个命令行工具,用于反编译Java字节码。它旨在帮助开发人员深入了解和分析已编译的Java类文件。 javap 可以将Java类文件解析为易于阅读的文本形式,展示其中的信息以及反编译出类的结构、方法、字段、常量池等信息 。通过阅读和分析这

    2024年02月10日
    浏览(41)
  • 【微信小程序】HBuilderX新建微信小程序编译报错,提示工具的服务端口已关闭。要使用命令行调用工具,请在下方输入 y 以确认开启,或手动打开工具 -> 设置 -> 安全设置,将服务端口开启。

    今天初学uniapp框架,想尝试开发一个微信小程序,用HBuilderX新建了一个空白的模板程序,编译运行后报错如下: [微信小程序开发者工具] [error] IDE service port disabled. To use CLI Call, please enter y to confirm enabling CLI capability, or manually open IDE - Settings - Security Settings, and set Service Port On

    2024年02月11日
    浏览(37)
  • (NDK编译)详解使用Android.mk编译的C/C++程序过程

    想要在 Android设备 上运行 C/C++程序 可执行文件,可采用一个方法就是使用 NDK编译 ,很多时候要比 gcc编译 更适合,这里我采用的是 imx6q开发板 上面装载了自己编写的Android6.0.1镜像,在 Ubuntu64位 系统上采用NDK编译。 目录 1.准备文件 2.编写Android.mk 注意 完整Android.mk代码 3.NDK编

    2024年02月05日
    浏览(44)
  • 使用mac终端编译运行c程序

    本文介绍如何利用mac自带文本编辑软件编写c代码,并在mac自带终端内用命令行编译运行c程序。 1.在mac上安装c编译环境 打开mac自带的 终端 在终端命令行里输入 xcode-select --install 命令然后回车。 如果未安装c编译环境,会自动弹出窗口引导安装; 如果已安装编译环境,终端窗

    2024年02月11日
    浏览(43)
  • 使用CMake交叉编译Arm Linux程序

    注意,工具链文件的指定一定要紧跟cmake命令之后,不能放到 … 后面构建arm架构cmake 工程里新建一个文件叫arm_linux_setup.cmake arm_linux_setup.cmake内容如下

    2024年02月03日
    浏览(53)
  • 微信小程序中使用SCSS编译WXSS

    旧版本的微信小程序是需要导入sass,新版本直接使用配置 !!!!!!!建议二选一去使用,防止冲突目前我使用的是旧版本的配置Sass!!!!!!!!!! 新版本开发者工具中的隐式设置可直接编译插件配置,在project.config.json加入以下代码即可编译SASS(参考项目配置文件 | 微信开放文档) 目前支

    2024年04月16日
    浏览(50)
  • 第1关:使用C/C++语言编写PL/0编译程序的词法分析程序

    任务描述 使用C/C++语言编写PL/0编译程序的词法分析程序。需要注意的点: (1)识别非法字符:如 @ 、 和 ! 等; (2)识别非法单词:数字开头的数字字母组合; (3)标识符和无符号整数的长度不超过8位; (4)能自动识别并忽略/* */及//格式的注释信息; (5)词法分析过

    2024年02月09日
    浏览(46)
  • 微信小程序如何使用scss编译wxss文件

    微信小程序开发者工具集成了 vscode 编辑器,可以使用 vscode 中众多的插件,为我们开发微信小程序提供了极大的便利。我们可以借助 easysass 插件实现在微信开发中使用 sass,安装步骤如下。 1.在 vscode 中搜索 easysass 插件并安装 2.导入已安装的vscode扩展 微信开发者工具 视图

    2024年02月08日
    浏览(62)
  • 微信小程序反编译简易教程与wxappUnpacker使用

    方便微信小程序开发者,对前端思路的学习。所以必须学会小程序反编译技能。用到了2个工具 《解密》与《逆向》 下载地址:https://share.weiyun.com/uMqNGOXv 目前用的是 wxappUnpacker 这个之前可以在github下载的,不过截止今天,已经不能下载。你们可以通过你们自己渠道获取 这里

    2024年02月03日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包