Help us understand the problem. What is going on with this article?

PySideでダイアログ / ウィジェットのGUIに.uiファイルを指定する方法

More than 3 years have passed since last update.

はじめに

PySideはQtの派生であるため、GUIを開発する際にはQtDesignerというツールが便利です。
これは所謂RADツールで、GUIを可視的に開発することができます。結果、作成されるのは「.uiファイル」というものですが、PySideのソースコード内(.pyファイル)から扱うのに若干の癖がある(QtやPyQtと異なる)ので忘備録として記事を作成しておきます。

QtCreaterに統合された部分を使うことも出来ますが、QtDesigner単体で使用したい場合には以下のようなディレクトリにあるかと思います。QtDesignerの使い方は習うより慣れろであるのと、Qt方面からの詳しい解説がいくつもあるので割愛します。

C:\Python\Lib\site-packages\PySide\designer.exe

ダイアログのGUIを.uiファイルで設定する

一番シンプルな形は以下の通り。dialog.uiというGUI記述ファイルを作成済み前提とします。
QUiLoaderで.uiファイルを読み込み、show()関数で表示するという流れです。

import sys
from PySide.QtCore import *
from PySide.QtGui import *
from PySide.QtUiTools import QUiLoader

class Dialog(QDialog):

    def __init__(self, parent = None):
        super(Dialog, self).__init__(parent)

        # QUiLoaderで.uiファイルを読み込む
        self.dialogUi = QUiLoader().load("./dialog.ui")


if __name__ == '__main__':
    # Qt Applicationを作ります
    app = QApplication(sys.argv)
    # formを作成して表示します
    mainWin = Dialog()
    mainWin.dialogUi.show()
    # Qtのメインループを開始します
    sys.exit(app.exec_())

.uiファイル内に記述したGUI部品を操作する

QtDesignerの右上で編集できるオブジェクト名を指定して行います。

import sys
from PySide.QtCore import *
from PySide.QtGui import *
from PySide.QtUiTools import QUiLoader

class Dialog(QDialog):

    def __init__(self, parent = None):
        super(Dialog, self).__init__(parent)

        self.dialogUi = QUiLoader().load("./dialog.ui")

        # ラベルのテキストを設定する
        self.dialogUi.label.setLabel("Hello!")
        # ボタンを押すとラベルのテキストを変更する
        self.dialogUi.pushButton.clicked.connect(lambda: self.dialogUi.label.setLabel("World!"))


if __name__ == '__main__':
    # Qt Applicationを作ります
    app = QApplication(sys.argv)
    # formを作成して表示します
    mainWin = Dialog()
    mainWin.dialogUi.show()
    # Qtのメインループを開始します
    sys.exit(app.exec_())

ウィジェッドのGUIを.uiファイルで設定し、ダイアログに追加する

以下の通りです。

import sys
from PySide.QtCore import *
from PySide.QtGui import *
from PySide.QtUiTools import QUiLoader

class Dialog(QDialog):

    def __init__(self, parent = None):
        super(Dialog, self).__init__(parent)

        self.dialogUi = QUiLoader().load("./dialog.ui")

        self.dialogUi.label.setText("Hello!")
        self.dialogUi.pushButton.clicked.connect(lambda: self.dialogUi.label.setText("World!"))

        # QUiLoaderでuiファイルを読み込む
        self.widgetUi = QUiLoader().load("./widget.ui")
        # ダイアログのメインレイアウトにウィジェットを追加する
        self.dialogUi.verticalLayout.addWidget(self.widgetUi)


if __name__ == '__main__':
    # Qt Applicationを作ります
    app = QApplication(sys.argv)
    # formを作成して表示します
    mainWin = Dialog()
    mainWin.dialogUi.show()
    # Qtのメインループを開始します
    sys.exit(app.exec_())

終わりに

PySideにおける.uiファイルの取り扱い方は以上です。

実はPySideで.uiファイルを用いたGUIの設定では一つ困った点があります。
__init__()関数内にself.show()を追記するか、if __name__ == '__main__':のメインループ内にmainWin.show()を追記すると、QtDesignerで作成したGUIとは別にまっさらなウィンドウが表示されます。これは元々、QDialogクラスを継承し作成したDialogクラス自身のGUIで、現状(PySide1.2.2)では.uiファイルをこちらに当てる方法はないようです。
Python3、Qt5に対応するべくPySide2が開発真っ最中なようなので、ここも改善されたらなぁと思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away