由於Qt的5.6我們終於可以寫出這樣的代碼:有沒有辦法如何將QAbstractItemModel的行函數自動公開到QML?
ListView {
id: list
model: MyModel
delegate: TextInput {
text: display
onEditingFinished: {
model.edit = displayText
}
}
即model.edit
將調用MyModel
的setData()
與來自TextInput
Qt::EditRole
和顯示值。很好,很久很頭痛。
但是,即使使用QAbstractItemModel
爲the recommended practice更復雜的基於C++的模型,我仍然覺得它只是只讀模型,即qml視圖可以讀取行數,列數等,但它絕不意味着添加或刪除行的方式(爲了清潔實現QAbstractItemModel::setData
該行必須已經存在)。
用Q_INVOKABLE重新實現所有插入/刪除功能,qml的ListModel
對於任何嚴重的事情來說都太簡單了。
對於基於qml的小部件,應該添加/刪除行,編輯項目還有C++模型?
[在QML/QT 5.7中添加和刪除C++列表中的項目]的可能重複(https://stackoverflow.com/questions/41617677/adding-and-removing-items-from-ac-list-in- qml-qt-5-7) –
我建議使用通用對象模型,它不綁定到任何特定的數據模式,而且功能非常強大且靈活。通過這種方式,您可以完全避免爲每個特定目的模型繼續實施C++模型:https://stackoverflow.com/questions/35160909/how-to-create-a-generic-object-model-for-use -in-qml/35161903#35161903 – dtech