Как создать C ++ QObject внутри функционального блока JavaScript QML? - PullRequest
0 голосов
/ 26 октября 2018

Аналогично этому вопросу , я хочу создать экземпляр подкласса 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 error в строке ck = new ....

У меня есть идиоматический способ, которым я могу создать экземпляр подкласса C ++ QObject из блока JavaScript QML?

Я могу сделать

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

Это кажется действительно неуклюжим.Я мог бы также создать фабричную функцию, но я надеялся, что смогу создать эти объекты внутри javascript более эргономично.

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Превратите ваш предмет в компонент

Component {
  id: myComponent
  CoverageKind {}
}

Тогда где угодно вы можете сделать:

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

Теперь ckobj - это новый экземпляр

0 голосов
/ 26 октября 2018

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