moc(Meta-Object Compiler):用于处理Qt中关于C++的扩展。
moc工具读取C++头文件,看看这个头文件里面的类是不是包含Q_OBJECT宏,它会将这个头文件,转换为带有meta-object代码的.cpp文件。meta-object依赖信号与槽、RTTI、属性系统。
moc把.h文件生成的.cpp文件是参加编译和链接的。
用法
moc一般用法如下:
class MyClass : public QObject
{
Q_OBJECT
public:
MyClass(QObject *parent = 0);
~MyClass();
signals:
void mySignal();
public slots:
void mySlot();
};
moc通常实例对象属性,如下的例子。Q_PROPERTY()宏声明了一个对象属性,Q_ENUMS()声明了枚举类型,这些都可以在属性系统中使用写个QML界面,C++后端处理的同志们应该对这些不陌生。
如下面这个例子:
class MyClass : public QObject
{
Q_OBJECT
Q_PROPERTY(Priority priority READ priority WRITE setPriority)
Q_ENUMS(Priority)
public:
enum Priority { High, Low, VeryHigh, VeryLow };
MyClass(QObject *parent = 0);
~MyClass();
void setPriority(Priority priority) { m_priority = priority; }
Priority priority() const { return m_priority; }
private:
Priority m_priority;
};
Q_CLASSINFO()宏,可以附加name/value在这个类的meta-object上,如下:
class MyClass : public QObject
{
Q_OBJECT
Q_CLASSINFO("Author", "Oscar Peterson")
Q_CLASSINFO("Status", "Active")
public:
MyClass(QObject *parent = 0);
~MyClass();
};
moc工具将会把mysqlClass.h转换为moc_myclass.cpp。将会参与程序编译的过程。
如何在makefile中添加moc相关代码
官方推荐使用qmake生成makefile。
如果自己创建的makefile下面是包含moc处理的一点小建议:
如果是使用GNUmake,参考下面的代码:
moc_%.cpp: %.h
moc $(DEFINES) $(INCPATH) $< -o $@
简便写法,可以参考下面的代码:
moc_foo.cpp: foo.h
moc $(DEFINES) $(INCPATH) $< -o $@
还需要把moc_foo.cpp加到SOURCES中,以及moc_foo.o和moc_foo.obj在OBJECTS中。
命令选项
这里只提下 -o 后面是文件名
下面是个人对这个moc的用法,主要是修改makefile,非qmake生成makefile
原因是这样的,公司里面好些大佬,都是老一辈的程序员。从0几年都开始用Qt了,当时在linux上使用pro还不是很普及,都喜欢搞makefile文件,这样我们这些新人维护起来就困难了。
moc_%.cpp:%.h
moc %< -o $@
意思是将moc 所有.h -o moc_对应文件名.cpp
$<为匹配%.h,$@为匹配到moc_%.cpp。
这样就不用一个一个对响应的Qt类进行操作了,使用Makefile脚本进行操作。
然后记得添加好其中的.o文件:
.cpp文件会编译成对应的.o文件。
最后make下,可以看到成功解析了Qt类。还自动把moc相关的删除了,挺人性化的
感觉程序员这行不容易啊,每天都是啃文档,知识储备,然后解决问题。
唉!!!