Создать ListView / ListModel из вектора строк - PullRequest
0 голосов
/ 18 марта 2019

Пролог

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!

1 Ответ

2 голосов
/ 18 марта 2019

Вы должны предоставить свой интерфейс класса движку QML.В этом случае вы можете заменить QVector<QString> на QStringList.

class MyModel: public QObject {
    Q_OBJECT
    Q_PROPERTY(QStringList model READ model NOTIFY modelChanged)
    ...
}; 

Если вы посмотрите на документы :

Модели, которые не имеют именованных ролей (например, ListModel, показанный ниже), будут иметь данные, предоставленные через роль modelData.Роль modelData также предоставляется для моделей, которые имеют только одну роль.В этом случае роль modelData содержит те же данные, что и именованная роль.

Итак, вы должны использовать свойство modelData:

ListView {
  model: mymodel.model
  delegate: Text {
     text: modelData
  }
}

Чтобы представить свой класс C ++,взгляните на эту страницу .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...