【问题标题】:How can a C++ QObject be created inside a QML javascript function block?如何在 QML javascript 功能块中创建 C++ QObject?
【发布时间】:2018-10-25 22:50:28
【问题描述】:

Similar to this question,我想实例化一个 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();
  }
}

我在ck = new ... 行上收到TypeError: Type error

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

我可以的

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

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

【问题讨论】:

    标签: qt qml qobject


    【解决方案1】:

    newQML 中不存在,最接近您想要的是创建CoverageKind 类型的属性,该属性最初为空,在Component.onCompleted 中,您将被分配使用@987654322 创建的值@。

    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");
        }
    }
    

    【讨论】:

      【解决方案2】:

      把你的物品变成一个组件

      Component {
        id: myComponent
        CoverageKind {}
      }
      

      然后你可以在任何地方做:

      var ckobj = myComponent.createObject (/*...*/)
      

      现在ckobj 是一个新实例

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多