QtQuick动态对象在不同的​​上下文中

时间:2013-08-22 20:58:43

标签: c++ qml qt5 ogre qtquick2

在我的qml中,我正在创建一个C ++组件对象,但无法弄清楚如何在创建对象时引用该对象。

这是创建OgreScene对象的qml:

MouseArea
{
    anchors.fill: parent

    function scene()
    {
        var scene = Qt.createQmlObject( "import Client.Plugin.Ogre 0.1; OgreScene{ id: pluginScene; engine: OgreEngine }", plugin );
        console.log( "qml: init scene" );
        pluginScene.init();
    }

    onClicked: scene()
}

当我跑步时,我得到:

Qt Debug: qml: init scene
Qt Warning: qrc:///client.qml:118: ReferenceError: pluginScene is not defined

我将此添加到内联qml:

import Client.Plugin.Ogre 0.1; 

没有导入就无法找到对象定义。此导入已在qml文件中完成,因此看起来内联qml与其执行的文件位于不同的上下文中。

如何在与qml文件相同的上下文中创建c ++组件对象?

1 个答案:

答案 0 :(得分:2)

我有一个可行的解决方案。而不是尝试加载内联的qml,加载器项可以用于动态管理项目。

以下是加载项目以响应鼠标点击的代码:

MouseArea
{
    anchors.fill: parent
    function changePlugin()
    {
        // unload previously loaded plugin
        pluginLoader.sourceComponent = undefined;
        // load new plugin
        pluginLoader.sourceComponent = myPlugin;
    }
    onClicked: changePlugin()
}

在要加载的位置插入要加载的内容的定义:

Component
{
    id: myPlugin
    YourCustomPlugin
    {
        // do initialization when the object is loaded
        // I call the init method of my plugin
        Component.onCompleted: init();
    }
}

Loader { id: pluginLoader; }