Как связать QVector * в ListView? - PullRequest
0 голосов
/ 19 января 2020

Я пытался использовать QVector<AClass*> вместо QVector<AClass*>*, и он работает со следующими параметрами в qml:

ListView{
    model: testContext.list
    delegate: Text{
        text: modelData.name + " " + modelData.age
    }
}

Когда я добавил еще один *, чтобы сделать его QVector<AClass*>* Я получил эту ошибку:

QMetaProperty :: read: Невозможно обработать незарегистрированный тип данных 'QVector *' для свойства 'Test :: list'

, чтобы исправить его в соответствии с здесь , я добавил qRegisterMetaType<QVector<AClass*>*>("QVector<AClass*>*"); в constructor следующим образом:

Test::Test(QObject *parent) : QObject(parent)
{
    qRegisterMetaType<QVector<AClass*>*>("QVector<AClass*>*");
    engine.rootContext()->setContextProperty("testContext", this);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
}

выше constructor находится в .cpp файле следующего класса:

class Test : public QObject
{  
    QQmlApplicationEngine engine;
    QVector<AClass*> *vector;

    Q_OBJECT
    Q_PROPERTY(QVector<AClass*>* list READ list WRITE setList NOTIFY listChanged)

public:
    explicit Test(QObject *parent = nullptr);
    QVector<AClass*>* list() {return vector;}
    void setList(QVector<AClass*>* value){vector = value; emit listChanged();}
    Q_SIGNAL void listChanged();
    Q_INVOKABLE void addItem();
    Q_INVOKABLE void removeItem(int index);
};

в моем main.cpp У меня есть такие:

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);
    Test test;
    return app.exec();
}

QVector содержит предметы, НО ничего не появляется в ListView! Вот AClass:

class AClass : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
    Q_PROPERTY(int age READ age WRITE setAge NOTIFY ageChanged)

public:
    explicit AClass(QObject *parent = nullptr);
    QString name() const {return mName;}
    void setName(QString value) {mName = value; emit nameChanged();}
    int age() const {return mAge;}
    void setAge(int value){mAge = value; emit ageChanged();}
    Q_SIGNAL void nameChanged();
    Q_SIGNAL void ageChanged();

private:
    QString mName;
    int mAge;
};

Если я использую QVector<AClass*> или QVector<AClass> вместо QVector<AClass*>*, я вижу элементы в ListView.

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