QML全局访问C ++类

时间:2017-10-11 20:30:44

标签: c++ qt qml

我的应用有3个级别:   - 主要表格   - 设置   - 设备搜索

从主要表格我打开其他人使用:

var component = Qt.createComponent("qrc:/touch/content/SettingsMain.qml");
win = component.createObject(rootWindow2);

在主窗体中我创建了对象网络(它是C ++类)

Network{
        id: net1
}

对象" net1"可由其他QML对象访问,这些对象未被上述代码创建组件调用。不幸的是,使用上面的代码创建的所有QML对象都没有看到" net1"。我需要像所有QML文件的全局对象。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

你应该使用单身人士,它的存在就是为了这个目的:

// in main.cpp
qmlRegisterSingletonType(QUrl(QStringLiteral("qrc:/touch/content/SettingsMain.qml")), "Core", 1, 0, "Settings");

然后您可以通过导入来访问每个QML文件:

import Core 1.0
//.. and use it
Settings.someProperty
Settings.someFoo()

您还必须在pragma Singleton的开头添加SettingsMain行。

如果实现qmldir文件,也可以跳过从C ++注册单例,但当单例是应用程序不可或缺的一部分时,用C ++注册IMO会更好。

使用qml单例时,您不需要自己创建实例,它会自动创建。

你的问题是关于你真正想要的是什么?#34; global",我认为设置是你想成为全球性的一件事。

您还可以在QML中将C ++对象注册为单例,例如:

qmlRegisterSingletonType<Network>("Core", 1, 0, "Network", someFooReturningValidNetworkPtr);

答案 1 :(得分:1)

Singleton不是唯一的方法。 QML提供了许多方法来获得相同的结果。

另一种方法是在调用net1时将Qt.createObject() id作为属性传递。示例如下:

main.qml

import QtQuick 2.7
import QtQuick.Controls 2.0

ApplicationWindow {
    visible: true
    width: 640
    height: 480

    Item {
        id: rootWindow2

        property Item settingsMain

        Network{
            id: net1
        }

        Component.onCompleted: {
            var component = Qt.createComponent("qrc:/touch/content/SettingsMain.qml");
            settingsMain = component.createObject(rootWindow2, {"net1": net1});
        }
    }
}

SettingsMain.qml

import QtQuick 2.0

Item {

    property Item net1

    Component.onCompleted: {
        console.log("SettingsMain.qml: can I see net1? %1".arg(net1 ? "yes" : "no"))
    }
}