2014-01-14 65 views
3

我想讓一個類暴露一個QObject派生類(具有它自己的qt屬性)qt屬性我可以在qml中使用的集合(或幾個)。一個對象擁有一個QObject派生類的集合的正確方法是什麼?

根據http://qt-project.org/doc/qt-5.0/qtcore/qobject.html#no-copy-constructor-or-assignment-operator qt與複製構造函數不兼容。

所以我用QList<QObject derived class>(我的第一個想法)我無法通過引用來傳遞列表(或者至少我認爲這就是編譯器錯誤所暗示的)(需要副本),並且很難弄清楚如何添加項目到名單。

我應該使用QList<QObject derived class *>還是QList<SomeQTSmartPointer<QObject derived class>>或其他?

回答

2

我應該使用QList<QObject derived class *>QList<SomeQTSmartPointer<QObject derived class>>還是別的?

兩者都很好,但最好通過Qt父/子機制堅持前者。這將是在一般管理它的最Qt'ish方式:

QList<MyClass*> list; 
list.append(new MyClass(parent); 

你也可以使用Qt智能指針像QPointer,QScopedPointer或QSharedPointer如下:

QList<QShardPointer<MyClass> > list; 
// Being explicit to be more comprehensive, but it is not necessary 
list.append(QSharedPointer<MyClass>(new MyClass()); 

這將既合作pre C++ 11和post。

+0

只要確保你沒有做QSharedPointer (新的MyClass(父)),或者你會得到一個雙刪除。 –

2

那麼,QList<Derived*>QList<std::unique_ptr<Derived>>都可以。如果您在使用Qt默認的垃圾收集器(與親子樹)你可以使用:

QList<Derived*> list; 
list.push_back(new Other(parent, ...)); 

否則你應該使用第二個:

QList<std::unique_ptr<Derived>> list; 
list.push_back(new Other(...)); 
+0

也可以使用'QList >'。 –

+0

「應該注意的是,在第一種情況下,它應該讀新的其他(父)」 - >不一定。它取決於派生類的構造函數定義。 「也可以使用QList >」 - >是的,還有QSharedPointer,QPointer等...... – lpapp

+0

Jeffrey,我的關注點是用你的答案,它形成了朝向C++ 11(獨特的指針,推返回而不是追加,而>>也是,沒有空間),而不是Qt解決方案的前C++ 11和後Qt應該工作。我不會低估,因爲我認爲這兩種方式對讀者都有用。希望,你不介意我的回答。 :) – lpapp

相關問題