c++ - 如何使 C++ 将值列表或其他复杂类型返回到 QML

标签 c++ qt qml

我正在尝试学习如何在 C++ 和 QML 之间交换数据。考虑下面的代码,它是 one of the Qt examples 的略微修改版本。 .

    // 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)}
}

接口(interface)文件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

接口(interface)文件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”参加聚会。 invite 方法返回指向此人的指针,可以从 Javascript 端访问此人的姓名,并通过 console.log

打印他的姓名

但是,如果我想将人员的列表(说出所有当前参加聚会的客人的姓名)返回给 QML 怎么办?在我看来根据this页 我将不得不以某种方式使用 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

关于c++ - 如何使 C++ 将值列表或其他复杂类型返回到 QML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47971819/

相关文章:

c++ - 为什么我在以受限用户身份运行时会在 DLLMain 中获得 GPF?

c++ - ofstream "<<"和 Write 有什么区别

c++ - 模板特定方法

c++ - 在qt中绘制dicom原始数据

c++ - QGraphicsItem 在场景中的位置始终为 NULL

c++ - 使用QT开发服务器应用程序是个好主意吗?(QT5)

c++ - 为什么我们在这里需要一个 "friend"? (C++)

c++ - QML ListView 从 mysql 数据库中检索数据

qt - 从 C++ 调用 QML 函数

c++ - 如何找到 SQLWCHAR 的长度?