QGISのPythonプラグイン作成 –UIの作成 その3–

UIの作成 その2でUIを作成し、表示まで行いました。
軽い機能を追加して、UI作成編終了です。

changelayername

機能として、選択レイヤの名前変更を追加していきます。

実装すること
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にレイヤ名を入力

コメントを残す

メールアドレスが公開されることはありません。