본문 바로가기
PYTHON(파이썬)/PYSIDE6(GUI)

PYSIDE6 창

by eplus 2024. 10. 24.

애플리케이션은 일반적으로 여러 창을 사용하여 다양한 정보를 표시하거나 다른 작업을 수행합니다. PySide6에서는 이러한 작업을 쉽게 처리할 수 있도록 다양한 창 클래스를 제공합니다. 이 장에서는 메인 윈도우, 서브 윈도우, 다이얼로그 등을 포함한 다양한 창을 사용하는 방법을 살펴보겠습니다.

 

#### QMainWindow

QMainWindow는 애플리케이션의 주 창으로 사용되며, 메뉴 바, 도구 모음, 상태 표시줄 등을 포함할 수 있습니다.

 

**QMainWindow 예제**

```python

import sys

from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QToolBar, QStatusBar

 

class MainWindow(QMainWindow):

    def __init__(self):

        super().__init__()

        self.setWindowTitle("QMainWindow Example")

 

        # 중앙 위젯 설정

        button = QPushButton("Press Me")

        self.setCentralWidget(button)

 

        # 도구 모음 추가

        toolbar = QToolBar("Main Toolbar")

        self.addToolBar(toolbar)

 

        # 상태 표시줄 추가

        self.setStatusBar(QStatusBar(self))

 

app = QApplication(sys.argv)

window = MainWindow()

window.show()

app.exec()

```

이 예제는 중앙에 버튼이 있는 기본 QMainWindow를 생성하고, 도구 모음과 상태 표시줄을 추가합니다.

 

#### 다중 창 애플리케이션

다중 창 애플리케이션을 만들기 위해 서브 윈도우를 생성할 수 있습니다. 서브 윈도우는 QDialog 또는 다른 QMainWindow 인스턴스를 사용할 수 있습니다.

 

**서브 윈도우 예제**

```python

import sys

from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QDialog, QVBoxLayout, QLabel

 

class SubWindow(QDialog):

    def __init__(self):

        super().__init__()

        self.setWindowTitle("Sub Window")

        layout = QVBoxLayout()

        layout.addWidget(QLabel("This is a sub window"))

        self.setLayout(layout)

 

class MainWindow(QMainWindow):

    def __init__(self):

        super().__init__()

        self.setWindowTitle("Main Window")

        button = QPushButton("Open Sub Window")

        button.clicked.connect(self.open_sub_window)

        self.setCentralWidget(button)

 

    def open_sub_window(self):

        dialog = SubWindow()

        dialog.exec()

 

app = QApplication(sys.argv)

window = MainWindow()

window.show()

app.exec()

```

이 예제는 메인 윈도우에서 버튼을 클릭하면 서브 윈도우를 여는 다중 창 애플리케이션을 생성합니다.

 

#### MDI (다중 문서 인터페이스)

MDI는 여러 자식 창을 하나의 부모 창 내에서 관리하는 데 사용됩니다. QMainWindow QMdiArea 클래스를 사용하여 MDI 애플리케이션을 만들 수 있습니다.

 

**MDI 예제**

```python

import sys

from PySide6.QtWidgets import QApplication, QMainWindow, QMdiArea, QMdiSubWindow, QTextEdit

 

class MainWindow(QMainWindow):

    def __init__(self):

        super().__init__()

        self.setWindowTitle("MDI Example")

 

        # MDI 영역 생성

        mdi = QMdiArea()

        self.setCentralWidget(mdi)

 

        # 서브 윈도우 생성 및 추가

        sub1 = QMdiSubWindow()

        sub1.setWidget(QTextEdit())

        sub1.setWindowTitle("Subwindow 1")

        mdi.addSubWindow(sub1)

 

        sub2 = QMdiSubWindow()

        sub2.setWidget(QTextEdit())

        sub2.setWindowTitle("Subwindow 2")

        mdi.addSubWindow(sub2)

 

        sub1.show()

        sub2.show()

 

app = QApplication(sys.argv)

window = MainWindow()

window.show()

app.exec()

```

이 예제는 여러 자식 창을 관리하는 MDI 애플리케이션을 생성합니다. 각 자식 창은 QMdiSubWindow로 생성되며, QMdiArea에 추가됩니다.

 

#### 다이얼로그

다이얼로그는 일반적으로 사용자 입력을 받거나 정보를 제공하는 데 사용됩니다. QDialog 클래스를 사용하여 다이얼로그를 생성할 수 있습니다.

 

**QDialog 예제**

```python

import sys

from PySide6.QtWidgets import QApplication, QMainWindow, QDialog, QVBoxLayout, QLabel, QPushButton, QDialogButtonBox

 

class CustomDialog(QDialog):

    def __init__(self):

        super().__init__()

        self.setWindowTitle("Custom Dialog")

        layout = QVBoxLayout()

        layout.addWidget(QLabel("This is a custom dialog"))

       

        buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)

        buttons.accepted.connect(self.accept)

        buttons.rejected.connect(self.reject)

        layout.addWidget(buttons)

 

        self.setLayout(layout)

 

class MainWindow(QMainWindow):

    def __init__(self):

        super().__init__()

        self.setWindowTitle("Main Window")

        button = QPushButton("Open Dialog")

        button.clicked.connect(self.open_dialog)

        self.setCentralWidget(button)

 

    def open_dialog(self):

        dialog = CustomDialog()

        if dialog.exec():

            print("Dialog accepted")

        else:

            print("Dialog rejected")

 

app = QApplication(sys.argv)

window = MainWindow()

window.show()

app.exec()

```

이 예제는 메인 윈도우에서 버튼을 클릭하면 사용자 정의 다이얼로그를 여는 애플리케이션을 생성합니다. 사용자가 다이얼로그에서 확인 또는 취소 버튼을 클릭하면 해당 상태를 출력합니다.

 

### 결론

이 장에서는 PySide6를 사용하여 다양한 유형의 창을 생성하고 관리하는 방법을 살펴보았습니다. QMainWindow, 서브 윈도우, MDI, 다이얼로그 등을 통해 애플리케이션을 더욱 기능적으로 만들 수 있습니다. 다음 장에서는 이벤트를 처리하는 방법을 알아보겠습니다.

import sys

from PySide6.QtWidgets import (
    QApplication,
    QMainWindow,
    QLabel,
    QPushButton,
    QVBoxLayout,
    QWidget,
)

class AnotherWindow(QWidget):
    def __init__(self):
        super().__init__()
        layout = QVBoxLayout()
        self.label = QLabel("Another Window")
        layout.addWidget(self.label)
        self.setLayout(layout)
       
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.button = QPushButton("Push for Window")
        self.button.clicked.connect(self.show_new_window)
        self.setCentralWidget(self.button)
       
    def show_new_window(self, is_checked):
        #w = AnotherWindow()
        #w.show()
        # ->
        self.w = AnotherWindow()
        self.w.show()
       
app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec()
import sys

from random import randint

from PySide6.QtWidgets import (
    QApplication,
    QMainWindow,
    QLabel,
    QPushButton,
    QVBoxLayout,
    QWidget,
)

class AnotherWindow(QWidget):
    def __init__(self):
        super().__init__()
        layout = QVBoxLayout()
        self.label = QLabel("Another Window %d" % randint(0, 100))
        layout.addWidget(self.label)
        self.setLayout(layout)
       
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.w = AnotherWindow()
        self.button = QPushButton("Push for Window")
        #self.button.clicked.connect(self.show_new_window)
        self.button.clicked.connect(self.toggle_window)
        self.setCentralWidget(self.button)
       
    def show_new_window(self, is_checked):
        self.w.show()
       
    def toggle_window(self, is_checked):
        if self.w.isVisible():
            self.w.hide()
        else:
            self.w.show()
       
app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec()
import sys
from random import randint

from PySide6.QtWidgets import (
    QApplication,
    QMainWindow,
    QLabel,
    QPushButton,
    QVBoxLayout,
    QWidget,
    QLineEdit,
)

class AnotherWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Another")
        layout = QVBoxLayout()
        self.label = QLabel("Another Window")
        layout.addWidget(self.label)
        self.setLayout(layout)
       
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.w = AnotherWindow()
        self.button = QPushButton("Push for Window")
        self.button.clicked.connect(self.toggle_window)
        self.input = QLineEdit()
        self.input.textChanged.connect(self.w.label.setText)
       
        layout = QVBoxLayout()
        layout.addWidget(self.button)
        layout.addWidget(self.input)
        container = QWidget()
        container.setLayout(layout)
       
        self.setCentralWidget(container)
       
    def toggle_window(self, is_checked):
        if self.w.isVisible():
            self.w.hide()
        else:
            self.w.show()
           
app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec()

 

 

728x90
반응형

'PYTHON(파이썬) > PYSIDE6(GUI)' 카테고리의 다른 글

PYSIDE6 QT디자이너 설치  (5) 2024.10.24
PYSIDE6 이벤트  (0) 2024.10.24
PYSIDE6 대화상자  (1) 2024.10.24
PYSIDE6 액션, 도구 모음, 메뉴  (0) 2024.10.23
PYSIDE6 레이아웃  (0) 2024.10.22