`

[转]Moc的三种用法

    博客分类:
  • Qt
 
阅读更多
(原文地址:https://code.google.com/p/qextserialport/wiki/Three_Usage_Of_MOC)
Three_Usage_Of_MOC 
Updated Jan 30, 2013 by dbzhang...@gmail.com
All the developers of Qt should have been familiar with normal usage of MOC.

How to use moc(1)
Consider that we have a Qt project, which contains a subclass of QObject, and the definition of the class is in a header file.
// myclass.h
class MyClass : public QObject
{
Q_OBJECT
public:
     MyClass();
};
When qmake is running, once it find macro Q_OBJECT in header file, it will call moc for us.
moc myclass.h -o moc_myclass.cpp
As moc_myclass.cpp is a compile unit, so qmake will run compiler to compile it, then link the moc_myclass.o(bj) to other part. All of them are transparent for users.
g++ moc_myclass.cpp -o moc_myclass.o
How to use moc(2)
What will happen if the definition of the class located in one .cpp source file?
// main.cpp
class MyClass : public QObject
{
Q_OBJECT
public:
     MyClass(){}
};

int main(int argc, char**argv)
{
...
}
When qmake is running, once it find macro Q_OBJECT in source file, it will call moc for us too.
moc main.cpp -o main.moc
Then what's the difference?
main.moc is not a compile unit any, as it will dependent on the definition of class MyClass.So it can not include the file "main.cpp".
# This will fail ....
g++ main.moc -o main_moc.o
How to solve this?
//Add following line to main.cpp file, after the definition of MyClass
#include "main.moc"
How to use moc(3)
If you have read the source code of qextserialport, you will find that

QextSerialPort defined in the header file qextserialport.h
But qextserialport.cpp contains following line
#include "moc_qextserialport.cpp"
So, when qmake is running, once it find macro Q_OBJECT in header file, it will call moc for us.
moc myclass.h -o moc_myclass.cpp
But, why we include "moc_qextserialport.cpp" manully?
In order to move private data member and private slots to non-public files, d-pointer and Q_PRIVATE_SLOT are used.

So the generated moc_qextserialport.cpp is dependent on non-public files will make it can not be compiled as a compile unit.

# This doesn't work any more ;-)
g++ moc_qextserialport.cpp -o moc_qextserialport.o
why both moc_xxx.cpp and xxx.moc exist?
In same cases, both myclass.h and myclass.cpp may have Q_OBJECT

// myclass.h
class MyClass : public QObject
{
Q_OBJECT
public:
     MyClass();
};
// myclass.cpp
class MyClassHelper : public QObject
{
Q_OBJECT
public:
     MyClassHelper();
};

MyClass::MyClass()
{
}
...
In such cases, moc will generated two files for us

moc myclass.h -o moc_myclass.cpp
moc myclass.cpp -o myclass.moc
分享到:
评论

相关推荐

    过零触发双硅输出光耦-MOC3061的应用.pdf

    MOC3061 是一种过零触发双硅输出光耦,由 MOTOROLA 公司生产,广泛应用于触发晶闸管。该器件具有价格低廉、触发电路简单可靠的特点。 内部结构及主要性能参数: MOC3061 采用双列直插 6 脚封装。其主要性能参数为:...

    nozzle of MOC

    MOC是一种解决偏微分方程,特别是流体动力学中如连续性方程、动量方程和能量方程的方法。在喷嘴设计中,这一技术用于精确地模拟流体流动,特别是在高速或超音速流动条件下,如火箭发动机或喷气飞机的喷嘴设计。 MOC...

    中文moc3061_光电双向可控硅资料

    MOC3061是一种光耦合器,用于电气隔离和信号传输,特别是在高压或高噪声环境中,它的优势尤为明显。MOC3061内部集成了一个发光二极管(LED)和一个光敏双向可控硅,这使得它能够在电气上隔离两个电路的同时,通过光...

    Moc.zip_moc_moc4455_喷管 JAVA

    "MOC"通常代表"Method of Characteristics",这是一种解决偏微分方程,特别是流体力学中的超音速流动问题的数值方法。Moc4455可能是这个特定实现的版本号或者项目标识。 在描述中,"使用特征方法进行流过喷管的超...

    moc.rar_moc_泡沫_泡沫驱

    文件“moc.m”是使用MATLAB编写的MOC算法实现代码,通过这个代码,我们可以进一步理解MOC方法在泡沫驱替模拟中的具体操作和计算流程。通过运行和分析代码,不仅可以验证理论的理解,还可以为实际油藏模拟提供参考。 ...

    Qt MOC处理器 UML图

    ### Qt MOC 处理器 UML 图解析 ...以上内容详细描述了 Qt MOC 处理器 UML 图中涉及的主要元素和它们的属性与方法。这些元素和结构共同构成了 Qt MOC 的内部架构,有助于开发者深入了解 MOC 如何处理和生成元数据。

    dsoframer_MOC041mht_DEMO_leavec2t_DsoFramer_

    1. **动态链接库(DLL)嵌入**:`DsoFramer`允许开发者将DLL功能集成到他们的应用程序中,提供了一种方便的方式来使用外部代码,减少内存占用,提高代码重用。 2. **COM对象交互**:`DsoFramer`支持COM对象,这意味...

    元器件应用中的MOC系列MOC8106TV集成电路实用检测数据

    使用MF14型三用表(多功能电表)在DC挡进行检测,可以获取MOC8106TV的工作电压等关键参数。这些数据对于判断器件是否正常工作至关重要。具体检测数据通常包括输入电压、输出电流、光耦合效率等。在索尼CPD-200GS型...

    ZIELKE1_flow_摩阻_特征线法moc_特征线法_压力流量_

    特征线法,也称为MOC(Method of Characteristics),是一种在流体力学中广泛使用的数值方法,主要用于求解一维非稳态流动问题,包括管道中的压力和流量问题。本主题聚焦于如何应用特征线法来解决包含动态摩阻的管道...

    GPU加速MOC输运计算性能分析研究.pdf

    MOC方法是一种高效的中子输运方程求解手段,它通过将三维问题转化为多维问题来处理。这种方法在堆芯物理数值计算中尤为关键,但其计算过程中包含大量的数值积分和矩阵运算,导致计算量庞大,传统CPU难以满足日益增长...

    MOC_1300m_20dgree_70dgree_管道流MATLAB_管道计算_matlab_

    标题"MOC_1300m_20dgree_70dgree_管道流MATLAB_管道计算_matlab_"表明这是一个使用MATLAB编程环境进行的管道流动模拟项目,其中"1300m"可能代表管道的长度,"20dgree"和"70dgree"可能是温度条件,可能涉及不同温度下...

    最小长度喷嘴设计使用特性方法:使用MOC设计最小长度2d钟形喷嘴-matlab开发

    在本项目中,我们探讨了如何使用特性方法(Method of Characteristics, MOC)来设计一个二维平面的最小长度钟形喷嘴。Matlab作为一种强大的数值计算工具,被用来实现这一复杂的设计过程。以下是对该主题的详细解释:...

    基于CPU-GPU异构并行的MOC中子输运计算并行效率优化研究.pdf

    MOC方法是一种广泛应用于核反应堆设计、安全分析及性能评估的数值计算技术,它通过随机漫步模拟中子在材料中的传输过程。 首先,CPU-GPU异构并行计算的基本原理是将计算任务分配到两种不同类型的处理器上。CPU擅长...

    MOC7033A: SQL Server 2005 for Oracle DBA

    - **恢复模式**:介绍了三种不同的恢复模式(简单、完整、大容量日志记录)及其适用场景。 - **灾难恢复计划**:指导如何制定有效的灾难恢复计划以确保业务连续性。 ### 模块7:基本管理 - **服务器安装**:讲解了...

    moc.v1.0.rc1.2009.05.03.src.zip_Ogre_ Ogre

    这个名为"moc.v1.0.rc1.2009.05.03.src.zip"的压缩包,包含了用于Ogre引擎的碰撞检测工具,旨在简化开发者的操作,提供了一种高效的小型引擎组件。 该压缩包中的核心文件是"CollisionTools.cpp"和"CollisionTools.h...

    Microsoft Moc 2555 - windows applications using c#.rar

    【标题】"Microsoft MOC 2555 - Windows Applications Using C#" 这门课程主要聚焦于使用C#编程语言开发Windows应用程序。MOC(Microsoft Official Curriculum)是微软官方提供的培训课程,旨在帮助开发者深入理解...

    双向可控硅控制文档

    正确的方法是将MOC3061放置在G极与T2之间,这样当控制信号使G极与T2之间产生电压差时,可控硅才会导通。 MOC3061推荐的电路图显示,G极是从T1引出,光耦合器位于G极与T2之间。理解这一点至关重要,因为它揭示了G极...

    Qt中第三方日志库qslog的基本配置和使用详解示例程序

    本文将重点介绍Qt中的第三方日志库qslog的配置和使用方法,以帮助开发者更好地理解和应用到实际项目中。 首先,qslog是一个轻量级的日志库,它为Qt应用程序提供了丰富的日志记录功能,支持多种输出方式,如控制台...

    担载型MoC催化剂的制备和催化剂加氢转化反应性能研究_学年论文.docx

    《担载型MoC催化剂的制备和催化剂加氢转化反应性能研究》这篇学年论文主要探讨了二氧化碳的处理和转化技术,特别是通过担载型MoC催化剂进行加氢转化制备甲醇的过程。二氧化碳作为一种温室气体,其排放量的增长对全球...

Global site tag (gtag.js) - Google Analytics