본문 바로가기
PyQt5_

Layouts

by 자동매매 2023. 3. 11.
Layout Behavior
QHBoxLayout Linear horizontal layout
QVBoxLayout Linear vertical layout
QGridLayout In indexable grid XxY
QStackedLayout Stacked (z) in front of one another

QVBoxLayout, QHBoxLayout QGridLayout. 또한 QStackedLayout 사용하면 동일한 공간 내에서 위젯을 다른 위젯 위에 배치 할 수 있지만 한 번에 하나의 위젯 만 표시 할 수 있습니다.

 

Placeholder widget

레이아웃을 더 쉽게 시각화할 수 있도록 먼저 선택한 단색을 표시하는 간단한 사용자 지정 위젯을 만듭니다. 이렇게하면 레이아웃에 추가하는 위젯을 구별하는 데 도움이됩니다.

 

.setAutoFillBackground True로 설정하여 위젯이 자동으로 배경을 창 색상으로 채우도록 지시합니다.

다음으로 위젯의 QPalette.Window 색상을 우리가 제공 한 값 색상으로 설명 된 새로운 QColor로 변경합니다. 마지막으로 이 팔레트를 위젯에 다시 적용합니다. 최종 결과는 단색으로 채워진 위젯으로, 만들 때 지정합니다.

 

# layout_colorwidget.py

from PyQt6.QtGui import QColor, QPalette
from PyQt6.QtWidgets import QWidget,QApplication
import sys


class Color(QWidget):
    def __init__(self, color):
        super().__init__()
        self.setAutoFillBackground(True)

        palette = self.palette()
        palette.setColor(QPalette.ColorRole.Window, QColor(color))
        self.setPalette(palette)


if __name__ =='__main__':
    app = QApplication(sys.argv)
    
    w = Color('blue')
    w.show()
    
    app.exec()

 

QVBoxLayout vertically  arranged widgets

작업 순서

1. 위젯객체 생성   : widget = QWidget() 

2. layout객체 생성 : layout = QVBoxLayout()

3. layout에 위젯 더하기 : layout.addWidget(QLabel('Title'))

4. 위젯객체에 layout setting : widget.setLayout(layout)

5. 메인의 central위젯을 1의 위젯으로 설정 : self.setCentralWidget(widget)

import sys

from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import (
    QApplication,
    QMainWindow,
    QVBoxLayout,
    QWidget,
)

from layout_colorwidget import Color


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

        self.setWindowTitle("My App")

        layout = QVBoxLayout()

        layout.addWidget(Color("red"))

        widget = QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)


app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec()

 

Nesting layouts

layout.addLayout(layout1)

import sys

from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import (
    QApplication,
    QHBoxLayout,
    QLabel,
    QMainWindow,
    QVBoxLayout,
    QWidget,
)

from layout_colorwidget import Color


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

        self.setWindowTitle("My App")

        layout1 = QHBoxLayout()
        layout2 = QVBoxLayout()
        layout3 = QVBoxLayout()

        layout2.addWidget(Color("red"))
        layout2.addWidget(Color("yellow"))
        layout2.addWidget(Color("purple"))

        layout1.addLayout(layout2)

        layout1.addWidget(Color("green"))

        layout3.addWidget(Color("red"))
        layout3.addWidget(Color("purple"))

        layout1.addLayout(layout3)

        widget = QWidget()
        widget.setLayout(layout1)
        self.setCentralWidget(widget)


app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec()

 

# 여백 설정

layout1.setContentsMargins(0,0,0,0) # 좌,위,우,하 여백
layout1.setSpacing(20) # 위젯간 여백

 

QGridLayout widgets arranged in a grid

QVBoxLayout QHBoxLayout을 사용하여 양식과 같은 여러 요소를 배치하려고 하면 다른 크기의 위젯을 정렬하기가 매우 어렵다는 것을 알게 될 것입니다. 이에 대한 해결책은 QGridLayout입니다.

각 위치의 그리드 위치를 지정해야하며, 중간중간 요소가 빌수도 있다

import sys

from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import (
    QApplication,
    QGridLayout,
    QLabel,
    QMainWindow,
    QWidget,
)

from layout_colorwidget import Color


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

        self.setWindowTitle("My App")

        layout = QGridLayout()

        layout.addWidget(Color("red"), 0, 0)
        layout.addWidget(Color("green"), 1, 0)
        layout.addWidget(Color("blue"), 1, 1)
        layout.addWidget(Color("purple"), 2, 1)

        widget = QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)


app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec()

 

QStackedLayout multiple widgets in the same space

요소를 서로 바로 앞에 배치할 수 있습니다. 그런 다음 표시할 위젯을 선택할 수 있습니다.
그래픽 응용 프로그램에서 레이어를 그리거나 탭 인터페이스를 모방하는데 사용할 수 있습니다.

[참조] 동일 기능 - 컨테이너 위젯인 QStackedWidget을 생성하고 표시 위젯 인덱스 지정(

layout.setCurrentIndex(3)).setCentralWidget을 사용하여 표시 위젯 설정

맨 위 위젯만 표시되며, 기본적으로 레이아웃에 추가된 첫 번째 위젯입니다. -> 위젯이 선택되고 앞으로 가져옵니다.

import sys

from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import (
    QApplication,
    QLabel,
    QMainWindow,
    QStackedLayout,
    QWidget,
)

from layout_colorwidget import Color


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

        self.setWindowTitle("My App")

        layout = QStackedLayout()

        layout.addWidget(Color("red"))
        layout.addWidget(Color("green"))
        layout.addWidget(Color("blue"))
        layout.addWidget(Color("yellow"))

        layout.setCurrentIndex(3)

        widget = QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)


app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec()

 

# built-in tab widget

import sys

from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import (
    QApplication,
    QHBoxLayout,
    QLabel,
    QMainWindow,
    QPushButton,
    QStackedLayout,
    QVBoxLayout,
    QWidget,
)

from layout_colorwidget import Color


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

        self.setWindowTitle("My App")

        pagelayout = QVBoxLayout()
        button_layout = QHBoxLayout()
        self.stacklayout = QStackedLayout()

        pagelayout.addLayout(button_layout)
        pagelayout.addLayout(self.stacklayout)

        btn = QPushButton("red")
        btn.pressed.connect(self.activate_tab_1)
        button_layout.addWidget(btn)
        self.stacklayout.addWidget(Color("red"))

        btn = QPushButton("green")
        btn.pressed.connect(self.activate_tab_2)
        button_layout.addWidget(btn)
        self.stacklayout.addWidget(Color("green"))

        btn = QPushButton("yellow")
        btn.pressed.connect(self.activate_tab_3)
        button_layout.addWidget(btn)
        self.stacklayout.addWidget(Color("yellow"))

        widget = QWidget()
        widget.setLayout(pagelayout)
        self.setCentralWidget(widget)

    def activate_tab_1(self):
        self.stacklayout.setCurrentIndex(0)

    def activate_tab_2(self):
        self.stacklayout.setCurrentIndex(1)

    def activate_tab_3(self):
        self.stacklayout.setCurrentIndex(2)


app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec()

한 번에 하나의 보기('')만 표시됩니다. .setCurrentIndex() 또는 .setCurrentWidget()을 사용하여 인덱스(위젯이 추가된 순서대로) 또는 위젯 자체별로 항목을 설정하여 언제든지 표시할 위젯을 제어할 수 있습니다.

 

QTabWidget

import sys

from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import (
    QApplication,
    QLabel,
    QMainWindow,
    QPushButton,
    QTabWidget,
    QWidget,
)

from layout_colorwidget import Color


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

        self.setWindowTitle("My App")

        tabs = QTabWidget()
        tabs.setTabPosition(QTabWidget.TabPosition.North)
        tabs.setMovable(True)  # Tap 순서 변경

        for n, color in enumerate(["red", "green", "blue", "yellow"]):
            tabs.addTab(Color(color), color)

        self.setCentralWidget(tabs)


app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec()

 

문서의 경우 문서 모드를 켜서 다른 플랫폼에서 있는 것과 유사한 슬림형 탭을 제공할 있습니다. 옵션은 다른 플랫폼에는 영향을 주지 않습니다.

tabs = QTabWidget()
tabs.setDocumentMode(True)

 

 

'PyQt5_' 카테고리의 다른 글

Dialogs  (0) 2023.03.13
Actions, Toolbars & Menus  (0) 2023.03.13
Widgets  (0) 2023.03.10
Signals & Slots  (0) 2023.03.10
Sizing windows and widgets  (0) 2023.03.10

댓글