强制刷新Qt Quick中的界面

时间:2018-01-01 13:40:19

标签: qt qml qt5 qtquick2

我正在构建一个Qt Quick QML应用程序,一个按钮启动一个需要一段时间才能运行的进程。我想让用户知道程序实际上在做什么,但是如果我这样做的话:

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

单击按钮时,GUI会在backend.longRunningFunction()运行时冻结,然后恢复正常。但是文本永远不会改变;它总是写着“点击我”。

我是否有办法强制用户界面在onClicked功能中进行更新,例如qApp.processEvents()

2 个答案:

答案 0 :(得分: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 推荐的方法是生成 longRunningFunction 的实际长时间运行部分的 QThread,并从该线程发送完成信号以更新 button1.text。

答案 1 :(得分:-1)

尝试这样的事情:

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