我剛開始使用Qt,並注意到所有示例類定義都以宏Q_OBJECT
作爲第一行。這個預處理器宏的目的是什麼?Q_OBJECT宏是做什麼的?爲什麼所有的Qt對象都需要這個宏?
回答
元對象編譯器,MOC,是 程序來處理Qt的C++ 擴展。
moc工具讀取C++頭文件。 如果它發現一個或多個包含Q_OBJECT 宏的類 聲明,它會生成包含這些類的元對象代碼 的C++源文件 。其中, 元對象代碼是 信號和插槽機制, 運行時類型信息和 動態屬性系統所必需的。
它只是告訴預編譯器這個類有gui元素,需要通過'moc'運行,你只需要將它添加到使用信號/槽機制的類。
但它會在其他任何類中被安靜地忽略 - 它只會增加構建時間。
您在使用信號/插槽機制的類上只需要它也是錯誤的。缺少'Q_OBJECT'會中斷'qobject_cast'和內省。它會導致一些令人困惑的行爲,所以這是一個壞主意。 – 2016-04-07 20:39:27
在任何其他(非'QObject')類中,'Q_OBJECT'都不會被「安靜地」忽略。根據C++標準,它通過聲明幾個從未定義的成員函數和變量來引入未定義的行爲。它還會用'QObject'特定的成員污染你的類的名字空間。例如。一個'Q_OBJECT'可能會破壞一個不相關的類,它恰好包含一個名爲'metaObject'的方法。 – 2016-04-07 20:44:05
MOC(元對象編譯器)將Q_OBJECT宏包含的頭文件轉換爲C++等效源代碼。 它基本上控制信號槽機構,並使其可以理解到C++編譯器
這是錯誤的:'Q_OBJECT'宏由編譯器擴展,moc不是必需的。 moc對宏本身並沒有做任何事情,但是它產生了成員變量的**定義**和'Q_OBJECT'宏已聲明**的方法。 – 2016-04-07 20:46:01
的Q_OBJECT宏必須出現在類定義,聲明它自己的信號和槽或私人單元,使用由Qt的提供的其他服務元對象系統。
這是誤導性的:'Q_OBJECT'宏必須出現在每個派生自'QObject'的類中。當宏不存在時,你的代碼會被細微的破壞,只是因爲它正好編譯並不能使它正常。 – 2016-04-07 20:47:23
@KubaOber你有沒有編譯代碼的例子,但是當'Q_OBJECT'宏丟失時不工作? – Chris 2017-11-06 17:50:07
- 1. 爲什麼Q_OBJECT宏導致問題(Qt)?
- 2. 什麼Q_D宏做的Qt
- 3. 這個C++宏是做什麼的?
- 4. 這個宏是做什麼的?
- 5. Qt-Q_OBJECT和宏
- 6. CV_SWAP宏是做什麼的?
- 7. do_is_drive_letter宏是做什麼的?
- 8. 這些宏做什麼(LLVM)?
- 9. Excel宏沒有做什麼?
- 10. 爲什麼這個級聯宏需要一個間接級別?
- 11. 爲什麼這個PP_ARG_COUNT宏需要一個PP_EXPAND?
- 12. 爲什麼需要嵌套宏?
- 13. 這個rsAssert宏的含義是什麼?
- 14. __NSX_PASTE__定義一個宏需要什麼?
- 15. 什麼是宏?
- 16. 爲什麼在這個宏定義中需要@符號?
- 17. 這個Julia宏爲什麼不需要`esc`?
- 18. ReactiveCocoa:rac_keywordify宏。爲什麼rac_keywordify實際上需要什麼?
- 19. 這個C宏是什麼意思?
- 20. 這個宏函數是什麼意思?
- 21. 這個C宏是什麼意思?
- 22. 這個宏是做什麼的? __success(返回> = 0)長
- 23. 這個單行宏函數'static_assert'是做什麼的?
- 24. 這個宏爲什麼複製多次?
- 25. 爲什麼使用這個宏?
- 26. 宏在MASM32中做什麼?
- 27. 這個宏有什麼問題?
- 28. 這2個宏有什麼區別?
- 29. 這個宏有什麼問題?
- 30. 這個run_on_main()宏有什麼問題嗎?
QT是指QuickTime,Qt是指稱爲Qt的C++庫。 – Bleadof 2009-09-03 19:43:16