2015-07-21 144 views
0

我有一個班,我用Q_PROPERTY來創建屬性。我還在我的課堂定義開始時定義了Q_OBJECT。然而,我沒有繼承QObject,因爲這使得這個類是不可複製的,這給了我編譯錯誤的地方。我真的需要繼承QObject以使Q_PROPERTY正常工作嗎?在那種情況下 - 我能以某種方式解決不可複製的問題嗎?Qt Q_PROPERTY是否需要我的類繼承QObject?

+2

不,您不需要從'QObject'繼承。使用'Q_GADGET':http://doc.qt.io/qt-5/qobject.html#Q_GADGET –

+0

@RA。我也需要這些信號,是否有辦法繞過不可複製的問題? –

+2

在這種情況下,您將需要從'QObject'繼承,並且將不會有任何方法繞過不可複製的問題。 –

回答

4

確實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對於其他情況需要反射。

+0

我沒有閱讀上面的評論。 – AlexanderVX

+0

除繼承QObject和放置Q_OBJECT宏之外,是否還有其他要求?當我嘗試使用一個屬性時,我仍然收到「沒有成員命名」錯誤。 –

+0

然後請分享代碼。從QObject繼承,添加Q_OBJECT宏。添加Q_PROPERTY宏。添加READ和/或WRITE屬性C++方法。請注意,這應該轉到頭文件,並且如果在.cpp實現文件中這樣做,預處理器(MOC編譯器)將無法生成生成的代碼。 – AlexanderVX

0

爲了能夠使用的信號,你需要聲明Q_OBJECT宏,你可以在文檔中找到:

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

而對於Q_PROPERTY:

這個宏用於繼承QObject的類聲明的屬性。

所以你可以看到你需要從QObject的

繼承
0

你的問題忽略了樹木的森林:你爲什麼需要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,但它是相當沒有意義的,如果你不還複製它的孩子,性能等,只有你能確定是什麼語義將對象副本需要。在很多情況下,我會考慮一個可複製的對象是一個醜陋的黑客。