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にレイヤ名を入力