-
파이썬 GUI 프로그래밍 - PYQT5Python study/실전프로젝트 2021. 7. 20. 11:34
메인창(Main Window)
- 메인창(Main window)은 메뉴바, 툴바, 상태바를 갖는 전형적인 어플리케이션 창입니다.
(QMainWindow 공식 문서 참고)
- 메인창은 QMenuBar, QToolBar, QDockWidget, QStatusBar를 위한 고유의 레이아웃을 갖고 있습니다.
- 또한 가운데 영역에 중심위젯 (Central widget)을 위한 영역을 갖고 있습니다. 여기에는 어떠한 위젯도 들어올 수 있습니다.
- QMainWindow 클래스를 이용해서 메인 어플리케이션 창을 만들 수 있습니다
QStatusBar
QstatusBar - 상태바는 어플리케이션의 상태를 알려주기 위해 어플리케이션의 하단에 위치하는 위젯입니다. (QStatusBar 공식 문서 참고)
- 상태바에 텍스트를 표시하기 위해서는 showMessage() 메서드를 사용합니다.
- 텍스트가 사라지게 하고 싶으면, clearMessage() 메서드를 사용하거나, showMessage() 메서드에 텍스트가 표시되는 시간을 설정할 수 있습니다.
- 현재 상태바에 표시되는 메세지 텍스트를 갖고 오고 싶을 때는 currentMessage() 메서드를 사용합니다.
- QStatusBar 클래스는 상태바에 표시되는 메세지가 바뀔 때 마다 messageChanged() 시그널을 발생합니다.
QPushButton
btn = Qpushbutton('버튼 텍스트' , self)
- 생성자 (QPushButton())의 첫 번째 파라미터에는 버튼에 표시될 텍스트를 입력하고, 두 번째 파라미터에는 버튼이 위치할 부모 위젯을 입력합니다.
- https://wikidocs.net/21934
btn.clicked.connect(QcoreApplication.instance().quit)
- PyQt5에서의 이벤트 처리는 시그널과 슬롯 메커니즘으로 이루어집니다.
- 버튼 (btn)을 클릭하면 'clicked' 시그널이 만들어집니다.
- instance() 메서드는 현재 인스턴스를 반환합니다.
- 'clicked' 시그널은 어플리케이션을 종료하는 quit() 메서드에 연결됩니다.
- 이렇게 발신자 (Sender)와 수신자 (Receiver), 두 객체 간에 커뮤니케이션이 이루어집니다.
- 이 예제에서 발신자는 푸시버튼 (btn)이고, 수신자는 어플리케이션 객체 (app)입니다.
레이아웃(Layout)
레이아웃 (Layout)은 어플리케이션 창에 위젯들을 배치하는 방식입니다.
레이아웃 관리는 GUI 프로그래밍에서 매우 중요한 요소입니다.
PyQt5의 위젯들을 배치하는 방식에는 절대적 배치, 박스 레이아웃, 그리드 레이아웃 방식이 있습니다.절대적 배치
- 절대적 배치(Absolute positioning) 방식은 각 위젯의 위치와 크기를 픽셀 단위로 설정해서 배치합니다.
- 절대 배치 방식을 사용할 때는 다음의 제약을 이해하고 있어야 합니다.
- 창의 크기를 조절해도 위젯의 크기와 위치는 변하지 않는다.
- 다양한 플랫폼에서 어플리케이션이 다르게 보일 수 있다.
- 어플리케이션의 폰트를 바꾸면 레이아웃이 망가질 수 있다.
- 레이아웃을 바꾸고 싶다면 완전히 새로 고쳐야 하며, 이는 매우 번거롭다.
- 위젯의 위치를 설정하기 위해 move() 메서드를 사용합니다.
- 라벨(label1, label2)과 푸시버튼(btn1, btn2)의 x, y 좌표를 설정함으로써 위치를 조절합니다.
- 좌표계는 왼쪽 상단 모서리에서 시작합니다. x 좌표는 왼쪽에서 오른쪽으로 갈수록 커지고, y 좌표는 위에서 아래로 갈수록 커집니다.
박스 레이아웃
- 박스 레이아웃 클래스를 이용하면 훨씬 유연하고 실용적인 레이아웃을 할 수 있습니다. (QBoxLayout 공식 문서 참고)
- QHBoxLayout, QVBoxLayout은 여러 위젯을 수평으로 정렬하는 레이아웃 클래스 입니다.
- QHBoxLayout, QVBoxLayout 생성자는 수평, 수직의 박스를 하나 만드는데, 다른 레이아웃 박스를 넣을 수도 있고 위젯을 배치할 수도 있습니다.
- 예제 코드에서 위젯의 가운데 아래 부분에 두 개의 버튼을 배치하기 위해 수평, 수직의 박스를 하나씩 사용합니다.
- 필요한 공간을 만들기 위해 addStretch() 메서드를 사용하고, 'stretch factor'를 조절해 보겠습니다.
박스레이아웃 예제 그리드 레이아웃
- 가장 일반적인 레이아웃 클래스는 '그리드 레이아웃(grid layout)'입니다. 이 레이아웃 클래스는 위젯의 공간을 행 (row)과 열 (column)로 구분합니다.
- 그리드 레이아웃을 생성하기 위해 QGridLayout 클래스를 사용합니다.
- 위 예시 다이얼로그의 경우, 세 개의 행(Row)과 다섯 개의 열(Column)로 구분되어 있고, 필요한 위치에 위젯을 배치했습니다.
QTablewidget
QTableWidget 클래스는 테이블 형태로 항목을 배치하고 다루도록 합니다.
setRowCount() 메서드는 테이블의 행 (Row)의 개수를 지정합니다.
setColumnCount() 메서드는 테이블의 열 (Column)의 개수를 지정합니다.etEditTriggers() 메서드는 테이블의 항목을 편집 가능하도록 하는 액션을 지정합니다.
QAbstractItemView.NoEditTriggers으로 지정하면 편집을 할 수 없습니다.
QAbstractItemView.DoubleClicked으로 지정하면 칸을 더블클릭했을 때 편집이 가능합니다.
QAbstractItemView.AllEditTriggers으로 지정하면 클릭, 더블클릭 등 모든 액션에 대해 편집이 가능하도록 합니다.horizontalHeader()는 수평 헤더를 반환합니다.
setSectionResizeMode() 메서드는 헤더의 크기를 조절하는 방식을 지정합니다.
QHeaderView.Stretch는 헤더의 폭이 위젯의 폭에 맞춰지도록 합니다.
QHeaderView.ResizeToContents는 헤더의 폭이 항목 값의 폭에 맞춰지도록 합니다setItem(row, column, value) 메서드는 테이블 항목의 값을 지정합니다.
순서대로 행과 열의 번호, 그리고 값을 입력합니다.'Python study > 실전프로젝트' 카테고리의 다른 글
python_android device 제어 : 다수의 device_serial number 문자열 처리 (0) 2022.10.11 for문 구조에 대한 고민 (0) 2021.08.23 openpyxl - 엑셀을 다루기 위한 패키지. (0) 2021.08.20 파이썬 GUI 프로그래밍 (0) 2021.07.20 파이썬 소켓 프로그래밍 사용법 (0) 2021.07.19