在我的.qml文件中,当按下ssl
时,它会发出信号,并采取一些措施。此操作需要很长时间(它正在加密数据),并且我希望按钮在此操作开始之前先“松开”自身,因此我可以在顶部显示进度条。
我知道Qt具有事件循环,并且某种程度上,我需要在此事件循环之后或GUI完成所有对象的Paint()时发出此信号,因此该按钮未显示。
这是怎么做的?
这是在信号上执行的代码,繁重的过程是Button
,在台式机上花费2秒,在Android上花费10秒:
aewm_obj.save_account(key,account)
问题是,带有进度条的对话框会在繁重的过程完成后显示,但之前却被调用。发生这种情况是因为显示和隐藏组件的事件循环处理得太晚了。
答案 0 :(得分:1)
使用超时为0的单发计时器将事件排队,该事件将在返回事件循环后触发。在C ++中,通常如下所示:
QTimer::singleShot(0, [] { /* do something */ });
QML等效项是:
Timer {
interval: 0; running: true; repeat: false
onTriggered: /* do something */
}
答案 1 :(得分:-1)
阅读本文后:https://doc.qt.io/archives/qq/qq27-responsive-guis.html
我在我的C ++函数中添加了代码,以在开始繁重的过程之前处理所有事件。这样,我清空事件队列,并且GUI更新自动显示进度条对话框。 (一种所有QML对象的repaint())
for (int i=0; i<10000; i++) {
QCoreApplication::sendPostedEvents();
QCoreApplication::processEvents();
}
与2秒的处理时间相比,此循环引起的延迟不明显。在Android上需要10,000次迭代,而在桌面上10次迭代就足够了。使用少量迭代,由于淡入淡出效果,对话框将显示为不完全不透明。