2016-07-25 13 views
1

私はこのコードを持っています。QMLにC++クラスを公開

class Pet 
{ 
    public: 
    Pet(const QString& nm) 
    : name(nm) 
    {} 

    const QString& name() const { return nm; } 

    private: 
    QString nm; 
} 

class Dog : public QObject, public Pet 
{ 
    Q_OBJECT 
    public: 
    Dog(QObject* prnt) 
    : QBject(prnt), 
     Pet("Tommy") 
    {} 
} 

QML

QQmlApplicationEngine engine; 
engine.rootContext()->setProperty("petDog", new Dog(&engine)); 

// QMLアイテム

console.log(petDog.name()) // TypeError: Property 'name' of object Dog(0x0XXXXX) is not a function 

にこれを公開QMLにC++クラスのすべてのメソッドを公開するソリューションとは何ですか?ありがとう

答えて

3

メソッドは、QMLから呼び出せるようにメタオブジェクトシステムに知られていなければなりません。

  1. 信号(Q_SIGNAL)、又は
  2. スロット(Q_SLOT)、又は
  3. 呼び出し可能な(Q_INVOKABLE):これは、方法のいずれかでなければならないことを意味します。

Qt 5では、スロットと呼び出し可能なメソッドの違いは、メタオブジェクトデータを反復するときにメソッドがスロットの中にリストされるかどうかだけです。それ以外のスロットや呼び出し可能なメソッドは同等です。

Qt 5では、スロット/呼び出し可能ではないにもかかわらず、C++から任意のメソッドへのアクセスが可能ですが、そのようなメソッドはC++コンパイラであるnot to QMLにしか認識されません。

+0

私が指摘したいのは、提供された例を見ると、クラスメンバを 'Q_PROPERTY'として設定することもできます。 – maxik

+0

@maxikそして、それは呼び出し可能なメソッドと関係がありますか? –

+3

提供されているサンプルには、ゲッターで 'name'という名前のインスタンスメンバーがあります。私の意見では、 'Q_PROPERTY'は' Q_INVOKABLE'よりはるかに優れています。このように設定すると、 'name()'メソッドも呼び出し可能になります。 – maxik

関連する問題