QML Button onClicked函数执行顺序

时间:2018-10-31 16:09:43

标签: c++ qt qml

我有一个具有onClicked功能的按钮。有一个C ++类Middle,通过qmlRegisterType连接了函数search_connection。

我想做的是在C ++函数计算返回值的同时更改searchButton的文本,并同时禁用该按钮。

什么都没发生。该按钮始终以文本“搜索”启用。我相信实际发生的是,首先执行了search_connection函数,而其余所有函数发生得如此之快,以至于我无法注意到从“ Search”到“ Searching ...”的更改,然后再返回。

TextField {
   id: startStop
}

TextField {
   id: finishStop
}

Button {
   id: searchButton
   text: qsTr("Search")

   onClicked: {
      text = qsTr("Searching...")
      enabled = false;
      searchResult.text = middle.search_connection(startStop.text,finishStop.text)
      enabled = true;
      text = qsTr("Search")
   }
}

在将文本更改为“正在搜索...”之后,有人知道如何使Qt调用该函数吗?

1 个答案:

答案 0 :(得分:1)

您的用户界面将在下次调用事件循环时重新绘制某些区域。在您的情况下,这永远不会发生,因为直接调用插槽(您的函数)并阻塞应用程序,直到完成为止。有几种方法可以避免这种阻塞:

  • 将您的任务移至另一个线程(QThread)并等待完成
  • 使用计时器(QML-Timer)启动您的任务。您可以在启动该方法之前重绘按钮,但是在该方法完成之前,您的GUI仍然会阻塞(对 enabled 所做的更改将无用)。
  • 在您的方法内多次调用processEvents()(建议,这会导致问题)。

如果该方法需要一些时间,我将使用一个新线程。因此,您的gui不会被阻止,您的按钮仍会收到事件(绘画,鼠标等)。

编辑1:

如果您的C ++代码很简单并且可以转换为JavaScript代码,则也可以使用WorkerScript。这是QThread的QML版本。但是它有一些局限性。您只能使用JavaScript,并且不能在运行时与Worker进行交互。

感谢树叶的建议。