inflearn logo
강의

Khóa học

Chia sẻ kiến thức

[Cấp độ 1] Lập trình Python sử dụng Qt: Giới thiệu

Sự khác biệt và đặc điểm của kiến trúc Native và Qt Quick

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

228

monkey-k 777

3 câu hỏi đã được viết

1

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

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

python gui qt qml pyside6

Câu trả lời 2

0

qtdev

안녕하세요. 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

monkey-k 777

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

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

0

qtdev

 

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

communityai8509

안녕하세요, 인프런 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 레이아웃을 구현할 수 있는 다양한 방법입니다. 각 방법들은 서로 다른 사용 사례에 맞게 조정이 가능하니, 시도해보시고 가장 적합한 방법을 선택하시면 됩니다.

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

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

6-6

0

12

1

작업형 1 유형 부분

0

13

1

수강평 이벤트

0

18

2

작업형 1 (삭제예정, 구 버전)

0

33

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

21

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