qgis插件开发:利用thread解决界面假死问题
发布于 作者:苏南大叔 来源:程序如此灵动~
需要在qgis插件里面,执行一个耗时操作。这个操作进行的时候,界面会假死。点击任何按钮都不会有反应。在耗时函数执行期间,任何更新ui的操作也不会被执行。

这个问题该如何解决呢?如何避免这种耗时操作里面的界面假死问题呢?这个解决方案就是thread。测试环境:win10,qgis@3.16.15-hannover。
错误的写法
正常来说,并不能称之为错误的写法,但是由于是耗时操作,这种传统的写法就不行了。比如:
import timedef main():
# ...
self.iface.messageBar().pushMessage("start", level=Qgis.Success, duration=3)
for i in range(5):
time.sleep(1)
self.iface.messageBar().pushMessage("proccessing", level=Qgis.Success, duration=3)
self.iface.messageBar().pushMessage("done", level=Qgis.Success, duration=3)正确的写法
import time
from threading import Threaddef main():
# ...
self.iface.messageBar().pushMessage("start", level=Qgis.Success, duration=3)
self.handleCalc()def handleCalc(self):
def calc():
for i in range(5):
time.sleep(1)
self.iface.messageBar().pushMessage("proccessing", level=Qgis.Success, duration=3)
self.iface.messageBar().pushMessage("done", level=Qgis.Success, duration=3)
t1 = Thread(target=calc)
t1.start()在函数里面,嵌套一个函数,然后发起一个Thread,最后thread.start()。
相关链接
总结
总之,就是把耗时操作都单开一个线程thread,就不会影响主界面的相应了。