QML的C ++插件,无法在C ++实例上看到属性

时间:2013-09-13 18:22:32

标签: c++ qt plugins qml

我编写了一个C ++插件,为QML公开了一个C ++ MyCppClassQ_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“import”
  • 加载
  • 成功:在QML中实例化C ++对象
  • 成功:从QML调用Q_INVOKABLE函数
  • 失败:从相同的 C ++对象访问QML中的任何属性(QML无法加载,错误:“无法分配给不存在的属性”值“”)....分配/绑定无法加载QML文件,“读取”任何属性导致“未定义”)

这对我来说没有意义(Qt 5.1.1,Win7)。插件加载,C ++对象被实例化,Q_INVOKABLE函数有效,但我显然无法“看到”任何Q_PROPERTY属性。

问题 Q_INVOKABLE在某个实例上工作的可能情况有哪些,但{em>相同Q_PROPERTY属性仍然不可用>实例?

2 个答案:

答案 0 :(得分:0)

我也使用Win 7 Qt 5.1.1而且我对Q_PROPERTY没有问题。

你的函数实现可能有问题(比如改变信号的无限循环)? 或者你有多个你的插件版本并使用错误?

如果问题不是这样,您可以尝试在C ++中创建MyCppClass对象并使用meta-objets fonctions(特别是QObject :: dynamicPropertyNames或QMetaObject :: propertyCount / property)来探索它以获取属性列表

答案 1 :(得分:0)

最有可能的是,您没有在Qt元对象系统中正确注册您的课程。它通常由qmlRegisterType或类似方法完成。