qgis插件开发:如何添加删除按钮动作?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
最近在研究qgis
插件,偶尔有点小小结论,在这边做一些总结。本篇教程就说一下,如何添加一个工具栏图标,并定义事件。从已知的信息来说,qgis
插件能做的事情有点多(意思是有点超出插件的边界了)。如果大家做这方面的开发的话,估计也会有类似的感受的。
本文测试环境:qgis@3.16.14-hannover
,win10
。本文项目代码基于qgis
插件qgis plugin builder
创建。详见如下链接:
最佳方案
在builder
生成的默认代码里面,有个add_action
的函数,
def add_action(
self,
icon_path,
text,
callback,
enabled_flag=True,
add_to_menu=True,
add_to_toolbar=True,
status_tip=None,
whats_this=None,
parent=None):
icon = QIcon(icon_path)
action = QAction(icon, text, parent)
action.triggered.connect(callback)
action.setEnabled(enabled_flag)
if status_tip is not None:
action.setStatusTip(status_tip)
if whats_this is not None:
action.setWhatsThis(whats_this)
if add_to_toolbar:
# Adds plugin icon to Plugins toolbar
self.iface.addToolBarIcon(action)
if add_to_menu:
self.iface.addPluginToMenu(
self.menu,
action)
self.actions.append(action)
return action
调用这个函数是最明智的选择,具体的含义可以参考下面的函数分解。
调用这个函数生成的按钮,在unload
的时候,会自动删除,并不需要做任何的销毁操作。这是因为在unload()
里面,对self.actions
进行遍历,然后挨个尝试remove()
。而对self.actions
的添加操作,正是在上述add_action()
中进行添加的。
def unload(self):
for action in self.actions:
self.iface.removePluginMenu(
self.tr(u'&SuTest'),
action)
self.iface.removeToolBarIcon(action)
在qgis
插件里面,一个菜单或者一个图标,这都叫做action
。无法理解...
函数动作分解
相关代码理论上来说,放在哪里执行都可以。一般来说,放在<项目名>.py
文件中的initGui()
函数里面比较合适。这些代码和addAction()
函数里面也并不一致,仅作理解上使用。
添加按钮到工具栏的代码如下:
顶部import
部分
from qgis.PyQt.QtGui import QIcon
from qgis.PyQt.QtWidgets import QAction
import os.path
初始化一个按钮,并关联事件iconAction
icon = QIcon(os.path.dirname(__file__) + "/images/icon.svg")
self.theIcon = QAction(icon, "按钮提示文字", self.iface.mainWindow())
self.theIcon.setObjectName('testIcon')
self.theIcon.setStatusTip("底部状态栏文字提示信息")
self.theIcon.triggered.connect(self.iconAction)
添加到工具栏
self.iface.addToolBarIcon(self.theIcon)
添加到系统菜单
self.iface.addPluginToMenu("父级菜单文字", self.theIcon)
对应的事件函数
iconAction()
:
def iconAction(self):
print("action")
pass
删除这个按钮
一般定义在unload()
函数里面:
self.iface.removeToolBarIcon(self.theIcon)
self.iface.removePluginMenu('父级菜单文字', self.theIcon)
特殊情况
图片路径请写这种动态的绝对地址,如果图片没有找到的话,会使用tip
文字来代替图片。
出现了多个重复的图标按钮,那是因为在unload()
里面没有删除图标的代码。
相关链接
- https://newsn.net/say/qgis-plugin.html
- https://www.osgeo.cn/qgisdoc/docs/pyqgis_developer_cookbook/cheat_sheet.html#toolbars
总结
图标显示出来之后,还是需要去定义相关action
,才能具体完成逻辑业务。更多qgis
插件开发文章,请点击苏南大叔的博客:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。