gpt4 book ai didi

qt - 如何访问 QML 中动态/随机加载的中继器项目?

转载 作者:行者123 更新时间:2023-12-04 12:42:43 24 4
gpt4 key购买 nike

@TheBootro 在这里提供的答案:link

提供了一种在 QML 文件/屏幕/ View 之间加载和更改的方法。但是当这样做时,如何使用信号和插槽?

可以使用 Repeater::itemAt(index) 方法访问中继器创建的项目,但由于我不知道项目的加载顺序,我不知道 screen2、screen3、screen4 等索引是什么在。

有什么办法可以解决这个问题,还是必须在启动时实例化内存中的所有屏幕?

我的代码如下:

main.qml:

//List of screens
property variant screenList: [
"main",
"screen2",
"screen3",
...
]

//Set this to change screen
property string currentScreen: "main"


Repeater {
id: screens
model: screenList
delegate: Loader {
active: false;
asynchronous: true
anchors.fill: parent
source: "%1.qml".arg(modelData)
visible: (currentScreen === modelData)
onVisibleChanged: {
loadIfNotLoaded()
}
Component.onCompleted: {
loadIfNotLoaded()
}

function loadIfNotLoaded () {
//To load start screen
if(visible && !active) {
active = true;
}
}
}
}

Connections {
target: screens.itemAt(indexHere)
//screen is here the string passed with the signal from screen2.
onChangeScreen: currentScreen = screen
}

Button {
id: button1
text: "Go To Screen 2"
onClicked: {
currentScreen = "screen2"
}
}

在 screen2.qml 中:
signal changeScreen(string screen)

Button {
text: "Go To Main"
onClicked: {
changeScreen("main")
}
}

最佳答案

One can access the items created by the repeater by using the Repeater::itemAt(index) method, but since I don't know in what order the items are loaded I don't know what index screen2, screen3, screen4 etc. is at.



Repeater 实例化的项目的顺序实际上是定义的 - 这些项目将按照模型的顺序实例化,因此在您的情况下,“main”将是第一个,然后是“screen2”,依此类推。现在,Repeater 中的每个项目都是一个 Loader——Repeater 将按照定义的顺序创建 3 个 Loader。加载器自己按需加载其源项目。

我认为您的代码中唯一缺少的是 Connections 引用了 Loader,但您需要它来引用 Loader 创建的项目。所以将连接更改为
Connections {
target: screens.itemAt(indexHere).item
onChangeScreen: currentScreen = screen
}

注意额外的 .项目 .

修复此问题后,还有一个问题:在创建 Connections 元素时,Repeater 尚未实例化其项目,因此 screens.itemAt(indexHere)将返回空值。解决此问题的一种方法是使用 currentIndex属性而不是 currentScreen属性并将其用于 target 的绑定(bind)中, 并设置 currentIndex在中继器实例化其项目后:
property int currentIndex: -1
...
Connections {
target: screens.itemAt(currentIndex).item
...
}
Component.onCompleted: currentIndex = 0

更简单的方法可能是将 Connections 元素放在中继器的委托(delegate)中,即有 3 个连接而不是一个(假设您有 3 个屏幕)。

关于qt - 如何访问 QML 中动态/随机加载的中继器项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20111218/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com