Привязка QList‹Type*› к QListView

У меня есть пользовательский тип, называемый Patients (пожалуйста, игнорируйте ошибку во множественном числе). Я хочу создать QList<Patients*> в своем cpp и использовать его из своего QML. Я следую шаблонам из здесь, но это не работает .

Вот мои пациенты.h (возможно, больше информации, чем нужно). . .

class Patients : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString name READ getName)
    Q_PROPERTY(QString email READ getEmail)
    Q_PROPERTY(int id READ getId)

public:
    explicit Patients(QObject *parent = 0);
    explicit Patients(int id, QString name, QString email, QObject *parent = 0);

    QString getName() const;
    QString getEmail() const;
    int getId() const;

private:
    QString email, name;
    int id;
}; 

Вот основной cpp

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QQmlApplicationEngine engine;

    QList<Patients*> lst;
    lst.append(new Patients(0, QString("abe"), QString("albert")));
    QQmlContext *ctx = engine.rootContext();
    ctx->setContextProperty("pLst", QVariant::fromValue(lst));

    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    return app.exec();
}

Вот qml. . .

ListView{
    id: lst
    height: 100; width: 100
    anchors.fill: parent
    x: 100; y: 100

    model: pLst
    delegate: Text{
        text: model.modelData.name
    }
}

Это работает, когда я привязываю один объект, но не как список. Даже представление index внутри Text не работает. Никаких сообщений об ошибках или чего-то подобного.


person rbtLong    schedule 28.07.2015    source источник
comment
Пожалуйста, я хотел бы знать, что не так с редактированием. Спасибо.   -  person BaCaRoZzo    schedule 30.07.2015


Ответы (3)


В QML нет общей поддержки контейнера QList, даже если тип, который он содержит, зарегистрирован в метасистеме Qt. Некоторые специальные варианты (например, QStringList QList<QObject*>) поддерживаются по умолчанию, поэтому вы можете использовать QList<QObject*>, если ваш класс является производным от QObject.

Если ваш тип не является производным от QObject или если вы хотите, чтобы ваш интерфейс на C++ был чистым и безопасным, я предлагаю использовать QQmlListProperty. Имейте в виду, что вам не нужно реализовывать метод append() или clear(), если вы не хотите, чтобы список можно было изменять изнутри QML.

person Lutz Schönemann    schedule 28.07.2015

Оказывается, я должен объявить список как

QList<QObject*> lst;
person rbtLong    schedule 28.07.2015

Вы определите новый класс с QQmlListProperty и определите объект данных контейнера (этот класс будет унаследован от QObject), в классе QQmlListProperty вы определите контейнер QList указателей QObject. На эту тему я написал два поста:

Показать, изменить данные и сохранить QQmlListProperty в qml

Используйте QQmlListProperty для отображения и изменения QList в Qml

person APRocha    schedule 29.07.2015