2017-03-14 44 views
2

C++からQMLにQ_GADGETタグが付けられた構造体でシグナルを出力できます。QMLでQ_GADGET構造体の新しいインスタンスを作成する方法は?

このような構造体をQMLからC++スロットに送ることはできますか? QMLでインスタンスを作成するという最初のステップでコードが失敗します。

このコードは、最初の行に失敗した...

var bs = new BatteryState() 
bs.percentRemaining = 1.0 
bs.chargeDate = new Date() 
DataProvider.setBatteryState(bs) 

...エラーで:

qrc:///main.qml:34: ReferenceError: BatteryState is not defined 

私はQMLにC++からBatteryStatus構造体を放出することができますが、私はしたいと思います1つのパラメータを1つのスロットに送ります。

// BatteryState.h 
#pragma once 

#include <QDate> 
#include <QMetaType> 

struct BatteryState 
{ 
    Q_GADGET 
    Q_PROPERTY(float percentRemaining MEMBER percentRemaining) 
    Q_PROPERTY(QDate date    MEMBER date) 

public: 
    explicit BatteryState(); 
    BatteryState(const BatteryState& other); 
    virtual ~BatteryState(); 
    BatteryState& operator=(const BatteryState& other); 
    bool operator!=(const BatteryState& other) const; 
    bool operator==(const BatteryState& other) const; 

    float percentRemaining; 
    QDate date; 
}; 
Q_DECLARE_METATYPE(BatteryState) 

// BatteryState.cpp 
#include "BatteryState.h" 

BatteryState::BatteryState() 
    : percentRemaining(), date(QDate::currentDate()) 
{} 

BatteryState::BatteryState(const BatteryState& other) 
    : percentRemaining(other.percentRemaining), 
     date(other.date) 
{} 

BatteryState::~BatteryState() {} 

BatteryState&BatteryState::operator=(const BatteryState& other) 
{ 
    percentRemaining = other.percentRemaining; 
    date = other.date; 
    return *this; 
} 

bool BatteryState::operator!=(const BatteryState& other) const { 
    return (percentRemaining != other.percentRemaining 
      || date != other.date); 
} 

bool BatteryState::operator==(const BatteryState& other) const { 
    return !(*this != other); 
} 

私はmain.cppには、このタイプを登録します:

qRegisterMetaType<BatteryState>(); 

勧告ここで

はBatteryState.h & BatteryState.cppのですか?

+0

http://doc.qt.io/qt-5/qtqml-cppintegration-definetypes.html#registering-an-instantiable-object-type? – bipll

答えて

2

あなたはQMLでQ_GADGET Sを作成しない、QMLのオブジェクトはQObjectを導出する必要がある、とnewによって作成さないある - それは唯一のJSオブジェクトのためです。ガジェットはメタデータを生成するだけで、メンバーなどにQMLからアクセスして回ることができます。

Is it possible send such a struct from QML to a C++ slot?

送信することが可能であるが、それはQMLで作成されません。 C++関数からQMLに戻すことも、オブジェクトのプロパティとして公開することもできます。

struct Test { 
    Q_GADGET 
    Q_PROPERTY(int test MEMBER test) 
    public: 
    Test() : test(qrand()) {} 
    int test; 
    Q_SLOT void foo() { qDebug() << "foo"; } 
}; 

class F : public QObject { // factory exposed as context property F 
    Q_OBJECT 
    public slots: 
    Test create() { return Test(); } 
    void use(Test t) { qDebug() << t.test; } 
}; 


    // from QML 
    property var tt: F.create() 

    Component.onCompleted: { 
     F.use(F.create()) // works 
     var t = F.create() 
     console.log(t.test) // works 
     F.use(t) // works 
     console.log(tt.test) // works 
     F.use(tt) // works 
     tt.test = 555 
     F.use(tt) // works 
     t.test = 666 
     F.use(t) // works 
     t.foo() // works 
    } 
関連する問題