我的应用有3个级别: - 主要表格 - 设置 - 设备搜索
从主要表格我打开其他人使用:
var component = Qt.createComponent("qrc:/touch/content/SettingsMain.qml");
win = component.createObject(rootWindow2);
在主窗体中我创建了对象网络(它是C ++类)
Network{
id: net1
}
对象" net1"可由其他QML对象访问,这些对象未被上述代码创建组件调用。不幸的是,使用上面的代码创建的所有QML对象都没有看到" net1"。我需要像所有QML文件的全局对象。有什么想法吗?
答案 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作为属性传递。示例如下:
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});
}
}
}
import QtQuick 2.0
Item {
property Item net1
Component.onCompleted: {
console.log("SettingsMain.qml: can I see net1? %1".arg(net1 ? "yes" : "no"))
}
}