UIの作成 その2でUIを作成し、表示まで行いました。
軽い機能を追加して、UI作成編終了です。
機能として、選択レイヤの名前変更を追加していきます。
実装すること
1.OKボタンで入力されている内容にレイヤ名を変更
2.選択されているレイヤが変更されたら、表示を変更
3.何も選択されていない場合のエラー処理
新しく使う要素としては、特にありません。
QtのSIGNAL・SLOTをさらに使うことになるだけです。
まずは、「OKボタンで入力されている内容のレイヤ名を変更」
def set_layer_name(self): # レイヤ名を変更する layer = self.iface.activeLayer() if not layer: # レイヤが選択されていない場合 return new_layer_name = unicode(self.fom.lineEdit.text()) # lineEditに入力された文字を取得 layer.setLayerName(new_layer_name) # レイヤを新しいレイヤ名に変更
UIにあるテキスト入力画面LineEditからテキストを取得し
レイヤオブジェクトのレイヤ名変更関数にテキストを渡します。
レイヤオブジェクトが取得できない場合は、取得します。
最後に、OKボタンが押されるタイミングに実行されるようにして完了です。
self.fom.accepted.connect(self.set_layer_name) # UIのOKボタンが押されたときに、実行する
OKボタンといいながらダイアログの信号に反応するようにしました。
QtDisigerの初期設定で、OKボタンが押されたときに
ダイアログの信号を発信するようになっています。
なので、ダイアログの方にしました。
さて、次に入ってみましょう。
「選択されているレイヤが変更されたら、表示を変更」
今回はQGISのSIGNALを使います。
選択しているレイヤが変わるとSIGNALを発信する物があります。
それとつなぐと、引数としてレイヤオブジェクトがもらえます。
その使用にあわせて、関数を作成します。
def change_current_layer(self, layer): # lineEditを現在の選択レイヤの名前に変更 if not layer: # レイヤが選択されていない場合 return layer_name = unicode(layer.name()) self.fom.lineEdit.setText(layer_name) # lineEditにレイヤ名を入力
レイヤオブジェクトを引数として、レイヤ名を取得後
lineEditにレイヤ名を入力する。
レイヤオブジェクトが取得できなかった場合、終了することをお忘れなく。
そして、関数とSIGNALをCONNECTさせます。
self.iface.currentLayerChanged.connect(self.change_current_layer)
軽く整理して、こんな感じになりました。
これで実装終了、UI作成編終了になります。
# -*- coding: utf-8 -*- from PyQt4.QtGui import QAction, QIcon import os class plugin(object): def __init__(self, iface): self.iface = iface self.fom = None def initGui(self): icon_path = os.path.dirname(__file__) + u'\icon/qgis-icon.png' self.action = QAction(QIcon(icon_path), "pluginTemple", self.iface.mainWindow()) self.action.triggered.connect(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) if self.fom: # 一度での実行された場合 self.iface.currentLayerChanged.disconnect( self.change_current_layer) def run(self): from ui_con import Form self.fom = Form(self.iface.mainWindow()) self.change_current_layer(self.iface.activeLayer()) # 初期設定 現在の選択されているレイヤの名前をセット self.fom.accepted.connect(self.set_layer_name) # UIのOKボタンが押されたときに、実行する self.iface.currentLayerChanged.connect( self.change_current_layer) # 選択されているレイヤが変更されたときに実行する self.fom.show() def set_layer_name(self): # レイヤ名を変更する layer = self.iface.activeLayer() if not layer: # レイヤが選択されていない場合 return new_layer_name = unicode(self.fom.lineEdit.text()) # lineEditに入力された文字を取得 layer.setLayerName(new_layer_name) # レイヤを新しいレイヤ名に変更 def change_current_layer(self, layer): # lineEditを現在の選択レイヤの名前に変更 if not layer: # レイヤが選択されていない場合 return layer_name = unicode(layer.name()) self.fom.lineEdit.setText(layer_name) # lineEditにレイヤ名を入力