2017-12-25 14 views
1

C++とQML間でデータを交換する方法を学びたいと思っています。以下のコードを考えてみましょう。one of the Qt examplesのわずかに変更されたバージョンです。QMLに値やその他の洗練された型のリストを返す方法

// 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コンポーネントが完成すると、コードは別の人物「ウィリアム・グリーン」をパーティーに「招待」します。招待方法は、名前のJavaScript側からアクセスすることができ、彼の名前は私がリストを返したい場合人の(名前は言うしかしconsole.log

、経由で印刷することがこの人、へのポインタを返しますQMLに戻ってパーティーへのすべての現在のゲストの)? thisページ 何らかの形でQVariantListを使用する必要があります。これは正しいです?そのページは残念ながら、C++からJavascript関数を呼び出す方法について言及しています。その逆もありません。

で、短い私の質問は、Cから1 リターン洗練されたデータ型をどうするかである++ QML/JavaScriptに戻って。

あなたはQObjectのリストを公開すると、あなたのコードにすでに QQmlListPropertyを介して行われ、あなたの場合は
+0

はあなたのための私の解決策の仕事をしましたか? – eyllanesc

+0

はい、ありました!どうもありがとうございます! – smilingbuddha

+0

さらに靴のサイズのためのもの –

答えて

2

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 
+0

QObjectのリストを公開するには、 'QList 'タイプの 'Q_PROPERTY'で十分です。 'QQmlListProperty'は、リストをQMLから宣言的に取り込む必要があるときに使用します。 – GrecKo

関連する問題