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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使C ++将值列表或其他复杂类型返回到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)}
}

接口文件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”加入该党。 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 ++将值列表或其他复杂类型返回到QML的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 C++/C 中的阻塞函数的情况下将值从线程返回到主函数

如何将值存储在列表或数组中并将所有值绑定到数据表然后gridview

SQL 将值更改为大写或小写

如何将反序列化JSON中的列表传递给视图到选择列表

表值参数

Django:视图如何从 url 获取多个值?