Change the ListModel dynamically
-
@
import QtQuick 2.1
import QtQuick.Controls 1.0Rectangle {
id: root
width: 500
height: 500state: "one" ListModel{ id: one } ListModel{ id: two } function changeModel(){ if(state == "one"){ one.append({"source": "aaa"}) return one }else{ two.append({"source": "bbb"}) return two } } Row{ Button{ id: buttonOne text: "One" onClicked: { root.state = "one" } } Button{ id: buttonTwo text: "Two" onClicked: { root.state = "two" } } TableView{ id: tableView model: changeModel() TableViewColumn { title: "image" delegate: Text{ text: tableView.model.get(styleData.row).source } } } }
}
@
When I click the "Two" button, there are always an error message
qrc:/main.qml:59: TypeError: Cannot read property 'source' of undefined
How could I change the model dynamically?What kind of mistake I make?Thanks
-
The reason is that you change your underlaying model of the TableView and both are not of the same length.
Since you use .get(styleData.row) all the delegates visible in the table refer to a specific element on index (row number) in you model.
If you change the model, each delegate will try to get its data again, but the number of items of the other model is different, and if the number of items is less than the items that are visible, some of the items will fail to get its data, those rows will dissappear but give an error.
If you use:
@#
delegate: Text{ text: styleData.value }
@instead, then it works, without errors, but then you cannot have multiple properties in the same ListElement.
Hope it helps.
-
Thanks for your help:).Do we have a more flexible way to switch between different models?
Solution one :
Design a intermediate models(called C) with several properties
when I switch the model, I could clear the data of C
and copy the data of different models(A or B) to CSolution two :
Use Loader to load the view, when the model change
destroy the old table and load a new tableDo you have easier solutions?Thanks a lot