2016/10/21(金) [n年前の日記]
#4 [python] PySideでQMainWindowのレイアウト方法を再確認
PySide(PyQt)のQMainWindowは、レイアウトの仕方がちょっと違うのでメモ。
_dockwidgetlayout.py
上下左右にドックウィジェットを配置して、真ん中にメインとなるウィジェットを配置できる、のが QMainWindow のレイアウト、なのかなと。
ドックウィジェットは、タイトルバー?部分をマウスでドラッグしてやれば、切り離して任意の場所に置くことも可能。例えば以下のような配置にもできるので、その手のツールを作成する時は便利かもしれない。
_dockwidgetlayout.py
""" PySideでQMainWindow上にDockWidgetその他をレイアウト 動作確認環境 : Windows10 x64 + Python 2.7.11 + PySide 1.2.4 """ import sys from PySide.QtCore import * from PySide.QtGui import * class MyVWidget(QWidget): """ メインウインドウ周辺に配置するWidget。縦長タイプ """ def __init__(self, parent=None): super(MyVWidget, self).__init__(parent) l = QVBoxLayout() # 縦に並べる l.addWidget(QLabel("Dummy")) l.addWidget(QLabel("Dummy")) self.setLayout(l) class MyHWidget(QWidget): """ メインウインドウ周辺に配置するWidget。横長タイプ """ def __init__(self, parent=None): super(MyHWidget, self).__init__(parent) l = QHBoxLayout() # 横に並べる l.addWidget(QLabel("Dummy")) l.addWidget(QLabel("Dummy")) self.setLayout(l) class DrawAreaScene(QGraphicsScene): """ 描画ウインドウ用Scene """ def __init__(self, *argv, **keywords): super(DrawAreaScene, self).__init__(*argv, **keywords) self.buttonFlag = False self.pixmap = QPixmap(800, 600) self.pixmap.fill(QColor(0, 0, 0, 0)) # Scene に Item を追加 self.imgItem = QGraphicsPixmapItem(self.pixmap) self.addItem(self.imgItem) class DrawAreaView(QGraphicsView): """ メインになるQGraphicsView """ def __init__(self, *argv, **keywords): super(DrawAreaView, self).__init__(*argv, **keywords) self.setCacheMode(QGraphicsView.CacheBackground) self.setRenderHints(QPainter.Antialiasing | QPainter.SmoothPixmapTransform | QPainter.TextAntialiasing) self.setBackgroundBrush(Qt.darkGray) # 背景色を設定 # Sceneを登録 scene = DrawAreaScene(self) self.setScene(scene) scene.setSceneRect(QRectF(self.rect())) def resizeEvent(self, event): """ リサイズ時に呼ばれる処理 """ super(DrawAreaView, self).resizeEvent(event) self.scene().setSceneRect(QRectF(self.rect())) # Sceneの矩形も更新 class MyMainWindow(QMainWindow): """ メインウインドウ """ def __init__(self, parent=None): super(MyMainWindow, self).__init__(parent) # メニューバー mb = QMenuBar() file_menu = QMenu("&File", self) exit_action = file_menu.addAction("&Close") exit_action.setShortcut('Ctrl+Q') exit_action.triggered.connect(qApp.quit) mb.addMenu(file_menu) self.setMenuBar(mb) # ステータスバー status = QStatusBar(self) self.setStatusBar(status) status.showMessage("Status Bar") # 上のDockWidget self.topDock = QDockWidget("Top Dock", self) self.topDock.setWidget(MyHWidget(self)) self.addDockWidget(Qt.TopDockWidgetArea, self.topDock) # 下 self.bottomDock = QDockWidget("Bottom Dock", self) self.bottomDock.setWidget(MyHWidget(self)) self.addDockWidget(Qt.BottomDockWidgetArea, self.bottomDock) # 左 self.leftDock = QDockWidget("Left Dock", self) self.leftDock.setWidget(MyVWidget(self)) self.addDockWidget(Qt.LeftDockWidgetArea, self.leftDock) # 右 self.rightDock = QDockWidget("Right Dock", self) self.rightDock.setWidget(MyVWidget(self)) self.addDockWidget(Qt.RightDockWidgetArea, self.rightDock) # 中央Widget self.gview_image = DrawAreaView(self) self.setCentralWidget(self.gview_image) def main(): app = QApplication(sys.argv) w = MyMainWindow() w.setWindowTitle("DockWidget Layout") w.resize(800, 600) w.show() sys.exit(app.exec_()) if __name__ == '__main__': main()
上下左右にドックウィジェットを配置して、真ん中にメインとなるウィジェットを配置できる、のが QMainWindow のレイアウト、なのかなと。
ドックウィジェットは、タイトルバー?部分をマウスでドラッグしてやれば、切り離して任意の場所に置くことも可能。例えば以下のような配置にもできるので、その手のツールを作成する時は便利かもしれない。
[ ツッコむ ]
以上です。