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++中执行,同时也不会阻塞主线程。

你可能感兴趣的:(Qt,QML)