プラグインに表示されるだけでは意味が無いので、プラグインがロードされるときに実行されるinitGui()メソッドに初期化設定を行う。
メニューに追加
メニューに追加するには、http://qgis.org/api/classQgisInterface.htmlにあるメソッドを使う。登録したいメニュー、ツールバー別にメソッドが違うらしい。とりあえずプラグインメニューに入れてみよう。
# -*- coding: utf-8 -*-
”’
Comments
”’
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
class DBtoWMS:
def __init__(self, iface):
self.iface = iface
def initGui(self):
self.action = QAction(u”DB-WMS連携”, self.iface.mainWindow())
self.iface.addPluginToMenu(u”DB-WMS連携プラグイン”, self.action)
def unload(self):
pass<
QGISは、QtというUIフレームワークを利用しているそうだ。C++用だが、そのPython用PyQtを利用するらしい。なので、PyQtとQGISのモジュールを5~7行目でインポート。どれがどれに必要かわからないので、基本的なやつをおまじないのように書いている。あとは、エラーが出た時にしらべて追加して凌いでいる。
initGuiメソッドの中で、Qtのアクションの生成とそのアクションをQGISのプラグインへ追加するようにしている。
いくつかのメソッド名が出ているが、Qgsで始まるのはQGISのもので、QXxxxといのはQt用らしい。今回で言うと、QActionはQtのメソッドでメニューバー、ツールバーのアクションを設定する。
self.ifaceは、プラグインが呼び出されるときにQGISのインタフェースクラス「QgisInterface」が渡されているので、それを__init__()でself.ifaceに割り当てて引き継いでいる。「QgisInterface」のメソッドにメニュー関係のものがそろっているので、その一つaddPluginToMenuを利用してプラグインメニューに追加した。
QActionは、アイコンやショートカットキーなどをパラメータとして持つことが出来るらしい。アイコンはそのうち作ろう。
self.actionは、QActionのインスタンス(インスタンスがPython用語じゃなかったらごめんなさい)を割り当てているだけなので名前はなんでもよろしい。今回actionにしただけ。QActionで作ったアクションをaddうんちゃらでメニューやツールバーに割り当てている。
これで実行すると、メニューに登録される。ってことはあれだ、2つメニューを登録したい場合は、
def initGui(self):
self.action1 = QAction(u”DB-WMS連携”, self.iface.mainWindow())
self.iface.addPluginToMenu(u”DB-WMS連携プラグイン”, self.action1)
self.action2 = QAction(u”DB-WMS連携2″, self.iface.mainWindow())
self.iface.addPluginToMenu(u”DB-WMS連携プラグイン”, self.action2)
ってことですね。出来た!!
メニューに登録しただけなので、クリックしても何も起こらん。。
ダイアログを表示
では、メニュークリックでダイアログを出そう。2個メニューあっても邪魔なので、一個に戻して進めます。
Qtでは、クリックとかのイベントをシグナルというらしい。よってアクションでシグナルが発生した場合に呼び出されるメソッドを登録する。QObject命令を使うらしい。
# -*- coding: utf-8 -*-
”’
Comments
”’
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *class DBtoWMS:
def __init__(self, iface):
self.iface = ifacedef initGui(self):
self.action = QAction(u”DB-WMS連携”, self.iface.mainWindow())
self.iface.addPluginToMenu(u”DB-WMS連携プラグイン”, self.action)QObject.connect(self.action, SIGNAL(“triggered()”), self.dlgMessage)
def unload(self):
passdef dlgMessage(self):
QMessageBox.critical(None, ‘Message’, ‘AHAHAHAHAHA’, QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
これで、「DB-WMS連携」メニューでtriggeredシグナルが発生すると、dlgMessageが呼びだれる設定となる。Qtのオブジェクトがボタンだったらclickedシグナルといった分かりやすいシグナルがある。triggeredってなんだ??わからんがメニューはこれらしい。
dlgMessageの中では、ダイアログボックスを出すQMessageを呼び出す。
動いた!
ヨシ!ダイアログ出す代わりに、行いたい処理を書けば良いってことですな。
次の目標
・アイコンも登録してみるかな。
・プラグイン選んだら、日本が表示されるようにマップを動かしてみる。
・しかし、ソースの素敵な書き方がわからんぞ、このブログシステム