본문 바로가기
코딩취미/Python

[pyside6] Docker위젯속성설정 : DockWidgetFeature, addDockWidget

by 브링블링 2024. 3. 13.
728x90

Docker위젯속성설정 : DockWidgetFeature, addDockWidget

pyside6에서 MDI 프로그램을 만들 때 사용되는 Dock의 특성을 설정하는 방법을 정리합니다. Docker의 특성 설정에 따라서 동작이 달라지기때문에 사용자가 원하는 특징에 따라서 속성을 제대로 설정해야 합니다.

DockWidgetFeature

DockWidgetFeature는 Python의 enum 모듈을 사용하여 정의된 열거형(Flag)이며, Qt (특히 PyQt나 PySide)에서 QDockWidget의 기능을 나타내기 위해 사용됩니다. 이 Flag 열거형은 QDockWidget의 다양한 동작과 속성을 조절하는 데 사용되며, 개발자가 도커 위젯의 기능을 세밀하게 제어할 수 있게 합니다.

 

DockWidgetFeature는 enum.Flag를 상속받아 구현되므로, 다중 값의 조합이 가능합니다. 즉, 여러 기능을 비트 OR 연산자(|)를 사용하여 결합할 수 있습니다. Qt에서 제공하는 주요 DockWidgetFeature는 다음과 같습니다:

  • NoDockWidgetFeatures: 도커에 어떠한 추가 기능도 적용되지 않음을 의미합니다.
  • DockWidgetClosable: 도커를 닫을 수 있는 닫기 버튼이 제공됩니다.
  • DockWidgetMovable: 도커를 드래그하여 이동할 수 있습니다. 이를 통해 사용자는 도커의 위치를 변경할 수 있습니다.
  • DockWidgetFloatable: 도커를 부동 상태로 만들 수 있는 기능입니다. 사용자가 도커를 메인 윈도우 바깥으로 드래그하면 독립적인 윈도우로 변환됩니다.
  • DockWidgetVerticalTitleBar: 도커의 제목 표시줄을 수직으로 표시합니다. 이는 공간 절약이 필요할 때 유용할 수 있습니다.
  • AllDockWidgetFeatures: 모든 기능이 활성화된 상태입니다. 즉, 도커는 닫기, 이동, 부동 상태로 만들기 등의 모든 기능을 사용할 수 있습니다.

 

아래 코드는 도커 위젯이 이동 가능하며 닫을 수 있는 버튼이 있음을 의미합니다. enum.Flag의 사용으로 인해, 개발자는 이러한 기능들을 유연하게 조합하여 도커의 동작을 세밀하게 제어할 수 있습니다.

dockWidget.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetClosable)

 

DockWidgetFeature를 사용함으로써, PyQt나 PySide를 사용하는 개발자는 사용자 인터페이스의 도커 부분을 보다 풍부하고 상호작용적으로 만들 수 있으며, 사용자의 작업 흐름에 맞게 인터페이스를 사용자 정의할 수 있습니다.

 

addDockWidget

addDockWidget() 메서드는 PyQt나 PySide에서 QMainWindow 클래스의 일부로 제공됩니다. 이 메서드는 개발자가 QMainWindowQDockWidget 인스턴스를 추가할 수 있게 해주며, 따라서 다양한 유형의 도킹 가능한 사용자 인터페이스 요소를 메인 윈도우에 통합할 수 있습니다.

addDockWidget(Qt.DockWidgetArea, QDockWidget)
  • Qt.DockWidgetArea는 도커 위젯을 추가하려는 영역을 지정합니다. 이 값으로 Qt.LeftDockWidgetArea, Qt.RightDockWidgetArea, Qt.TopDockWidgetArea, Qt.BottomDockWidgetArea 중 하나를 사용할 수 있습니다.
  • QDockWidget은 추가하려는 도커 위젯 자체입니다.

from PySide6.QtWidgets import QApplication, QMainWindow, QDockWidget, QTextEdit
from PySide6.QtCore import Qt

class ExampleMainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initializeUI()

    def initializeUI(self):
        self.setWindowTitle('addDockWidget Example')
        self.setGeometry(100, 100, 400, 300)

        # 도커 위젯 생성
        dock = QDockWidget("My DockWidget", self)
        dockWidgetContents = QTextEdit()
        dock.setWidget(dockWidgetContents)

        # QMainWindow의 오른쪽에 도커 위젯 추가
        self.addDockWidget(Qt.RightDockWidgetArea, dock)

if __name__ == "__main__":
    app = QApplication([])
    mainWindow = ExampleMainWindow()
    mainWindow.show()
    app.exec()
  • addDockWidget()을 사용하여 도커 위젯을 추가하면, 해당 도커는 사용자에 의해 이동, 크기 조절, 부동 상태 변경 등이 가능해집니다. 도커의 기능은 QDockWidget의 setFeatures() 메서드를 통해 세밀하게 제어할 수 있습니다.
  • 도커 위젯은 특정 작업을 위한 도구 창, 설정 패널, 정보 패널 등 다양한 용도로 사용될 수 있습니다.
  • addDockWidget() 메서드를 사용하면, 애플리케이션의 메인 윈도우 레이아웃을 유연하게 구성할 수 있으며, 사용자는 개별 도커 위젯을 자유롭게 조정하여 개인의 작업 흐름에 맞게 인터페이스를 사용자 정의할 수 있습니다.
728x90

Docker 중첩 MDI 예제코드

PyQt 혹은 PySide에서는 도커들이 자동으로 탭 형태로 묶이지 않습니다. 하지만, 사용자가 직접 도커를 드래그하여 다른 도커와 겹치게 배치하면 Qt는 이를 탭으로 자동 변환하여 관리합니다. setDockNestingEnabled(True) 호출을 통해 도커들이 중첩되어 탭 형태로 관리될 수 있도록 할 수 있습니다.

import sys
from PySide6.QtWidgets import (QApplication, QMainWindow, QMdiArea, QDockWidget, QTextEdit, QMdiSubWindow)
from PySide6.QtCore import Qt

class MdiMainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        # 메인 윈도우 설정
        self.setWindowTitle("MDI Program with Dockable Tabs")
        self.setGeometry(100, 100, 800, 600)

        # MDI 영역 설정
        self.mdiArea = QMdiArea()
        self.setCentralWidget(self.mdiArea)

        # 도킹 중첩 허용
        self.setDockNestingEnabled(True)

        # 여러 도커 생성 및 설정
        self.createDockableWindow("Dock 1", "Content for Dock 1")
        self.createDockableWindow("Dock 2", "Content for Dock 2")
        self.createDockableWindow("Dock 3", "Content for Dock 3")

    def createDockableWindow(self, title, content):
        # 도커 위젯 생성
        dock = QDockWidget(title, self)
        dock.setAllowedAreas(Qt.AllDockWidgetAreas)

        # 도커에 들어갈 내용 설정
        textEdit = QTextEdit()
        textEdit.setText(content)
        dock.setWidget(textEdit)

        # 메인 윈도우에 도커 추가
        self.addDockWidget(Qt.RightDockWidgetArea, dock)

        # 도커를 탭 모드로 설정
        dock.setFeatures(QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetClosable | QDockWidget.DockWidgetMovable)
        dock.setAttribute(Qt.WA_DeleteOnClose)  # 도커 닫을 때 자동 삭제

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainWindow = MdiMainWindow()
    mainWindow.show()
    sys.exit(app.exec())
728x90