인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

monkey-k 777님의 프로필 이미지

작성한 질문수

[Level 1] Qt를 이용한 Python 프로그래밍: 입문편

Navtive 와 Qt Quick Architecture 의 차이점 및 특징

가장 큰 위젯의 너비와 같은 너비를 차지하는 2열 짜리 컬럼

작성

·

100

1

안녕하세요. 강의를 듣고 pyside로 데스크톱 어플리케이션을 만들고 있는 중에 있습니다.

QGridLayout 안에 위젯들을 2열로 배치하였는데요, 이 위젯들이 위젯 아이템들 중 가장 너비가 넓은 것에 맞춰 같은 너비를 차지하면서도 위젯들이 윈도우 전체를 차지하지 않는(=커지거나 작아지지 않는) 방법이 있나요..? 생각보다 어려워서 며칠 째 끙끙대다 결국 질문남겨봅니다.

답변 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()를 사용해 두 열의 크기를 동일하게 맞출 수 있습니다. 이 방법을 적용하면, 윈도우 크기에 상관없이 위젯들의 너비가 일정하게 유지됩니다. 필요에 따라 위젯들의 크기나 레이아웃을 더 조정할 수 있습니다.


혹시 더 궁금한게 있으면 언제든 질문해주세요.

감사합니다. 김대진드림.

monkey-k 777님의 프로필 이미지
monkey-k 777
질문자

안녕하세요 김대진 강사님, 소중한 답변 감사합니다.

알려주신 소스 코드를 실행시켜보았으나, 제가 궁금한 것은 Button 1의 텍스트만 예를 들어 Button 11111111과 같이 길어질 때, 나머지 버튼 2, 3, 4 위젯 또한 같은 너비를 가질 수 있는가, 또한 윈도우 크기를 늘렸을 때, Button 11111111과 Button 2의 너비보다 윈도우 화면이 크다면, 빈 공간으로 나타낼 수 있는가였습니다. 혹시 한 번만 더 같이 고민해주실 수 있을까요..?

김대진님의 프로필 이미지
김대진
지식공유자

 

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 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다.

GridLayout에서 각 열이 가장 넓은 요소에 맞춰 같은 너비를 가지게 하면서, 창 크기에 따라 커지거나 작아지지 않도록 하는 것은 문제가 될 수 있습니다. Qt의 QGridLayout은 기본적으로 각 셀의 크기를 자동으로 조절하여 창의 크기에 맞추는 특성이 있기 때문입니다. 그러나 고정된 너비를 설정하거나, 특정 조건을 만족하도록 레이아웃을 구성하는 방법은 몇 가지가 있습니다.

  1. setFixedWidth() 사용: 각 위젯에 대해 setFixedWidth() 메서드를 사용하여 너비를 고정할 수 있습니다. 이는 위젯이 커지거나 작아지지 않도록 설정하는 가장 간단한 방법입니다.
   widget.setFixedWidth(max_width)
  1. sizePolicy 설정: QSizePolicy를 통해 확장 또는 수축하지 않도록 설정할 수 있습니다. 특히 setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)를 통해 위젯의 크기를 고정할 수 있습니다.
   widget.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Expanding)
  1. Grid Layout 설정 조정: QGridLayout의 각 행과 열에 대해 setColumnStretch() 메서드를 사용하여 위젯들이 특정 비율에 따라 크기를 조정하도록 설정할 수 있습니다.

위의 방법들은 당신이 원하는 고정된 UI 레이아웃을 구현할 수 있는 다양한 방법입니다. 각 방법들은 서로 다른 사용 사례에 맞게 조정이 가능하니, 시도해보시고 가장 적합한 방법을 선택하시면 됩니다.

관련된 질문과 논의는 아래의 게시물에서 확인하실 수 있습니다:
- 위젯프로그램 위에 챠트 띄우기

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.