Unsolved Reading value from ListView item, after changing it's model
-
Hello,
I have a ListView which I want to fill with data from C++'s QStringList.
ListView { id: config_list anchors.fill: parent model: config_model delegate: configDelegate clip: true highlightFollowsCurrentItem: true highlight: Rectangle { color: 'grey' radius: 5 } } ListModel{ id:config_model ListElement{ name: "D1" } ListElement{ name: "P1" } ListElement{ name: "W1" } } Component { id: configDelegate Item { width: parent.width height: 30 Row{ Text { font.pixelSize: 20 verticalAlignment: Text.AlignBottom horizontalAlignment: Text.AlignLeft color: "white" text: name } } MouseArea { anchors.fill: parent onClicked:{ config_list.currentIndex = index console.log(qsTr(config_model.get(config_list.currentIndex).name)) } } } }
So I do have the next in my .cpp file :
Q_PROPERTY(QStringList model MEMBER m_model NOTIFY modelChanged)
I'm filling the list with the data wanted and reading it from QML.
button{ onClicked:{ conf_page.config_model.clear() myClass.onReadModel() conf_page.config_list.model = myClass.model } }
But when the new model is loaded, the data doesn't show up until i change the value of configDelegate's text.
text: modelData,
instead of
text: name.Now I can see the text in the ListView, but I can not read the data with current method i'm using (console.log(qsTr(config_model.get(config_list.currentIndex).name))).
I've tried different approaches, but couldn't manage to fix it.How should I do it ?
-
@krokstr Hi,
get()
is specific to QML typeListModel
but doesn't exist inQStringListModel
. So you cannot call it with a C++ model, except if you make your own model and implement the get method. -
I felt some cleanup is required in your program. First you are creating the model in QML. You are creating the StringList and exposing it as model. QStringList is not a model. QStringListModel is model. I saw some data is fetched from C++ and trying to assign the model in QML. I'm not very clear why all this round about.
Either you can create the model in QML & stay with it. If not create the model in C++ and expose this model itself to QML using setContextProperty. You can directly assign C++ model to ListView. This will simplify your program.
-
Okay, I'm fairly new to QML and I'm sorry if I'm asking stupid questions!
I've tried some new methods but, I can't understand you very well. I couldn't make it with changing to QStringListModel.
So, what is the best way to fill up the ListView from C++, preferably preserving the current ListModel with "name" parameter in it . I am using C++ for searching some files in a directory, put their names in QStringList, then I want to transfer the data to ListView in QML. Can you send me some snippet code and links to something that can help me? -
Hi @krokstr , If you want to show files in a folder you can also try using QFileSystemModel and show the file names in the QML view.
Below is my blog post in which I create a custom FileSystemModel which fetch the directory information and show on a TreeeWidget.
https://arunpkqt.wordpress.com/2017/01/05/custom-filesystemmodel-display/This is another example in which I use the same custom model to display the content in a QML TreeView.
https://github.com/arunpkqt/QMLTreeViewYou can refer those two. Hope it helps. Happy coding!