Подобно этому вопросу, я хочу создать экземпляр подкласса 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.info('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 более эргономично.
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");
}
}
Превратите ваш предмет в компонент
Component {
id: myComponent
CoverageKind {}
}
Тогда где угодно можно делать:
var ckobj = myComponent.createObject (/*...*/)
Теперь ckobj
- это новый экземпляр