PyQtでサブウィンドウを作る

はじめに

いつも検索しちゃうのでメモ
QtDesignerで作ったオリジナルなダイアログを出したい時の話
PyQt5で書いてるけど4でも大体同じ

ウィンドウを作る

予め2つのウィンドウを作成します
メインの画面はMainWindowを使って作り
サブの画面はFormを使って作成します

コンバート

いつも通りpyファイルを生成する

1$ pyuic5 mainwindow.ui > ui_mainwindow.py
2$ pyuic5 subwindow.ui > ui_subwindow.py

コード

 1# -*- coding: utf-8 -*-
 2
 3import sys
 4from PyQt5 import QtWidgets
 5
 6
 7class SubWindow(QtWidgets.QDialog):
 8    def __init__(self, parent=None):
 9        QtWidgets.QDialog.__init__(self, parent)
10        self.ui = Ui_SubWindow()
11        self.ui.setupUi(self)
12
13    def show(self):
14        self.exec_()
15
16class MainWindow(QtWidgets.QMainWindow):
17    def __init__(self, parent=None):
18        QtWidgets.QMainWindow.__init__(self, parent)
19        self.ui = Ui_MainWindow()
20        self.ui.setupUi(self)
21
22        self.sub = SubWindow(self)
23
24    def openDialog(self):
25        self.sub.show()
26
27if __name__ == "__main__":
28    app = QtWidgets.QApplication(sys.argv)
29    myapp = MainWindow()
30    myapp.show()
31    sys.exit(app.exec_())

こんな感じでオリジナルなダイアログが作れる
ダイアログ側も普段通り作れば動くのでメインウィンドウな気分で作れば良い
もしダイアログ開いててもメインウィンドウが操作したいような挙動を求める場合はSubWindowクラスのshow関数を消せばダイアログを出しつつ下のメインウィンドウも操作出来るようになる
サブウィンドウからメインウィンドウへ値を渡したい時はreturnで渡せば良い