Wizard Notes

Python, JavaScript を使った音楽信号分析の技術録、作曲活動に関する雑記

Python:PyQtでQMainWindowに非依存な複数のQWidgetを同時に表示する

www.wizard-notes.com

上記の例の派生版です。

やりたいこととしては、

  • 複数ある QWidget (個々のGUI)を表示
  • ここのQWidget はQMainWindowと結合していない
  • QMainWindowは与えられた複数の QWidget を表示する

となります。

なお、下記の例ではQMainWindow自体はGUIとしての役割を持たないため表示させない、という場合を想定しています。

sub_windowにリストの要素として与えるオブジェクトはQWidgetを継承していれば何でもよいため、個々に作ったQWidgetを一気に複数表示できます

具体的には、異なる種類のグラフや設定・操作画面を想定しています。

もしQMainWindowのウィンドウも表示させる場合は#w.show()コメントアウトを外してください。

import sys
from PyQt5.QtWidgets import (
    QApplication, QMainWindow, QWidget,
    QPushButton, QLabel, QVBoxLayout, 
    qApp
)
from PyQt5.QtCore import QTimer

class SubWindow(QWidget):
    def __init__(self, N):
        super().__init__()
        self.resize(800, 600)

        # 画面サイズとNに応じて画面の表示位置を決定
        geometry = qApp.desktop().screenGeometry()
        framesize = self.frameSize()
        x_base = geometry.width() / 2 - framesize.width() / 2
        y_base = 0
        self.move(x_base + 100*N, y_base + 100*N)

        layout = QVBoxLayout()
        self.label = QLabel(f"SubWindow {N}")
        layout.addWidget(self.label)
        self.setLayout(layout)


class MainWindow(QMainWindow):
    def __init__(self, sub_window=[]):
        super().__init__()
        self.sub_window = sub_window
        self.show_sub_window()
        
    def show_sub_window(self):
        for w in self.sub_window:
            w.show()


app = QApplication(sys.argv)

sub_window = [SubWindow(N=n+1) for n in range(4)]
w = MainWindow(sub_window=sub_window)
#w.show() 
app.exec()

なお、画面サイズの設定は以下を参考にしました。

stackoverflow.com