首页 > 解决方案 > 如何在 QML javascript 功能块中创建 C++ QObject?

问题描述

与此问题类似,我想实例化 QObject 的子类,我想在 javascript 函数块本身中执行此操作。

我有一堂课:

class CoverageKind : public QObject {
  Q_OBJECT    
public:

  int64_t        id;
  QString        coverage_kind;

  CoverageKind(QObject * parent=nullptr);

  Q_PROPERTY(int64_t id MEMBER id NOTIFY id_changed)
  Q_PROPERTY(QString coverage_kind MEMBER coverage_kind NOTIFY coverage_kind_changed)

signals:
  void id_changed();
  void coverage_kind_changed();
};

这是在 QML 中注册的,例如:

qmlRegisterType<CoverageKind>("com.example.CoverageKind", 0, 1, "CoverageKind");

导入后com.example.CoverageKind,我可以像这样实例化这个 QObject 子类:

Item {
  CoverageKind {
    id: ck
    Component.onCompleted: {
      console.log('Created CoverageKind! ', ck);
    }
  }
}

哪个打印:

Created CoverageKind!  CoverageKind(0x19b51b0)

但是,如果我这样做:

import com.example.CoverageKind 0.1;
Item {
  CoverageKind ck;
  Component.onCompleted: {
    ck = new CoverageKind();
  }
}

TypeError: Type errorck = new ...线了。

我有一种惯用的方式可以从 QML javascript 块中实例化 C++ QObject 子类吗?

我可以

var ck = Qt.createComponent("import com.example.CoverageKind 0.1; CoverageKind{}");

这感觉真的很笨拙。我也可以创建一个工厂函数,但我希望能够更符合人体工程学地在 javascript 中创建这些对象。

标签: qtqmlqobject

解决方案


new中不存在QML,与您想要的最接近的是创建CoverageKind最初为 null 的类型的属性,并且Component.onCompleted您将被分配使用创建的值Qt.createQmlObject()

import QtQuick 2.0
import com.example.CoverageKind 0.1;

Item {
    id: parentItem
    property CoverageKind ck: null
    Component.onCompleted: {
        ck = Qt.createQmlObject('import com.example.CoverageKind 0.1; CoverageKind{}',
                                parentItem,
                                "dynamicSnippet1");
    }
}

推荐阅读