【问题标题】:C++ Plugin for QML, cannot see properties on C++ instanceQML 的 C++ 插件,看不到 C++ 实例的属性
【发布时间】:2013-09-13 18:22:32
【问题描述】:

我编写了一个 C++ 插件,它为 QML 公开了一个 C++ MyCppClassQ_INVOKABLE 函数有效,但我无法“看到”same 实例的任何 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
    }
}

发生了什么:

  • 成功:通过 QML“导入”加载 C++ 插件
  • 成功:在 QML 中实例化 C++ 对象
  • 成功:从 QML 调用 Q_INVOKABLE 函数
  • FAIL:从相同 C++ 对象访问 QML 中的任何属性(QML 加载失败,错误:“无法分配给不存在的属性“值” em>") .... 分配/绑定无法加载 QML 文件,并且“读取”任何属性都会导致“未定义”)

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

问题Q_INVOKABLE 在一个实例上工作但Q_PROPERTY 属性对于该相同 实例仍然不可用的可能情况有哪些?

【问题讨论】:

    标签: c++ qt plugins qml


    【解决方案1】:

    我也使用 Win 7 Qt 5.1.1,Q_PROPERTY 没有问题。

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

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

    【讨论】:

      【解决方案2】:

      很可能,您没有在 Qt 元对象系统中正确注册您的类。一般通过qmlRegisterType或者类似的方式来完成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-03
        • 1970-01-01
        相关资源
        最近更新 更多