가장 큰 위젯의 너비와 같은 너비를 차지하는 2열 짜리 컬럼
228
3 asked
안녕하세요. 강의를 듣고 pyside로 데스크톱 어플리케이션을 만들고 있는 중에 있습니다.
QGridLayout 안에 위젯들을 2열로 배치하였는데요, 이 위젯들이 위젯 아이템들 중 가장 너비가 넓은 것에 맞춰 같은 너비를 차지하면서도 위젯들이 윈도우 전체를 차지하지 않는(=커지거나 작아지지 않는) 방법이 있나요..? 생각보다 어려워서 며칠 째 끙끙대다 결국 질문남겨봅니다.
Answer 2
0
안녕하세요. monkey-k 777님,
QGridLayout에서 위젯들이 같은 너비를 가지면서 윈도우 크기 변경에 따라 크기가 변하지 않도록 설정하려면, QWidget의 setSizePolicy() 메서드를 활용할 수 있습니다. QSizePolicy를 사용하여 위젯의 크기 조정 방식(확장/축소)을 제어할 수 있습니다. 또한, QGridLayout 내에서 가장 넓은 위젯에 맞춰 다른 위젯들의 너비를 맞추려면 QGridLayout의 setColumnStretch() 기능을 사용할 수 있습니다.
from PySide6.QtWidgets import QApplication, QWidget, QGridLayout, QPushButton, QSizePolicy
app = QApplication([])
window = QWidget()
layout = QGridLayout(window)
# 위젯 생성
button1 = QPushButton("Button 1")
button2 = QPushButton("Button 2")
button3 = QPushButton("Button 3")
button4 = QPushButton("Button 4")
# 위젯의 사이즈 정책을 'Fixed'로 설정하여 크기가 변하지 않도록 설정
button1.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
button2.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
button3.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
button4.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
# QGridLayout에 위젯 추가
layout.addWidget(button1, 0, 0)
layout.addWidget(button2, 0, 1)
layout.addWidget(button3, 1, 0)
layout.addWidget(button4, 1, 1)
# 두 번째 열의 열 크기 비율을 1로 설정
layout.setColumnStretch(0, 1)
layout.setColumnStretch(1, 1)
window.show()
app.exec()여기서 QSizePolicy.Fixed는 위젯의 크기를 고정시켜줍니다. 그리고 setColumnStretch()를 사용해 두 열의 크기를 동일하게 맞출 수 있습니다. 이 방법을 적용하면, 윈도우 크기에 상관없이 위젯들의 너비가 일정하게 유지됩니다. 필요에 따라 위젯들의 크기나 레이아웃을 더 조정할 수 있습니다.
혹시 더 궁금한게 있으면 언제든 질문해주세요.
감사합니다. 김대진드림.
0
안녕하세요 김대진 강사님, 소중한 답변 감사합니다.
알려주신 소스 코드를 실행시켜보았으나, 제가 궁금한 것은 Button 1의 텍스트만 예를 들어 Button 11111111과 같이 길어질 때, 나머지 버튼 2, 3, 4 위젯 또한 같은 너비를 가질 수 있는가, 또한 윈도우 크기를 늘렸을 때, Button 11111111과 Button 2의 너비보다 윈도우 화면이 크다면, 빈 공간으로 나타낼 수 있는가였습니다. 혹시 한 번만 더 같이 고민해주실 수 있을까요..?
0
QGridLayout에서 모든 버튼이 같은 너비를 유지하면서도, 텍스트가 긴 버튼이 있을 때 나머지 버튼들이 동일한 너비를 가지도록 설정하는 방법
은 아래와 같은 방식으로 맟출수 있을것 같습니다.
setColumnStretch를 사용해 각 열의 크기 비율을 동일하게 맞추는 방식.
QSizePolicy.Expanding을 사용해 위젯들이 확장되도록 하되, 일정 크기 이상으로 커지지 않게 제한.
QWidget.setMinimumWidth()를 설정하여 버튼들이 텍스트에 맞춰 최소 너비를 가질 수 있도록 합니다.
아래는 이를 구현한 예시 코드입니다:
from PySide6.QtWidgets import QApplication, QWidget, QGridLayout, QPushButton, QSizePolicy
app = QApplication([])
window = QWidget()
layout = QGridLayout(window)
# 버튼 생성
button1 = QPushButton("Button 11111111") # 긴 텍스트를 가진 버튼
button2 = QPushButton("Button 2")
button3 = QPushButton("Button 3")
button4 = QPushButton("Button 4")
# 버튼들에 사이즈 정책 설정 (너비 확장, 세로 크기 고정)
button1.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
button2.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
button3.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
button4.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
# 각 버튼의 최소 너비를 동일하게 설정하여 길어지는 텍스트에 맞춰 확장되도록 함
button1.setMinimumWidth(200) # 최소 너비를 설정
button2.setMinimumWidth(200)
button3.setMinimumWidth(200)
button4.setMinimumWidth(200)
# QGridLayout에 위젯 추가
layout.addWidget(button1, 0, 0)
layout.addWidget(button2, 0, 1)
layout.addWidget(button3, 1, 0)
layout.addWidget(button4, 1, 1)
# 열 크기 비율을 1로 설정하여 모든 버튼이 동일한 너비를 가짐
layout.setColumnStretch(0, 1)
layout.setColumnStretch(1, 1)
window.show()
app.exec()
각 버튼에 QSizePolicy.Expanding을 설정하여 버튼들이 가능한 한 넓게 확장되도록 합니다.
setMinimumWidth(200)을 사용하여 버튼들의 최소 너비를 설정하므로, 텍스트가 길어질 때 다른 버튼들도 동일한 너비를 유지합니다.
setColumnStretch(0, 1)와 setColumnStretch(1, 1)을 통해 두 열의 너비를 동일하게 분배합니다.
윈도우 크기가 커지면, 버튼들이 확장되며 빈 공간이 남을 수 있도록 합니다.
이 방식으로 버튼의 텍스트 길이에 관계없이, 버튼들이 같은 너비를 가지며 윈도우 크기가 늘어날 때 빈 공간이 나타나는 레이아웃을 구현할 수 있습니다.
혹시 더 궁금한게 있으면 언제든 질문해 주세요.
감사합니다. 김대진 드림.
0
안녕하세요, 인프런 AI 인턴입니다.
GridLayout에서 각 열이 가장 넓은 요소에 맞춰 같은 너비를 가지게 하면서, 창 크기에 따라 커지거나 작아지지 않도록 하는 것은 문제가 될 수 있습니다. Qt의 QGridLayout은 기본적으로 각 셀의 크기를 자동으로 조절하여 창의 크기에 맞추는 특성이 있기 때문입니다. 그러나 고정된 너비를 설정하거나, 특정 조건을 만족하도록 레이아웃을 구성하는 방법은 몇 가지가 있습니다.
- setFixedWidth() 사용: 각 위젯에 대해
setFixedWidth()메서드를 사용하여 너비를 고정할 수 있습니다. 이는 위젯이 커지거나 작아지지 않도록 설정하는 가장 간단한 방법입니다.
widget.setFixedWidth(max_width)
- sizePolicy 설정:
QSizePolicy를 통해 확장 또는 수축하지 않도록 설정할 수 있습니다. 특히setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)를 통해 위젯의 크기를 고정할 수 있습니다.
widget.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Expanding)
- Grid Layout 설정 조정:
QGridLayout의 각 행과 열에 대해setColumnStretch()메서드를 사용하여 위젯들이 특정 비율에 따라 크기를 조정하도록 설정할 수 있습니다.
위의 방법들은 당신이 원하는 고정된 UI 레이아웃을 구현할 수 있는 다양한 방법입니다. 각 방법들은 서로 다른 사용 사례에 맞게 조정이 가능하니, 시도해보시고 가장 적합한 방법을 선택하시면 됩니다.
관련된 질문과 논의는 아래의 게시물에서 확인하실 수 있습니다:
- 위젯프로그램 위에 챠트 띄우기
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
6-6
0
9
1
작업형 1 유형 부분
0
12
1
수강평 이벤트
0
17
2
작업형 1 (삭제예정, 구 버전)
0
31
2
강의노트는 어디있나요?
0
17
1
노션 학습 자료 권한 요청
0
17
1
수강기간 연장 문의드립니다.
0
21
1
2유형 레이블 인코딩 VS 원핫 인코딩
0
24
3
part2강의 문의사항입니다.
0
19
2
수강기간 연장 문의드립니다.
0
26
1
인덱스 슬라이싱
0
27
2
코드를 첨부해야하는 이유가 있나요?
0
20
2
QT와 QT Designer에 대한 질문 사항
1
167
2
mutex, incNumber는 global 안붙여도 되는건가요?
1
115
2
Qt Resource를 사용하는 예제 구현 10:15 구간 질의
1
140
2
데코레이터 @Slot을 꼭 써줘야 하는 건가요?
1
150
2
TableModel(QAbstractTableModel) 에서 질문입니다.
1
242
2
self가 있는 거와 없는 버튼
1
119
2
선호하는 GUI 개발 방법이 있으신가요
1
304
2
exe 배포 시 .ui 파일 처리하는 권장하는 방법이 있나요?
1
306
1
클래스 __init__(self) 설정에서 이해가 안 되는 부분이 있습니다.
2
300
2
pyqt? pysie6? 차이점이 있을까요?
1
1316
2
자주 사용하는 Layout 살펴보기
1
151
2
강의 pdf파일 올려 주시면 안될까요?
2
236
2

