Qt文档阅读笔记-moc工具使用及其理论(moc工具如何添加到makefile中)
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_OBJECTQ_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_OBJECTQ_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: %.hmoc $(DEFINES) $(INCPATH) $< -o $@簡便寫法,可以參考下面的代碼:
moc_foo.cpp: foo.hmoc $(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:%.hmoc %< -o $@意思是將moc 所有.h -o moc_對應文件名.cpp
$<為匹配%.h,$@為匹配到moc_%.cpp。
這樣就不用一個一個對響應的Qt類進行操作了,使用Makefile腳本進行操作。
然后記得添加好其中的.o文件:
.cpp文件會編譯成對應的.o文件。
最后make下,可以看到成功解析了Qt類。還自動把moc相關的刪除了,挺人性化的
感覺程序員這行不容易啊,每天都是啃文檔,知識儲備,然后解決問題。
唉!!!
總結
以上是生活随笔為你收集整理的Qt文档阅读笔记-moc工具使用及其理论(moc工具如何添加到makefile中)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt笔记-QTcpSocket跨线程调用
- 下一篇: Linux笔记-rpm与yum的基本概念