Пролог
QAbstractListModel может быть решением, но я думаю, что это немного излишне для меня ... не уверен
Введение
Я делаю вектор внутри C ++, чтобы он был доступен из QML:
class MyClass : public QObject
{
Q_OBJECT
Q_PROPERTY(QVector<QString> items READ items WRITE setItems NOTIFY itemsChanged)
// ...
}
Как я уже проверял, я могу получить доступ к своему вектору из QML:
console.log("myClass.items >>> ", myClass.items) // Logs vector of strings
Вопрос
В моем QML-интерфейсе я намереваюсь показать список строк внутри вектора. Я пытаюсь использовать ListModel
и ListView
, но я не знаю, как это сделать. Кто-нибудь может помочь?
ListModel {
id: myListModel
// How to compose my model here according to vector of strings
// i.e. myClass.items
}
ListView {
model: myListModel
delegate: {
// ... show the strings inside the vector
}
}
UPDATE
Как предложили @Amfasis и @mohabouje, я изменил свой код следующим образом, но он по какой-то причине не работает.
C ++ сторона:
class MyClass : public QObject
{
Q_OBJECT
Q_PROPERTY(QStringList items READ items WRITE setItems NOTIFY itemsChanged)
//...
}
QML сторона:
Row {
ListView {
id: items
model: myClass.items // Directly connect to C++ string list
delegate: Text {
text: modelData // Strings are NOT displayed on QML UI
// Log of modelData shows it is empty
}
}
}
В QML я регистрирую myClass.items
и вижу свой список строк:
console.log("myClass.items >>> ", myClass.items)
// logs:
// qml: myClass.items >>> [item 0,item 1,item 2]
Наконец исправлено
При настройке или изменении элементов мне нужно emit
сигнал модификации, иначе он не будет работать:
m_items = /* set items here */;
emit itemsChanged(m_items); // This is required!