代码之家  ›  专栏  ›  技术社区  ›  Ross Rogers

如何在QML JavaScript函数块中创建C++ QObjor?

  •  0
  • Ross Rogers  · 技术社区  · 6 年前

    Similar to this question ,我想实例化QObject的一个子类,

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

    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 error ck = new ...

    我有一个习惯用法,我可以从QML JavaScript块实例化C++ QObjor子类吗?

    我能做到

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

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   eyllanesc RAHUL KUMAR    6 年前

    new 不存在于 QML ,最接近您想要的是创建类型的属性 CoverageKind 初始值为空,在 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");
        }
    }
    
        2
  •  1
  •   GrecKo    6 年前

    使您的项目成为一个组件

    Component {
      id: myComponent
      CoverageKind {}
    }
    

    然后你可以在任何地方:

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

    现在 ckobj