PyQt5 QMainWindowに自作Widgetを追加する

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

# -*- coding: utf-8 -*-
import sys
from mywidget1_widget import Ui_MyWidget1
from PyQt5 import QtWidgets, QtCore, QtGui

class MyWidget1(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(MyWidget1, self).__init__(parent)
        self.ui = Ui_MyWidget1()
        self.ui.setupUi(self)

    def button_clicked(self):
        self.find_mainwindow(self).set_text(self.ui.pushButton.text())

    def find_mainwindow(self, parent):
        if parent is None:
            return None
        if parent.inherits('QMainWindow'):
            return parent
        return self.find_mainwindow(parent.parent())

子WidgetからMainWindowを探す

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

def find_mainwindow(self, parent):
    if parent is None:
        return None
    if parent.inherits('QMainWindow'):
        return parent
    return self.find_mainwindow(parent.parent())

Mainプログラム

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

# -*- coding: utf-8 -*-
import sys
from mainwindow import Ui_MainWindow
from PyQt5 import QtWidgets, QtCore, QtGui

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

    def button_clicked(self):
        self.set_text(self.ui.pushButton.text())

    def set_text(self, text):
        self.ui.textBrowser.setText(text)
        childTextBrowser = self.ui.dockWidget.findChild(QtWidgets.QTextBrowser)
        childTextBrowser.setText(text)
        childTextBrowser = self.ui.dockWidget_2.findChild(QtWidgets.QTextBrowser)
        childTextBrowser.setText(text)

def main():
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec()
 
if __name__ == '__main__':
    main()

ファイル一覧

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

ソースコード

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

コメント

タイトルとURLをコピーしました