需要在qgis插件里面,执行一个耗时操作。这个操作进行的时候,界面会假死。点击任何按钮都不会有反应。在耗时函数执行期间,任何更新ui的操作也不会被执行。

苏南大叔:qgis插件开发:利用thread解决界面假死问题 - qgis-plugin-thread
qgis插件开发:利用thread解决界面假死问题(图1-1)

这个问题该如何解决呢?如何避免这种耗时操作里面的界面假死问题呢?这个解决方案就是thread。测试环境:win10qgis@3.16.15-hannover

错误的写法

正常来说,并不能称之为错误的写法,但是由于是耗时操作,这种传统的写法就不行了。比如:

import time
def 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 Thread
def 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,就不会影响主界面的相应了。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。