博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Qt文档阅读笔记-moc工具使用及其理论(moc工具如何添加到makefile中)
阅读量:1950 次
发布时间:2019-04-27

本文共 1900 字,大约阅读时间需要 6 分钟。

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_OBJECTpublic:    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文件,这样我们这些新人维护起来就困难了。
在此阅读了下Qtmoc相关的文档,已对makefile进行了成功修改,在此记录下:
这里关于Qt的环境变量都是设置好的,在此不再介绍
在makefile文件中添加:
moc_%.cpp:%.h	moc %< -o $@

意思是将moc 所有.h -o moc_对应文件名.cpp

$<为匹配%.h,$@为匹配到moc_%.cpp。

这样就不用一个一个对响应的Qt类进行操作了,使用Makefile脚本进行操作。

然后记得添加好其中的.o文件:

.cpp文件会编译成对应的.o文件。

最后make下,可以看到成功解析了Qt类。还自动把moc相关的删除了,挺人性化的

感觉程序员这行不容易啊,每天都是啃文档,知识储备,然后解决问题。

唉!!!

转载地址:http://jnmif.baihongyu.com/

你可能感兴趣的文章
Eclipse安装lombok插件
查看>>
Spring获取Bean工具类
查看>>
Quartz表达式校验方法
查看>>
Spring boot中的注解@ConditionalOnProperty
查看>>
Java日期工具类收藏
查看>>
checkbox制作开关样式
查看>>
自定义滚动条文档(mCustomScrollbar使用文档)
查看>>
Bootstrap下拉框事件
查看>>
ajax-object.js(Ajax调用的封装)
查看>>
Bootstrap-table的封装
查看>>
Jquery sparkline学习入门
查看>>
docker network相关知识
查看>>
docker registry的使用
查看>>
docker安装gitlab
查看>>
docker安装Jenkins
查看>>
docker安装的jenkins进行升级
查看>>
Jenkins配置Publish over SSH
查看>>
javascript知识点
查看>>
Dojo学习笔记
查看>>
pdf生成水印
查看>>