2012-08-05 70 views
3

我想從Qt文檔 (您可以在http://qt-project.org/doc/qt-4.8/declarative-modelviews-objectlistmodel.html上獲取它)擴展名爲「Object ListModel示例」的示例。使用QML更改C++模型

我想添加一個簡單的GUI功能:一個菜單項,用於更改模型中第一個數據項的內容 (即名稱)。這樣的事情:

MenuItem { 
    text: "Item 123" 
    onClicked: { 
    myModel.setProperty(0,"name","Item 123") //this gives me error 
    } 
} 

我能夠在QML中創建菜單,但我找不到在模型中進行更改的正確方法。

順便說一下,setContextProperty和qmlRegisterType(本例中只使用第一個例子,其他例子包括第二個例子)有什麼區別。

+0

如果你問一個基本上說「這給我一個錯誤」的問題,那麼你應該包括你得到的_what_錯誤。只需將任何錯誤消息直接複製粘貼到問題中即可。 – 2012-08-06 07:02:34

+0

感謝您的回答和評論。我也問過一個更具體的問題[這裏](http://stackoverflow.com/questions/12091495/access-items-of-qstandarditemmodel-from-qml),並在所有答案的幫助下,現在我更好地理解了這個問題。請注意,在上述鏈接中,我已經添加了關於如何從QML更改QStandardItemModel的數據的工作解決方案。那麼,在這個問題中,我沒有按照需要使用用戶角色,但是給定的代碼因此對於初學者更加有用。 – meolic 2012-12-19 10:53:08

回答

3

這種模型真的不適合修改。視圖無法通知變化。更好的選擇是使用化QAbstractItemModel:http://qt-project.org/doc/qt-4.8/declarative-modelviews-abstractitemmodel.html

更簡單的方法來使用化QAbstractItemModel是通過QStandardItemModel:http://qt-project.org/doc/qt-4.8/qstandarditemmodel.html

setContextProperty()將單個命名屬性上下文。 qmlRegisterType()用QML引擎註冊一個QObject派生類型,允許它實例化該類型。例如,QDeclarativeItem類型在引擎中註冊爲「Item」,當QML代碼中出現Item {}時,引擎如何知道要創建什麼。

+0

現在,我也嘗試使用Qt文檔中的「AbstractItemModel Example」。但我得到完全相同的錯誤:** TypeError:表達式'myModel.setProperty'[undefined]的結果不是函數**。 – meolic 2012-08-21 10:24:01

+0

您需要在模型中實現setProperty()插槽。 – MartinJ 2012-08-22 09:32:43

+1

謝謝。我決定去QStandardItemModel。但是我仍然沒有一個例子就迷失了。如何從QML訪問QStandardItemModel項目?是否有另一種(更好的)從QML而不是setProperty()更改數據的方法? – meolic 2012-08-22 12:02:14