【问题标题】:How to create a QQmlComponent from C++ at runtime? [duplicate]如何在运行时从 C++ 创建 QQmlComponent? [复制]
【发布时间】:2014-12-29 12:59:35
【问题描述】:

我需要在运行时从 C++ 代码添加 QML 组件。我能够从“main.qml”文件创建ApplicationWindow。窗口显示成功。问题是我无法将其他 QML 组件添加到此窗口。我在“button.qml”文件中指定了按钮。所以我尝试创建另一个QQmlComponent 并将ApplicationWindow 设置为按钮的父级。 obj1->children() 的输出显示按钮类型的孩子存在 (QQuickItem(0xcc08c0),Button_QMLTYPE_12(0xa7e6d0))。但按钮不显示。 当我尝试将 Button 静态添加到“main.qml”中时,一切正常。我在运行时创建 QQmlComponent 时遗漏了一些东西。

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

【问题讨论】:

    标签: c++ qt object qml


    【解决方案1】:

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

    【讨论】:

    • 替代 QQmlEngine 版本运行良好。 QQuickView 将在旧的 QtQuick 版本中工作。我使用 QtQuick 2.3。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 2014-08-13
    • 2014-12-03
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多