您的位置:首页 > 移动开发 > Objective-C

Inside Qt Series (六):元对象编译器 – Meta Object Compiler (moc)

2012-09-10 11:26 357 查看
元对象编译器用来处理Qt 的C++扩展,moc 分析C++源文件,如果它发现在一个头文件(header file)中包含Q_OBJECT 宏定义,然后动态的生成另外一个C++源文件,这个新的源文件包含 Q_OBJECT 的实现代码,这个新的 C++ 源文件也会被编译、链接到这个类的二进制代码中去,因为它也是这个类的完整的一部分。通常,这个新的C++ 源文件会在以前的C++ 源文件名前面加上 moc_ 作为新文件的文件名。

如果使用qmake工具来生成Makefile文件,所有需要使用moc的编译规则都会给自动的包含到Makefile文件中,所以对程序员来说不需要直接的使用moc

除了处理信号和槽之外,moc还处理属性信息,Q_PROPERTY()宏定义类的属性信息,而Q_ENUMS()宏则定义在一个类中的枚举类型列表。 Q_FLAGS()宏定义在一个类中的flag枚举类型列表,Q_CLASSINFO()宏则允许你在一个类的meta信息中插入name/value 对。

由moc所生成的文件必须被编译和链接,就象你自己写的另外一个C++文件一样,否则,在链接的过程中就会失败。

Code example:

class MyClass : public QObject

{

Q_OBJECT

Q_PROPERTY(Priority priority READ priority WRITE setPriority)

Q_ENUMS(Priority)

Q_CLASSINFO("Author", "Oscar Peterson")

Q_CLASSINFO("Status", "Active")

public:

enum Priority { High, Low, VeryHigh, VeryLow };

MyClass(QObject *parent = 0);

virtual ~MyClass();

void setPriority(Priority priority);

Priority priority() const;

};

======================================================================

声明:

《Inside Qt Series》专栏文章是(http://www.qkevin.com)原创技术文章。

本系列专栏文章可随意转载,但必须保留本段声明和每一篇文章的原始地址。

作者保留版权,未经作者同意,不得用于任何商业用途
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: