今回はQGISでPythonプラグインを作成するの続編です。
前回は空のプラグインをQGISに追加するというものでした。
前回のままでは何もできないので
プラグインを実行するためのアクション(アイコン)と処理を追加していきます。
アクションとは、赤枠で囲んでいる物のことです。
今回ではUIに触れます。
QGISはUIがQtで作られています。
UIに触るときには、Qtの関数に触れることになります。
QGISの関数はQtの関数を継承した物が多いので、よく触ることになります。
Qtの関数を知っていると、できることが増えるので覚えていきましょう。
編集するファイルは、plugin.pyのみです。
プラグインの読み込み時に、メニューとツールバーにアイコンを追加していきます。
まずは必要な関数をインポートします。
# Qtの関数 from PyQt4 import QtCore from PyQt4 import QtGui import os
次にプラグインの読み込み時に、実行されるinitGuiに書き加えていきます。
icon_path = os.path.dirname(__file__) + u'\icon/qgis-icon.png'
表示するアイコンの画像を指定します。
__file__でpyファイルの位置を取得し、os.path.dirnameでディレクトリ名を取得しています。
画像はQGISのアイコンを使用します
self.action = QtGui.QAction(QtGui.QIcon(icon_path), "pluginTemple", self.iface.mainWindow())
ツールバーやメニューに追加できるようにQActionを作成します。
QActionの引数は、アイコンに使う画像, 名前, 親になるウィンドウ
画像はQt上で使用できるようにQIconクラスにします。
名前は適当なものにしました。
親になるウィンドウとして、iface.mainWindowでQGISの大元のウィンドウを取得して、指定します。
self.iface.addToolBarIcon(self.action) self.iface.addPluginToMenu("pluginMenu txt", self.action)
作成したQActionをツールバーとメニューに追加します。
追加には、QGISの関数を使用しています。
今回はプラグインのメニューとツールバーに追加しますが、
他のところにも追加でき、追加する関数も用意されています。
結果、下記のinitGuiになります。
def initGui(self): icon_path = os.path.dirname(__file__) + u'\icon/qgis-icon.png' self.action = QtGui.QAction(QtGui.QIcon(icon_path), "pluginTemple", self.iface.mainWindow()) QtCore.QObject.connect(self.action, QtCore.SIGNAL("triggered()"), self.run) self.iface.addToolBarIcon(self.action) self.iface.addPluginToMenu("pluginMenu txt", self.action)
この状態でプラグインを追加すると、アイコンが追加されます。
このままではプラグインをアンロードされても、アイコンが残ったままになります。
アンロードされたときに、ツールバーとメニューに追加してアクションを取り除くようにしておきます。
def unload(self): self.iface.removePluginMenu("pluginMenu txt", self.action) self.iface.removeToolBarIcon(self.action)
最後に追加したアクションがクリックされると
プラグインに追加した関数を実行するようにします。
まず実行される関数を作成します。
def run(self): QtGui.QMessageBox.information(self.iface.mainWindow(), 'Plugin', 'Hello World')
runという名前で関数を作成します。
関数の内容はメッセージボックスを出すものです。
QtにQMessageBoxというクラスを使って、メッセージボックスを出します。
引数は、親ウィンドウ、ウィンドウタイトル、メッセージ
QtCore.QObject.connect(self.action, QtCore.SIGNAL("triggered()"), self.run)
次にアイコンがクリックされたら、関数を実行するようにします。
Qtにはシグナルが発信されるにあわせて、関数を実行するように設定できます。
引数として、シグナルを発信するオブジェクト、反応するシグナル、実行する関数
initGuiのQActionを作成した後ろに追加します。
これでアイコンをクリックすると、メッセージボックスが出るようになります。
最終的なplugin.pyが以下のものになります。
# -*- coding: utf-8 -*- from PyQt4 import QtCore from PyQt4 import QtGui import os class plugin(object): def __init__(self, iface): self.iface = iface def initGui(self): icon_path = os.path.dirname(__file__) + u'\icon/qgis-icon.png' self.action = QtGui.QAction(QtGui.QIcon(icon_path), "pluginTemple", self.iface.mainWindow()) QtCore.QObject.connect(self.action, QtCore.SIGNAL("triggered()"), self.run) self.iface.addToolBarIcon(self.action) self.iface.addPluginToMenu("pluginMenu txt", self.action) def unload(self): self.iface.removePluginMenu("pluginMenu txt", self.action) self.iface.removeToolBarIcon(self.action) def run(self): QtGui.QMessageBox.information(self.iface.mainWindow(), 'Plugin', 'Hello World')
まだまだアイコンができてメッセージが表示できたところですが、
とりあえず今回はここまで。