强制刷新Qt Quick界面

5

我正在构建一个Qt Quick QML应用程序,其中一个按钮启动一个需要一段时间才能运行的进程。我想让用户知道程序实际上正在执行某些操作,但如果我像下面这样做:

Button {
    text: "Click me"
    onClicked: {
        text = "Loading..."
        backend.longRunningFunction()
        text = "Click me"
     }
}

当我点击按钮时,GUI 会在 backend.longRunningFunction() 运行时冻结,然后恢复正常。但文本永远不会改变;它始终显示“点击我”。在 onClicked 函数中是否有一种方法可以强制更新 UI,类似于 qApp.processEvents()

3
阅读:http://doc.qt.io/qt-5/qtquick-performance.html#timing-considerations请阅读此链接,它讨论了QtQuick应用程序的性能和定时问题。 - eyllanesc
1
可能使用WorkerScript吗? - folibis
2个回答

0
在C++中,您可以通过调用以下方法来强制更新GUI:
QCoreApplication::processEvents();

你的 longRunningFunction 中的第一件事。

你可以通过在同一个类中创建一个 c++ 函数来使其更通用,例如

void Backend::updateUI() 
{
    QCoreApplication::processEvents();
}

然后在你的 onClicked 中调用它

onClicked: {
    button1.text = "Loading..."
    backend.updateUI()
    backend.longRunningFunction()
    button1.text = "Click me"
}

QT 推荐的方法是生成一个 QThread 来运行 longRunningFunction 的实际长时间运行部分,并从该线程发送一个 done 信号来更新 button1.text。

-2

可以尝试这样做:

Button {
id: button1
text: "Click me"
onClicked: {
    button1.text = "Loading..."
    backend.longRunningFunction()
    button1.text = "Click me"
 }}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接