0

MyCppClassQML 用の C++ を公開する C++ プラグインを作成しました。関数は機能しますが、同じインスタンスのプロパティをQ_INVOKABLE「見る」ことができません。Q_PROPERTY

些細なことを仮定しMyCppClassます:

class MyCppClass : public QObject {
  Q_OBJECT
  Q_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged)
public:
  MyCppClass();
  virtual ~MyCppClass();
  Q_INVOKABLE void myInvokeFunc();
  int value();
  void setValue(int i);
signals:
  void valueChanged(int);
private:
  int m_iValue;  
};

QML の使用例:

// FILE: MyQml.qml
import QtQuick 2.1
import QtQuick.Controls 1.0
import QtQuick.Window 2.0

import MyCppPlugin 1.0

Item {
  MyCppClass {      //<==OK
     id: myClass    //<==OK
     value: 42      //<==QML LOAD ERROR
  }

  Button {
    text: "Hello"
    onClicked: {
      myClass.myInvokeFunc()   //<==OK
    }
}

どうしたの:

  • 成功: C++ プラグインは QML の「インポート」を介してロードされます
  • 成功: QML で C++ オブジェクトをインスタンス化する
  • 成功Q_INVOKABLE: QML から関数を呼び出す
  • FAIL :同じC++ オブジェクト から QML のプロパティにアクセスしています (QML の読み込みに失敗し、エラー: "存在しないプロパティ "値" に割り当てることができません") .... 割り当て/バインディングは QML ファイルの読み込みに失敗し、"読み取り" どのプロパティも "未定義" になります)

これは私には意味がありません(Qt 5.1.1、Win7)。プラグインがロードされ、C++ オブジェクトがインスタンス化され、関数が動作しますが、どうやらプロパティQ_INVOKABLEを「見る」ことができません。Q_PROPERTY

質問: インスタンスで機能するが、その同じインスタンスのプロパティがまだ利用できないシナリオは何ですか?Q_INVOKABLEQ_PROPERTY

4

2 に答える 2

0

私も Win 7 Qt 5.1.1 を使用していますが、Q_PROPERTY に問題はありません。

あなたの関数の実装に問題があるかもしれません(変更された信号の無限ループなど)?または、プラグインの複数のビルドがあり、間違ったものを使用していますか?

問題がない場合は、C++ で MyCppClass オブジェクトを作成し、メタオブジェクト関数 (特に QObject::dynamicPropertyNames または QMetaObject::propertyCount/property) を使用して探索し、プロパティ リストを取得することができます。

于 2013-09-25T18:05:14.177 に答える
0

ほとんどの場合、Qt メタ オブジェクト システムにクラスを適切に登録していません。通常、qmlRegisterTypeまたは同様の方法で行われます。

于 2016-03-25T11:37:56.607 に答える