在 C++ 中将新的 qml 对象添加到场景中

Posted

技术标签:

【中文标题】在 C++ 中将新的 qml 对象添加到场景中【英文标题】:New qml object added to scene in c++ 【发布时间】:2015-06-16 17:28:25 【问题描述】:

我在将新 QML 对象添加到现有场景时遇到问题。

我的main.qml 来源:

ApplicationWindow    

id:background
visible: true
width: 640
height: 480

MyItem.qml来源:

Rectangle 

width: 100
height: 62
color: "red"
anchors.centerIn: parent

最后,这是我的main.cpp 来源:

int main(int argc, char *argv[])

    QApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    QQmlComponent *component = new QQmlComponent(&engine);
    component->loadUrl(QUrl("qrc:/MyItem.qml"));

    qDebug() << "component.status(): "<< component->status();

    QObject *dynamicObject  = component->create();
    if (dynamicObject == NULL) 
        qDebug()<<"error: "<<component->errorString();;
    

    return app.exec();

main.qml 正确显示,但 MyItem.qml 未出现在 main.qml 中。 Component.status() 返回状态 ReadydynamicObject 上没有错误。我做错了什么?

【问题讨论】:

【参考方案1】:

您需要为项目指定一个父项,否则它不是视觉层次结构的一部分并且不会被渲染。

【讨论】:

【参考方案2】:

我认为您应该使用QQuickView 而不是QQmlEnginemain.cpp 将是:

int main(int argc, char *argv[]) 
    QGuiApplication app(argc, argv);

    QQuickView view;
    view.setSource(QUrl(QStringLiteral("qrc:/main.qml")));
    view.show();

    QQmlComponent component(view.engine(), QUrl("qrc:/MyItem.qml"));

    QQuickItem *item = qobject_cast<QQuickItem*>(component.create());
    item->setParentItem(view.rootObject());
    QQmlEngine::setObjectOwnership(item, QQmlEngine::CppOwnership);

    return app.exec();

您需要将main.qml 类型从ApplicationWindow 更改为Item

Item

    id:background
    visible: true
    width: 640
    height: 480

这样更容易,您可以创建一个扩展QQuickView 的类,并管理新项目的创建。

【讨论】:

以上是关于在 C++ 中将新的 qml 对象添加到场景中的主要内容,如果未能解决你的问题,请参考以下文章

游戏开发之UE4添加角色到场景中

使用 SpriteKit 场景编辑器设计复杂对象

如何将 3D 模型添加到场景中以使它们具有特定的 XYZ 位置?

Sprite Kit - 使用 Switch Case 将随机 Sprite 节点添加到场景中

第一步是 THREE.js:尝试将搅拌机模型添加到场景中的问题

三个JS:如何使用PNG纹理将Point Light添加到场景中?