在qml中,当filedialog中接受对话框时,如何显示busyIndicator?

在qml中,当filedialog中接受对话框时,如何显示busyIndicator?,qml,Qml,当用户在FileDialog中接受文件名后,应用程序正在处理任务,但主线程似乎被FileDialog阻止时,我想显示一个busyindicator。因此无法显示总线指示器。我怎样才能解决它?谢谢 代码如下: 导入QtQuick 2.4 导入QtQuick.Controls 1.3 导入QtQuick.Window 2.2 导入QtQuick.Dialogs 1.2 应用程序窗口{ 标题:qsTr(“你好世界”) id:根 宽度:640 身高:480 菜单栏:菜单栏{ 菜单{ 标题:qsTr(“

当用户在FileDialog中接受文件名后,应用程序正在处理任务,但主线程似乎被FileDialog阻止时,我想显示一个busyindicator。因此无法显示总线指示器。我怎样才能解决它?谢谢

代码如下:

导入QtQuick 2.4
导入QtQuick.Controls 1.3
导入QtQuick.Window 2.2
导入QtQuick.Dialogs 1.2
应用程序窗口{
标题:qsTr(“你好世界”)
id:根
宽度:640
身高:480
菜单栏:菜单栏{
菜单{
标题:qsTr(“&文件”)
梅努伊特姆{
正文:qsTr(“E&xit”)
onTriggered:Qt.quit();
}
}
}
主要形式{
锚定。填充:父级
按钮1.单击后:{
exportXLSXDALOG.open()
}
文件对话框{
id:exportXlsxDialog
标题:qsTr(“请选择一个xslx文件”)
名称过滤器:[“Excel 2007-2013(*.xlsx)”]
selectExisting:false
不接受:{
busyIndicator.running=true
睡眠(10000)
console.log(文件URL)
busyIndicator.running=false
}
函数睡眠(毫秒){
var start=new Date().getTime();
对于(变量i=0;i<1e7;i++){
如果((新日期().getTime()-start)>毫秒){
打破
}
}
}
}
总线指示器{
id:总线指示器
z:99
anchors.centerIn:父对象
跑步:错
}
}

}
我认为问题在于您的
sleep()
函数没有给
总线指示器提供显示的机会,可能是因为它没有让Qt的事件循环旋转

最好的解决方案可能是使用,但如果您懒惰,您可以使用:

import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.2

ApplicationWindow {
    title: qsTr("Hello World")
    id: root
    width: 640
    height: 480

    Timer {
        id: expensiveOperationDelay
        interval: 1
        onTriggered: sleep(2000)
    }

    function sleep(milliseconds) {
        var start = new Date().getTime();
        for (var i = 0; i < 1e7; i++) {
            if ((new Date().getTime() - start) > milliseconds){
                break;
            }
        }
        busyIndicator.running = false
    }

    Button {
        text: "Click"
        onClicked: {
            busyIndicator.running = true
            expensiveOperationDelay.start()
//            sleep(2000)
        }
    }

    BusyIndicator {
        id: busyIndicator
        z: 99
        anchors.centerIn: parent
        running: false
    }
}
导入QtQuick 2.4
导入QtQuick.Controls 1.3
导入QtQuick.Window 2.2
应用程序窗口{
标题:qsTr(“你好世界”)
id:根
宽度:640
身高:480
计时器{
id:expensiveOperationDelay
间隔时间:1
onTriggered:睡眠(2000年)
}
函数睡眠(毫秒){
var start=new Date().getTime();
对于(变量i=0;i<1e7;i++){
如果((新日期().getTime()-start)>毫秒){
打破
}
}
busyIndicator.running=false
}
钮扣{
文本:“单击”
再次点击:{
busyIndicator.running=true
expensiveOperationDelay.start()的费用
//睡眠(2000年)
}
}
总线指示器{
id:总线指示器
z:99
anchors.centerIn:父对象
跑步:错
}
}
我稍微简化了您的示例,因为演示问题不需要对话框


这将启动昂贵操作的责任推到了
计时器上。我给它提供了导致事件被处理的最小可能间隔(我认为
0
的间隔会导致这一点,但显然不会),以便显示指示器。我还必须将指示器的隐藏移到
sleep()
函数的末尾,因为如果我把它放在原来的位置,它会在渲染之前再次隐藏起来。

谢谢,这很有帮助。我尝试过workerscript,但它不起作用。也许我在什么地方弄错了。我自己来试试。