Qt 將源代碼交給標準 C++ 編譯器,如 gcc 以前,須要事先將這些擴展的語法去除掉。完成這一操做的就是 moc。html
moc 全稱是 Meta-Object Compiler,也就是「元對象編譯器」。Qt 程序在交由標準編譯器編譯以前,先要使用 moc 分析 C++ 源文件。若是它發如今一個頭文件中包含了宏 Q_OBJECT,則會生成另一個 C++ 源文件。這個源文件中包含了 Q_OBJECT 宏的實現代碼。這個新的文件名字將會是原文件名前面加上 moc_ 構成。這個新的文件一樣將進入編譯系統,最終被連接到二進制代碼中去。所以咱們能夠知道,這個新的文件不是「替換」掉舊的文件,而是與原文件一塊兒參與編譯。另外,咱們還能夠看出一點,moc 的執行是在預處理器以前。由於預處理器執行以後,Q_OBJECT 宏就不存在了。node
在命令行下輸入moc yourfilename.h -o moc_youfilename.cpp生成不帶Q_OBJENT的源文件。命令行
總結起來就是:code
1.moc 就是「元對象編譯器」;htm
2.Qt程序在交給標準編譯器預編譯以前要使用 moc 分析 C++ 源文件;對象
3.若是有宏 Q_OBJECT,則生成一個包含Q_OBJECT 宏的實現代碼的C++源文件;繼承
4.新生成的源文件參與到標準編譯器的編譯中;編譯器
5.編譯過程當中若是找不到對應的moc文件就會出現連接錯誤,此時要添加上對應的moc文件;編譯
遇到的問題:gcc
1. error PRJ0019: A tool returned an error code from "Moc'ing treenodepreferencepage.h..." imediago
1)主要是.h文件的屬性配置有問題,詳細解決方案參見下面連接;
https://jingyan.baidu.com/article/3065b3b68518adbecef8a477.html
有時候簡單的修改這個屬性還不能起到想要的效果,具體緣由以及應對方法等到下週一分解
2)有多是定義的類沒有繼承QObject這樣的Qt類致使的;