2016-02-14 130 views
-1

在C++模型中,我有QAbstractListModel派生類叫做Cart,它包含QList<void*>容器。從QML創建C++對象

在QML中,我顯示了一個對象列表。當用戶點擊其中任何一個時,它應該用C++創建該對象並將其添加到cart。它還會設置該對象的一些屬性。

我的問題是我該如何真正以最好的方式做到這一點?

下面是代碼如何將看起來像在C++獨自:

Cart * cart = new Cart; // we have this object already created 
         // which we have exposed to QML as 'qmlcart'. 

// When user clicks apple 
Apple * apple = new Apple(1.99) ; // 1.99 is price 
apple->setType("Red Delicious"); 
cart.add(apple ); 

// When user clicks orange 
Orange * orange = new Orange(0.99) // price 
orange->setType("Valencia") 
cart.add(orange); 

以上是直截了當在C++的世界,但如果點擊是在QML它變得有些複雜。創建和傳遞關於對象的信息的最佳方式是什麼?假設除了價格和類型之外,我們還有更多關於對象的屬性。

是否必須爲我們創建的每種類型的對象都有相應的插槽功能?如果對象具有更復雜的屬性,比如5個不同的屬性,我們是否將所有5個屬性都傳遞給槽功能或者有更好的方法?我們是否應該使用一些工廠設計模式來創建對象?

我在使用QML時缺少的一種特殊功能是使用C++創建的對象的自由。例如,如果它全是C++,那麼我可以創建C++對象並設置它的所有屬性,而不管它有多少個,並且只需將該對象添加到容器。

但是使用QML,儘管我擁有關於對象的所有信息,但是我無法真正創建和配置類,並且無法傳遞給C++,因爲它必須使用C++創建,無法返回,因此所有配置參數也必須傳遞給插槽功能!有沒有更好的方法?

+0

您是否閱讀過官方Qt文檔? [鏈接](http://doc.qt.io/qt-5/qtqml-cppintegration-topic.html) – folibis

回答

0

除非C++對象碰巧是QObject派生類型,註冊爲QML的類型,否則不能直接執行此操作。即使在QML,您可能需要一個組件或QML源包裝創建一個C++對象,例如:

\\Object.qml 
import Object 1.0 
Object {} 

所以,現在你有一個QML源包裝創建C++動態對象。或使用組件:

Component { 
    id: component 
    Object {} 
} 

然而,你可以有一個C++ slotQ_INVOKABLE你可以從QML調用,並執行對象創建那裏。

您可以在QML對象屬性爲好,例如:

Object { 
    someProperty: someValue 
} 

component.createObject(parentObj, {"someProperty" : somevalue}) 

會的工作方式類似於構造 - 所有屬性將對象之前設置被認爲是被運行時「競爭」。

從你的問題看來,你似乎在超越自己 - 在你急於使用QML之前多做一點學習......而且真的不需要那些void * - 這不是C.不要做你的生活更艱難。