qgis插件中未阻止执行方法

2024-10-01 15:44:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个QGIS插件,它是一个复杂的插件,包含各种调用其他方法的类和方法。 我的插件工作得很好,但我正努力在后台运行一些类方法(类似于JAVA中的作业),以避免冻结GUI。我的意思是,我有一个类,这个类有一个方法,这个方法我想在后台运行

我尝试了QThread、QTask、threading、QProcess等,但没有找到我想要做的事情

有什么主意可以帮我吗?一些插件是否与后台进程一起工作?一些插件的例子

谢谢


Tags: 方法插件进程作业guijava事情后台
3条回答

谢谢你的回答

我要做的是在后台运行一个方法,而不冻结QGIS GUI 我的代码示例

class Example:
  def __init__(self):
      code
      self.createBotton()

  def createButton(self):
      Here I create my button
      self.okbutton.clicked.connect(self.pressOkButton)

  def pressOkButton(self):
      here I call other methods
      self.methodA()
      self.methodB()

  def methodA(self):
      code
  def methodB(self):
      code

我的问题是>;如何在后台运行“pressOkButton”方法?当我执行这个方法时,在完成这个方法之前,我不能与QGIS GUI交互

注意:考虑到它是属于我的插件的一个类,所以在启动插件时会实例化这个类

如果我理解正确,您希望刷新UI以避免QGIS冻结。 这就是我的工作原理:

from PyQt5.QtWidgets import QApplication

QApplication.processEvents() 

这将刷新QGIS的UI。 您可能需要多次调用它,例如在for循环中的每次迭代之后

我一直在使用QTask,以便在后台运行繁重的进程。 我使用的有用资源如下:

您必须专门创建一个从QgsTask继承的新类,并在GUI插件的run()方法中调用它

就我而言,这就是我所拥有的:

class MyPlugin:
"""QGIS Plugin Implementation.
    ... __init__ method, tr method, initGui method, ...
"""
    def run(self):
        """Run method that performs the work after clicking 'OK' in the Plugin GUI"""
        task = MyTask('UserFriendlyTaskName', **props)
        QgsApplication.taskManager().addTask( task )


class MyTask(QgsTask):
    def __init__(self, task_name, **props):
        QgsTask.__init__(self, desc)
        # do w/e with the props
    def run(self):
        # call your heavy processes

请参见下面的.gif,了解QGIS3中的UI呈现,没有冻结,我仍然可以在插件运行时在地图上移动并编辑数据

QGIS GUI Launch Background Process GIF

希望这个答案能及时找到你

相关问题 更多 >

    热门问题