如何将c 返回值列表或其他复杂类型的QML列表



我正在尝试学习如何在C 和QML之间交换数据。考虑以下代码,这是QT示例之一的稍微修改的版本。

    // example.qml
    import QtQuick 2.0
    import People 1.0
    BirthdayParty {
        host: Person {
            name: "Bob Jones"
            shoeSize: 12
        }
        guests: [
            Person { name: "Leo Hodges" },
            Person { name: "Jack Smith" },
            Person { name: "Anne Brown" }
        ]
        Component.onCompleted:
           { console.log(invite("William Green").name)}
}

接口文件Person.h

//Person.h
#ifndef PERSON_H
#define PERSON_H
#include <QObject>
class Person : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString name READ name WRITE setName)
    Q_PROPERTY(int shoeSize READ shoeSize WRITE setShoeSize)
public:
    Person(QObject *parent = 0);
    QString name() const;
    void setName(const QString &);
    int shoeSize() const;
    void setShoeSize(int);
private:
    QString m_name;
    int m_shoeSize;
};
#endif // PERSON_H

接口文件birthday.h

#ifndef BIRTHDAYPARTY_H
#define BIRTHDAYPARTY_H
#include <QObject>
#include <QQmlListProperty>
#include "person.h"
class BirthdayParty : public QObject
{
    Q_OBJECT
    Q_PROPERTY(Person *host READ host WRITE setHost)
    Q_PROPERTY(QQmlListProperty<Person> guests READ guests)
public:
    BirthdayParty(QObject *parent = 0);
    Person *host() const;
    void setHost(Person *);
    QQmlListProperty<Person> guests();
    int guestCount() const;
    Person *guest(int) const;
    // Called from the QML side
    Q_INVOKABLE Person* invite(const QString &name);

private:
    Person *m_host;
    QList<Person *> m_guests;
};
#endif // BIRTHDAYPARTY_H

PersonBirthdayParty C 类都暴露于QML通过

在QML类型系统上注册
qmlRegisterType<BirthdayParty>("People", 1,0, "BirthdayParty");
qmlRegisterType<Person>("People", 1,0, "Person");

main.cpp中(为了简洁而不是在此粘贴)。

当前,当BirthdayParty组件完成后,代码将"邀请"另一个人" William Green"与聚会"邀请"。邀请方法返回指向此人的指针,该人可以从JavaScript端访问其名称,并通过console.log

打印他的名字

但是,如果我想将人(例如所有当前客人的名字)返回 列表,该怎么办?在我看来,根据这个页面我必须以某种方式使用QVariantList。它是否正确?不幸的是,该页面只是提及如何从C 调用JavaScript函数,而不是反之亦然,因此我不确定如何进行。

,简而言之,我的问题是一个返回复杂的数据类型从C 返回到QML/JavaScript。

在您的情况下,您要公开qobject列表,并且在您的代码中已经通过qqmllistproperty完成:

Q_PROPERTY(QQmlListProperty<Person> guests READ guests)

然后,要获得元素,您必须使用长度以JS的方式进行元素:

Component.onCompleted: {
    invite("William Green")
    for(var i=0; i < guests.length; i++){
        var guest = guests[i]
        console.log(guest.name)
    }
}

输出:

qml: Leo Hodges
qml: Jack Smith
qml: Anne Brown
qml: William Green

最新更新