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

时间:2015-06-16 17:28:26

标签: qt qml qtquick2 qqmlcomponent qqmlapplicationengine

我在向现有场景添加新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没有错误。我做错了什么?

2 个答案:

答案 0 :(得分:1)

您需要为该项指定父项,否则它不是可视层次结构的一部分,并且不会被呈现。

答案 1 :(得分:0)

我认为您应该使用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并管理新项目创建的类。