1. 程式人生 > >QML中呼叫C++耗時操作造成阻塞的解決辦法

QML中呼叫C++耗時操作造成阻塞的解決辦法

  在QML中經常會呼叫用C++寫的比較耗時的操作時,一般會造成介面的卡死。剛開始的時候是想著是不是可以在QML中開闢新執行緒,一查還真有,WorkerScript。但這玩意兒有點坑的是你不能訪問其他物件的屬性、方法,官方原文是這樣寫的:   Since the WorkerScript.onMessage() function is run in a separate thread, the JavaScript file is evaluated in a context separate from the main QML engine. This means that unlike an ordinary JavaScript file that is imported into QML, the script.js in the above example cannot access the properties, methods or other attributes of the QML item, nor can it access any context properties set on the QML object through QQmlContext.

這樣的話很多地方就會受限了。後來看了安曉輝老師的Qt Quick核心程式設計,裡面有一章節講的C++與QML混合程式設計,其中有一個例子講的是影象處理,他其實是使用訊號槽的方式將QML中的同步操作改成了非同步操作,所以我後來的解決辦法是這樣的。   建立一個C++橋接類並註冊到QML中,該類用於和QML進行互動。在該類中將比較耗時的操作放入單獨的執行緒進行執行。邏輯順序是這樣的,QML中 先執行橋接類的觸發執行訊號的函式,並進行必要的傳參;橋接類發出執行訊號後,相應的處理執行緒啟動,處理執行緒處理完畢後,會發出訊號,橋接類收到訊號後也會發出完成訊號。此時,在QML中做好連線(Connections),收到完成訊號後,將結果傳到QML中,這樣的話整個耗時的操作就會在C++中執行,同時也不會阻塞主執行緒。