我有一個班,我用Q_PROPERTY
來創建屬性。我還在我的課堂定義開始時定義了Q_OBJECT
。然而,我沒有繼承QObject
,因爲這使得這個類是不可複製的,這給了我編譯錯誤的地方。我真的需要繼承QObject
以使Q_PROPERTY
正常工作嗎?在那種情況下 - 我能以某種方式解決不可複製的問題嗎?Qt Q_PROPERTY是否需要我的類繼承QObject?
回答
確實Qt的Q_PROPERTY需要我的類繼承QObject的?
簡單的答案是:如果你使用Q_OBJECT那麼是的,如果你使用Q_GADGET那麼沒有。
要提供Q_PROPERTY(作爲QML中的屬性)或Q_INVOKABLE(QML中的可調用方法),您需要能夠處理反射的對象。它可以通過Q_OBJECT(其要求QObject作爲父類)或Q_GADGET(其不要求QObject作爲父類)來實現。
http://doc.qt.io/qt-5/qobject.html#Q_GADGET
Q_GADGET
的Q_GADGET宏是Q_OBJECT宏對 類不繼承自QObject,但仍希望使用一些 通過QMetaObject提供的反射能力的輕型版本。就像 的Q_OBJECT宏一樣,它必須出現在類 定義的私有部分。
Q_GADGETs可以具有Q_ENUM,Q_PROPERTY和Q_INVOKABLE,但它們不能 具有信號或槽
Q_GADGET使一個類的成員,staticMetaObject,可用。 staticMetaObject的類型爲QMetaObject,並提供對使用Q_ENUMS聲明的 枚舉的訪問。
我想如果你已經有父對象Q_OBJECT的QObject然後Q_GADGET對於其他情況需要反射。
我沒有閱讀上面的評論。 – AlexanderVX
除繼承QObject和放置Q_OBJECT宏之外,是否還有其他要求?當我嘗試使用一個屬性時,我仍然收到「沒有成員命名」錯誤。 –
然後請分享代碼。從QObject繼承,添加Q_OBJECT宏。添加Q_PROPERTY宏。添加READ和/或WRITE屬性C++方法。請注意,這應該轉到頭文件,並且如果在.cpp實現文件中這樣做,預處理器(MOC編譯器)將無法生成生成的代碼。 – AlexanderVX
爲了能夠使用的信號,你需要聲明Q_OBJECT宏,你可以在文檔中找到:
的Q_OBJECT宏必須出現在聲明自己的信號類定義的私有部分,插槽或使用由Qt的元對象系統提供的其他服務的插槽。
而對於Q_PROPERTY:
這個宏用於繼承QObject的類聲明的屬性。
所以你可以看到你需要從QObject的
繼承你的問題忽略了樹木的森林:你爲什麼需要QObject
是可複製的? QObject
是一個組合,可以容納任意數量的子對象。通常不需要將QObject
實例放入集合中,因爲QObject
已經充當對象集合。
例如:
// Wrong, won't compile
QList<QObject> objects;
// OK, leverage the compositeness of QObject
QObject objects;
(new QObject(&objects))->setObjectName("obj1");
(new QObject(&objects))->setObjectName("obj2");
for (auto obj : objects.children()) qDebug() << obj->objectName();
// OK, use C++11 collections
std::list<QObject> objects;
objects.emplace_back();
objects.emplace_back();
objects.front().setObjectName("obj1");
objects.back().setObjectName("obj2");
for (const QObject & obj : objects) qDebug() << obj.objectName();
如果你真的需要複製QObject
,可以certainly do so,但它是相當沒有意義的,如果你不還複製它的孩子,性能等,只有你能確定是什麼語義將對象副本需要。在很多情況下,我會考慮一個可複製的對象是一個醜陋的黑客。
- 1. QObject多繼承
- 2. QObject派生類型是否需要父QObject?
- 3. 來自QObject的QT pimpl繼承
- 4. 是否需要顯式繼承對象?
- 5. Python是否需要繼承鏈中所有類的知識?
- 6. 與QObject的多繼承
- 7. 爲什麼QObject需要成爲多繼承情況下的第一個
- 8. Qt - 派生類是否繼承其基類的元屬性?
- 9. 我是否需要跨多個表繼承外鍵?
- 10. 破壞從QObject繼承的類的對象
- 11. .Net中的類型轉發:轉發的類是否需要繼承Type類?
- 12. QT 4.3是否強迫您繼承QThread?
- 13. Qt「信號未定義的參考錯誤」從QObject繼承後
- 14. 繼承的類是否繼承嵌套的類?
- 15. 更改鼠標光標在一個QObject - 繼承的QGraphicsItem類
- 16. 如何列出在Qt中從QObject繼承的類的所有成員變量?
- 17. 如何從Qt類繼承?
- 18. 在繼承期間,基類的基類是否也被繼承?
- 19. 從Java類繼承的Kotlin類是否也從Any繼承?
- 20. 需要幫助使用C++類繼承
- 21. NHibernate繼承類,但不需要堅持
- 22. 我可以在從QObject繼承的同時使用QSharedData嗎?
- 23. Qt - 繼承基類中的類
- 24. Qt XML繼承
- 25. QObject繼承不明確的基地
- 26. NoneType類是否繼承對象類?
- 27. 需要繼承幫助
- 28. 繼承 - 需要指導
- 29. node.js需要繼承嗎?
- 30. 注入春天具體類是需要繼承的框架型
不,您不需要從'QObject'繼承。使用'Q_GADGET':http://doc.qt.io/qt-5/qobject.html#Q_GADGET –
@RA。我也需要這些信號,是否有辦法繞過不可複製的問題? –
在這種情況下,您將需要從'QObject'繼承,並且將不會有任何方法繞過不可複製的問題。 –