2017-07-18 57 views
0

由於Qt的5.6我們終於可以寫出這樣的代碼:有沒有辦法如何將QAbstractItemModel的行函數自動公開到QML?

ListView { 
    id: list 
    model: MyModel 
    delegate: TextInput { 
     text: display 
     onEditingFinished: { 
       model.edit = displayText 
     } 
} 

model.edit將調用MyModelsetData()與來自TextInputQt::EditRole和顯示值。很好,很久很頭痛。

但是,即使使用QAbstractItemModelthe recommended practice更復雜的基於C++的模型,我仍然覺得它只是只讀模型,即qml視圖可以讀取行數,列數等,但它絕不意味着添加或刪除行的方式(爲了清潔實現QAbstractItemModel::setData該行必須已經存在)。

用Q_INVOKABLE重新實現所有插入/刪除功能,qml的ListModel對於任何嚴重的事情來說都太簡單了。

對於基於qml的小部件,應該添加/刪除行,編輯項目還有C++模型?

+2

[在QML/QT 5.7中添加和刪除C++列表中的項目]的可能重複(https://stackoverflow.com/questions/41617677/adding-and-removing-items-from-ac-list-in- qml-qt-5-7) –

+1

我建議使用通用對象模型,它不綁定到任何特定的數據模式,而且功能非常強大且靈活。通過這種方式,您可以完全避免爲每個特定目的模型繼續實施C++模型:https://stackoverflow.com/questions/35160909/how-to-create-a-generic-object-model-for-use -in-qml/35161903#35161903 – dtech

回答

1

重新實現了新的QAbstractListModelQAbstractItemModel子類insertRows()removeRows()髒,這是正常的!

請注意,insertRows()removeRows()在基類中標記爲virtual,表明這一點。

基類不知道如何操作您的數據結構,因爲它可能是QList,或者它可能比SQL數據庫或第三方庫更復雜。

在您的班級定義中,您可以將方法標記爲Q_INVOKABLE或公開位置。還要注意,Qt模型類中的幾個函數 - virtual和非 - 都是已經標記爲可調用的,參見例如。 here

+0

當然,這些功能應該被覆蓋。但是你不能直接從QML調用它們,你可以嗎(想象你想要指定QModelIndex與默認值不同)。所以你最終得到一個調用setData()和/或insertRows()的包裝器。 –

+1

QML當前沒有任何視圖項能夠顯示分層或基於樹的模型,因此不應該有任何需要將QModelIndex參數設置爲默認以外的任何其他參數....當然,您是對的,這些模型起源於窗口小部件。現在有大量的工作要重新完成整個QML模型 - 視圖交互,以期在Qt Quick 2中最終提供一個新的更快的QML TableView。您可以在這裏看到它的進展:http://code.qt.io /cgit/qt/qtdeclarative.git/log/?h=wip/itemviews –

+1

嗯,有['TreeView'](https://doc.qt.io/qt-5/qml-qtquick-controls-treeview。 HTML)在Qt快速控制1 – GrecKo

0

我建議你重寫insertRows()removeRows()方法,它們是Q_INVOKABLE,並採取指數爲整數和調用實際insertRows()removeRows()方法。
所以你可以使用widget和qml UI方法。
我認爲這不是髒的,因爲你只是爲不同的使用做好準備,並且覆蓋是正常的。

相關問題