mieki256's diary



2016/10/21(金) [n年前の日記]

#4 [python] PySideでQMainWindowのレイアウト方法を再確認

PySide(PyQt)の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()

dockwidgetlayout_ss01.png

上下左右にドックウィジェットを配置して、真ん中にメインとなるウィジェットを配置できる、のが QMainWindow のレイアウト、なのかなと。

ドックウィジェットは、タイトルバー?部分をマウスでドラッグしてやれば、切り離して任意の場所に置くことも可能。例えば以下のような配置にもできるので、その手のツールを作成する時は便利かもしれない。

dockwidgetlayout_ss02.png

以上です。

過去ログ表示

Prev - 2016/10 - Next
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project