最近在研究qgis插件,偶尔有点小小结论,在这边做一些总结。本篇教程就说一下,如何添加一个工具栏图标,并定义事件。从已知的信息来说,qgis插件能做的事情有点多(意思是有点超出插件的边界了)。如果大家做这方面的开发的话,估计也会有类似的感受的。

苏南大叔:qgis插件开发:如何添加删除按钮动作? - qgis-plugin-icon
qgis插件开发:如何添加删除按钮动作? (图7-1)

本文测试环境:qgis@3.16.14-hannoverwin10。本文项目代码基于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

调用这个函数是最明智的选择,具体的含义可以参考下面的函数分解。

苏南大叔:qgis插件开发:如何添加删除按钮动作? - qgis-addaction-addicon
qgis插件开发:如何添加删除按钮动作? (图7-2)

调用这个函数生成的按钮,在unload的时候,会自动删除,并不需要做任何的销毁操作。这是因为在unload()里面,对self.actions进行遍历,然后挨个尝试remove()。而对self.actions的添加操作,正是在上述add_action()中进行添加的。

苏南大叔:qgis插件开发:如何添加删除按钮动作? - qgis-addaction-removeicon
qgis插件开发:如何添加删除按钮动作? (图7-3)

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()函数里面也并不一致,仅作理解上使用。

苏南大叔:qgis插件开发:如何添加删除按钮动作? - qgis-plugin-ui
qgis插件开发:如何添加删除按钮动作? (图7-4)

添加按钮到工具栏的代码如下:

顶部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)

苏南大叔:qgis插件开发:如何添加删除按钮动作? - qgis-plugin-ui2
qgis插件开发:如何添加删除按钮动作? (图7-5)

添加到系统菜单

self.iface.addPluginToMenu("父级菜单文字", self.theIcon)

苏南大叔:qgis插件开发:如何添加删除按钮动作? - plugin-2-menu
qgis插件开发:如何添加删除按钮动作? (图7-6)

对应的事件函数

iconAction()

def iconAction(self):
    print("action")
    pass

删除这个按钮

一般定义在unload()函数里面:

self.iface.removeToolBarIcon(self.theIcon)
self.iface.removePluginMenu('父级菜单文字', self.theIcon)

特殊情况

图片路径请写这种动态的绝对地址,如果图片没有找到的话,会使用tip文字来代替图片。

苏南大叔:qgis插件开发:如何添加删除按钮动作? - qgis-plugin-ui3
qgis插件开发:如何添加删除按钮动作? (图7-7)

出现了多个重复的图标按钮,那是因为在unload()里面没有删除图标的代码。

相关链接

总结

图标显示出来之后,还是需要去定义相关action,才能具体完成逻辑业务。更多qgis插件开发文章,请点击苏南大叔的博客:

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