我正在开发一个QGIS插件,具有调用其他方法的各种类和方法的复杂插件。我的插件运行良好,但我希望在后台运行一些类方法(类似于JAVA中的作业),以避免GUI冻结。我的意思是,我有一个类,这个类有一个方法,这个方法我想在后台运行
我尝试过QThread、QTask、threading、QProcess等,但我没有找到我想要做的事情。
有什么办法能帮到我吗?一些插件可以和后台进程一起工作吗?一些插件的例子?
谢谢
发布于 2021-04-08 17:34:38
如果我理解正确的话,您希望刷新UI以避免QGIS冻结。这是对我有效的方法:
from PyQt5.QtWidgets import QApplication
QApplication.processEvents() 这将刷新QGIS的UI。您可能需要多次调用它,例如,在for循环中的每次迭代之后。
发布于 2021-04-11 02:15:51
谢谢你的回答
我要做的是在后台运行一个方法,而不冻结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交互
注意:考虑到它是属于我的插件的一个类,所以这个类在启动插件时被实例化
发布于 2021-05-04 21:57:48
我一直在使用QTask,以便在后台运行繁重的进程。我正在使用的有用资源如下:
您必须专门创建一个继承自QgsTask的新类,并在您的图形用户界面插件的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关于QGIS3中的UI渲染,请参见下面的.gif,没有冻结,当插件运行时,我仍然可以在地图上移动和编辑数据。
QGIS GUI Launch Background Process GIF
希望这个答案能及时找到你!
https://stackoverflow.com/questions/66943433
复制相似问题