首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在运行时从C++创建QQmlComponent?

如何在运行时从C++创建QQmlComponent?
EN

Stack Overflow用户
提问于 2014-11-03 05:27:42
回答 1查看 10.7K关注 0票数 11

我需要在运行时从C++代码添加QML组件。我可以从'main.qml‘文件创建ApplicationWindow。窗口显示成功。问题是我无法将其他QML组件添加到此窗口中。我在'button.qml‘文件中指定了按钮。因此,我尝试创建另一个QQmlComponent,并将ApplicationWindow设置为按钮的父按钮。obj1->children()的输出显示存在类型为button (QQuickItem(0xcc08c0),Button_QMLTYPE_12(0xa7e6d0) )的子项。但该按钮不会显示。当我尝试将按钮统计添加到'main.qml‘中时,一切都运行良好。我在运行时创建QQmlComponent时遗漏了一些东西。

代码语言:javascript
复制
QQmlEngine engine;

QQmlComponent component1(&engine, QUrl("qrc:/main.qml"));
QQmlComponent component2(&engine, QUrl("qrc:/button.qml"));

QObject* obj1 = component1.create();
QObject* obj2 = component2.create();

obj2->setParent(obj1);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-03 07:29:22

请参阅Loading QML Objects from C++

代码语言:javascript
复制
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++会处理它:

代码语言:javascript
复制
QQmlEngine::setObjectOwnership(object, QQmlEngine::CppOwnership);

您需要两个父对象:一个用于显示对象的visual parent和一个QObject父对象,以确保在删除object时正确删除view

代码语言:javascript
复制
object->setParentItem(root);
object->setParent(&view);

您可以像在QML中一样,随意设置object的任何属性。要确保QML知道这些更改,请使用以下函数:

代码语言:javascript
复制
object->setProperty("color", QVariant(QColor(255, 255, 255)));
object->setProperty("text", QVariant(QString("foo")));

好了。

Alternative QQmlEngine版本

代码语言:javascript
复制
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")));
票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26704621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档