PyQt5 QMainWindowに自作Widgetを追加する

Share on:

Qt Designerを使ってQMainWindowに自作Widgetを追加するサンプルを作成しました。

ウィンドウとウィジェットの作成

Qt Designerを使ってMainWindowを1個、Widgetを2個作成しました。それぞれボタンとテキストブラウザをセットして、MainWindowにはさらにdockWidgetをセットしています。このdockWidgetにWidgetを追加して、そのWidgetのクラスを格上げして自作ウィジェットの登録を行います。

dockWidgetに含まれるMyWidget1とMyWidget2は格上げされたウィジェットとしてMainWindowに登録します。

ウィジェットを継承したクラスの作成

uiファイルをpyファイルに変換すると、pyファイル内にUi_MyWidget1とUi_MyWidget2クラスが作成されます。それらのクラスを継承したクラスMyWidget1、MyWidget2を作成します。mywidget1.pyは下記の通りで、mywidget2.pyはmywidget1をmywidget2に書き換えたコードになります。

mywidget1.py

 1# -*- coding: utf-8 -*-
 2import sys
 3from mywidget1_widget import Ui_MyWidget1
 4from PyQt5 import QtWidgets, QtCore, QtGui
 5
 6class MyWidget1(QtWidgets.QWidget):
 7    def __init__(self, parent=None):
 8        super(MyWidget1, self).__init__(parent)
 9        self.ui = Ui_MyWidget1()
10        self.ui.setupUi(self)
11
12    def button_clicked(self):
13        self.find_mainwindow(self).set_text(self.ui.pushButton.text())
14
15    def find_mainwindow(self, parent):
16        if parent is None:
17            return None
18        if parent.inherits('QMainWindow'):
19            return parent
20        return self.find_mainwindow(parent.parent())

子WidgetからMainWindowを探す

子WidgetからMainWindowのset_text関数を実行したいので、MainWindowを探す関数を作成しました。Widgetの親をparent()で取得して、親が’QMainWindow’を継承していればMainWindowである、なければ親の親を取得して判定するという再帰的なプログラムでMainWindowを探します。親がNoneならMainWindowが見つからなかったとしてNoneを返します。

1def find_mainwindow(self, parent):
2    if parent is None:
3        return None
4    if parent.inherits('QMainWindow'):
5        return parent
6    return self.find_mainwindow(parent.parent())

Mainプログラム

mainではMainWindowクラスの表示とボタンをセットしたときに3つのテキストブラウザにテキストをセットするという処理だけです。GUI関連はuiファイルを変換して作成したpyファイル内に記載されています。

 1# -*- coding: utf-8 -*-
 2import sys
 3from mainwindow import Ui_MainWindow
 4from PyQt5 import QtWidgets, QtCore, QtGui
 5
 6class MainWindow(QtWidgets.QMainWindow):
 7    def __init__(self, parent=None):
 8        super(MainWindow, self).__init__(parent)
 9        self.ui = Ui_MainWindow()
10        self.ui.setupUi(self)
11
12    def button_clicked(self):
13        self.set_text(self.ui.pushButton.text())
14
15    def set_text(self, text):
16        self.ui.textBrowser.setText(text)
17        childTextBrowser = self.ui.dockWidget.findChild(QtWidgets.QTextBrowser)
18        childTextBrowser.setText(text)
19        childTextBrowser = self.ui.dockWidget_2.findChild(QtWidgets.QTextBrowser)
20        childTextBrowser.setText(text)
21
22def main():
23    app = QtWidgets.QApplication(sys.argv)
24    window = MainWindow()
25    window.show()
26    app.exec()
27 
28if __name__ == '__main__':
29    main()

ファイル一覧

作成したファイルは下記の通りです。ui_convert.batは3つのuiファイルを一括でpyファイルに変換するためのバッチファイルです。コマンドプロンプトから1個ずつ変換してもいいと思います。

ソースコード

ファイルが多いのでgithubにアップロードしました。

関連記事