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 |
댓글