在qml中,当filedialog中接受对话框时,如何显示busyIndicator?
当用户在FileDialog中接受文件名后,应用程序正在处理任务,但主线程似乎被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(“
导入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,但它不起作用。也许我在什么地方弄错了。我自己来试试。