在我加载qml文件(http://doc.qt.io/qt-5/qml-qtquick-controls-busyindicator.html)时,我一直在尝试运行BusyIndicator(http://doc.qt.io/qt-5/qml-qtquick-loader.html),但BusyIndicator没有出现。
我想做的是: 1-用户发出“handlerLoader(name)”,其中“name”是下一个qml页面的url。 2-在“onHandlerLoader”中我运行busyIndicator。 3-然后,我更改了Loader源。
问题在于,无论我在第2步和第3步之间花费的时间,BusyIndicator都不会出现。
此外,当我评论第3步时,busyIndicator正确显示。
我做错了什么?
谢谢!
这是代码:
Rectangle {
visible: true
width: 800
height: 480
signal handlerLoader (string name)
Loader {
id: pageLoader;
source: "init.qml";
}
BusyIndicator {
id: busyIndicator_inicio
width: 100
height: 100
anchors.centerIn: parent
running: false
}
Connections {
target: pageLoader.item
onHandlerLoader: {
busyIndicator_inicio.running = true
pageLoader.source = name;
}
}
}
答案 0 :(得分:4)
原因是,你的重负载Loader
阻塞了线程。
将其设置为异步模式,以允许程序的其余部分运行。
此外,我建议更喜欢声明性绑定到处理程序中的命令式赋值。看我的例子:
main.qml:
import QtQuick 2.4
import QtQuick.Window 2.2
import QtQuick.Controls 2.0
Window {
width: 1000
height: 800
visible: true
Button {
text: 'load'
onClicked: {
loader.source = "TestObj.qml"
}
}
Loader {
anchors.fill: parent
id: loader
active: true
asynchronous: true
visible: status == Loader.Ready
}
BusyIndicator {
id: ind
anchors.fill: parent
running: loader.status == Loader.Loading
}
}
TestObj.qml:
import QtQuick 2.0
Item {
Grid {
anchors.fill: parent
columns: width
rows: height
Repeater {
model: 100
Rectangle {
width: { for (var i = 0; i < 10000; i++) console.log(i); return 1 }
height: 1
color: 'green'
}
}
}
}
由于异步Loader
可能会在一段时间内显示不完整的文件,因此我将其设置为仅在status
更改为ready
时才可见。