2009-09-02 34 views

回答

110

Qt documentation

元對象編譯器,MOC,是 程序來處理Qt的C++ 擴展。

moc工具讀取C++頭文件。 如果它發現一個或多個包含Q_OBJECT 宏的類 聲明,它會生成包含這些類的元對象代碼 的C++源文件 。其中, 元對象代碼是 信號和插槽機制, 運行時類型信息和 動態屬性系統所必需的。

14

它只是告訴預編譯器這個類有gui元素,需要通過'moc'運行,你只需要將它添加到使用信號/槽機制的類。
但它會在其他任何類中被安靜地忽略 - 它只會增加構建時間。

+0

您在使用信號/插槽機制的類上只需要它也是錯誤的。缺少'Q_OBJECT'會中斷'qobject_cast'和內省。它會導致一些令人困惑的行爲,所以這是一個壞主意。 – 2016-04-07 20:39:27

+0

在任何其他(非'QObject')類中,'Q_OBJECT'都不會被「安靜地」忽略。根據C++標準,它通過聲明幾個從未定義的成員函數和變量來引入未定義的行爲。它還會用'QObject'特定的成員污染你的類的名字空間。例如。一個'Q_OBJECT'可能會破壞一個不相關的類,它恰好包含一個名爲'metaObject'的方法。 – 2016-04-07 20:44:05

7

MOC(元對象編譯器)將Q_OBJECT宏包含的頭文件轉換爲C++等效源代碼。 它基本上控制信號槽機構,並使其可以理解到C++編譯器

+0

這是錯誤的:'Q_OBJECT'宏由編譯器擴展,moc不是必需的。 moc對宏本身並沒有做任何事情,但是它產生了成員變量的**定義**和'Q_OBJECT'宏已聲明**的方法。 – 2016-04-07 20:46:01

1

的Q_OBJECT宏必須出現在類定義,聲明它自己的信號和槽或私人單元,使用由Qt的提供的其他服務元對象系統。

+0

這是誤導性的:'Q_OBJECT'宏必須出現在每個派生自'QObject'的類中。當宏不存在時,你的代碼會被細微的破壞,只是因爲它正好編譯並不能使它正常。 – 2016-04-07 20:47:23

+0

@KubaOber你有沒有編譯代碼的例子,但是當'Q_OBJECT'宏丟失時不工作? – Chris 2017-11-06 17:50:07