PythonとQtでダイアログ表示

Pythonを使ってQGISのプラグインを作るにあたり、QTダイアログについて調べる

QTデザイナを起動して「新規作成」→「Dialog without Buttons」を選択。
clip_2

ボタンを配置し、ui_sampleDlg.uiに保存。

clip_4

pyuic4を使用してuiファイルをPythonファイルに変換

pyuic4 ui_sampleDlg.ui -o ui_sampleDlg.py

※pyuic4.batを使うためにC:\OSGeo4W\binにPATHを通す。
環境変数PYTHONHOMEが設定されていなければpyuic4.batに以下の行を追加

SET PYTHONHOME=C:\OSgeo4w\apps\Python27

変換後のui_sampleDlg.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'ui_sampleDlg.ui'
#
# Created: Sat Apr 23 07:01:53 2016
#      by: PyQt4 UI code generator 4.11.3
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName(_fromUtf8("Dialog"))
        Dialog.resize(400, 300)
        self.pushButton = QtGui.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(300, 20, 75, 23))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(_translate("Dialog", "Dialog", None))
        self.pushButton.setText(_translate("Dialog", "PushButton", None))

作成したユーザーインターフェイスを呼び出すクラスをQDialogから派生して作成
クラス名はSampleDlg、ファイル名はSampleDlg.pyとする。
※ifaceは

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'DlgTest.ui'
#
# Created: Wed Apr 20 16:59:11 2016
#      by: PyQt4 UI code generator 4.11.3
#
# WARNING! All changes made in this file will be lost!

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
from ui_sampleDlg import Ui_Dialog

class SampleDlg(QDialog):

    def __init__(self, iface):
        QDialog.__init__(self)
        self.iface = iface
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)

プラグインからSampleDlgクラスの表示

from SampleDlg import SampleDlg
dlg = SampleDlg(self.iface)
dlg.show()
dlg.exec_() 

以上で正しく表示される

clip_5

次はボタンが押されたらダイアログを閉じるように設定

SampleDlgクラスでボタンのシグナル引っ掛けてダイアログのcloseを呼ぶ

class SampleDlg(QDialog):

    def __init__(self, iface):
        ・・・
        QObject.connect(self.ui.pushButton, SIGNAL("clicked()"), self.pushButton)

    @pyqtSlot()
    def pushButton(self):
        self.close()

以上で終了