见Loading QML Objects from C++:
QQuickView view;
view.setSource(QUrl("qrc:/main.qml"));
view.show();
QQuickItem *root = view.rootObject()
QQmlComponent component(view.engine(), QUrl("qrc:/Button.qml"));
QQuickItem *object = qobject_cast<QQuickItem*>(component.create());
现在您创建了一个自定义 Button 组件的实例。
为了避免 Javascript 垃圾收集器杀死它,告诉 QML C++ 会处理它:
QQmlEngine::setObjectOwnership(object, QQmlEngine::CppOwnership);
您需要 2 个父级:一个 visual parent 来显示对象和一个 QObject 父级,
确保在删除view 时正确删除object。
object->setParentItem(root);
object->setParent(&view);
您可以随意将任何属性设置为object,就像在 QML 中一样。为了确保,QML 知道
更改,请使用以下函数:
object->setProperty("color", QVariant(QColor(255, 255, 255)));
object->setProperty("text", QVariant(QString("foo")));
完成。
替代 QQmlEngine 版本:
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
QQuickWindow *window = qobject_cast<QQuickWindow*>(engine.rootObjects().at(0));
if (!window) {
qFatal("Error: Your root item has to be a window.");
return -1;
}
window->show();
QQuickItem *root = window->contentItem();
QQmlComponent component(&engine, QUrl("qrc:/Button.qml"));
QQuickItem *object = qobject_cast<QQuickItem*>(component.create());
QQmlEngine::setObjectOwnership(object, QQmlEngine::CppOwnership);
object->setParentItem(root);
object->setParent(&engine);
object->setProperty("color", QVariant(QColor(255, 255, 255)));
object->setProperty("text", QVariant(QString("foo")));