事件循环后执行信号

时间:2018-11-08 21:47:38

标签: qt qml

在我的.qml文件中,当按下ssl时,它会发出信号,并采取一些措施。此操作需要很长时间(它正在加密数据),并且我希望按钮在此操作开始之前先“松开”自身,因此我可以在顶部显示进度条。

我知道Qt具有事件循环,并且某种程度上,我需要在此事件循环之后或GUI完成所有对象的Paint()时发出此信号,因此该按钮未显示。

这是怎么做的?

这是在信号上执行的代码,繁重的过程是Button,在台式机上花费2秒,在Android上花费10秒:

aewm_obj.save_account(key,account)

问题是,带有进度条的对话框会在繁重的过程完成后显示,但之前却被调用。发生这种情况是因为显示和隐藏组件的事件循环处理得太晚了。

2 个答案:

答案 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次迭代就足够了。使用少量迭代,由于淡入淡出效果,对话框将显示为不完全不透明。