转自:http://www.hellotongtong.com/Qt5base1/qtmocanalysis-intro.html

3.3 手动使用moc分析信号代码


***【免费下载源码和PPT课件】***
***【在线视频课程(csdn)】***
***【在线视频课程(51cto)】***


好文章,来自【福优学苑@音视频+流媒体】


3.3 手动使用moc分析信号代码

编辑源代码

为了查看 moc 生成的文件,我们使用一个很简单的 cpp 来测试:

新建文件夹“E:\awork\qt\__learning\chapter3_1_moc”,

新建文件:test.cpp,代码如下:

class Test : public QObject 

Q_OBJECT 

public: 

 explicit Test(QObject *parent = 0); 

signals: 

public slots: 

}; 

这是一个空白的类,什么都没有实现。


moc处理

然后用moc处理一下:

moc test.cpp -o moc_test.cpp


在经过编译之后,我们会在输出文件夹中找到 moc_test.cpp:

moc_test.cpp


分析moc文件

可以看到,moc_test.cpp 里面为 Test 类增加了很多函数

然而,我们并没有实际写出这些函数,它是怎么加入类的呢?


别忘了,我们还有 Q_OBJECT 这个宏呢!


在 qobjectdefs.h 里面,找到 Q_OBJECT 宏的定义:

这下了解了:正是对 Q_OBJECT 宏的展开,使我们的 Test 类拥有了这些多出来的属性和函数。

注意,QT_TR_FUNCTIONS 这个宏也是在这里定义的。

也就是说,如果你要使用 tr() 国际化,就必须使用 Q_OBJECT 宏,否则是没有 tr() 函数的。


这期间最重要的就是 virtual const QMetaObject *metaObject() const; 函数。

这个函数返回 QMetaObject 元对象类的实例,通过它,你就获得了 Qt 类的反射的能力:

获取本对象的类型之类,而这一切,都不需要 C++ 编译器的 RTTI 支持。



好文章,来自【福优学苑@音视频+流媒体】
***【免费下载源码和PPT课件】***
***【在线视频课程(csdn)】***
***【在线视频课程(51cto)】***