1. 위젯 (Widget)
GUI 프로그램에서 사용하는 버튼, 레이블, 텍스트박스, 다이얼로그, 메인윈도우 등의 모든 UI 요소들을 가리켜 위젯(Widget)이라 부른다. 위젯의 가장 상위에 있는 클래스인 QWidget은 모든 UI 오브젝트 혹은 컨트롤들의 Base 클래스이다.
PyQt에서 제공되는 버튼(QPushButton), 레이블(QLabel), 텍스트박스(QLineEdit), 콤보박스(QComboBox), 다이얼로그(QDialog), 메인윈도우(QMainWindow) 등의 UI 요소들은 모두 QWidget으로부터 파생된 파생클래스(Derived Class)들이다.
2. 위젯 사용하기
GUI 프로그램에서 다이얼로그, 버튼, 레이블, 텍스트박스 등의 위젯을 사용하여 간단한 다이얼로그 프로그램을 만들어 보자. 우선 사용자 정의 다이얼로그를 만들기 위해서는 PyQt의 QDialog 다이얼로그 클래스로부터 파생된 서브클래스를 만들어야 한다. 아래 예제에선 MyDialog라는 사용자 정의 다이얼로그를 만들었다. 이렇게 정의된 사용자 정의 다이얼로그로부터 객체를 생성한 후 (예제 마지막 부분의 dialog = MyDialog()와 같이), 다이얼로그의 show() 메서드로 화면에 보여주게 된다.
다이얼로그에 위젯들을 놓기 위해서는 MyDialog 클래스의 생성자에서 필요한 위젯들을 추가하게 된다. 생성자의 첫 라인은 일반적으로 Base 클래스의 생성자를 호출하는 코드를 넣는다. 여기서는 QDialog의 생성자 QDialog.__init__()을 호출하고 있다.
from PyQt4.QtGui import * class MyDialog(QDialog): def __init__(self): QDialog.__init__(self) # 레이블,Edit,버튼 컨트롤 lblName = QLabel("Name") editName = QLineEdit() btnOk = QPushButton("OK") # 레이아웃 layout = QVBoxLayout() layout.addWidget(lblName) layout.addWidget(editName) layout.addWidget(btnOk) # 다이얼로그에 레이아웃 지정 self.setLayout(layout) # App app = QApplication([]) dialog = MyDialog() dialog.show() app.exec_()
그러면, 다이얼로그 안에 실제 3개의 위젯 컨트롤을 넣는 코드를 살펴보자.
- 먼저 레이블은 QLabel(레이블텍스트)와 같이 레이블에 쓸 텍스트를 지정하여 객체를 생성한다.
- 텍스트박스는 QLineEdit()를 써서 단일 라인 텍스트박스 객체를 생성한다.
- 버튼은 QPushButton(버튼텍스트)와 같이 버튼에 표시될 텍스트를 지정하여 버튼 객체를 생성한다.
3개의 위젯 객체들이 모두 생성되었으면, 이를 레이아웃에 넣어 정렬시켜 본다. 레이아웃을 사용하지 않고 위젯 위치를 수동으로 정할 수도 있지만, 여기서는 편의상 레이아웃을 이용해 본다. Qt에서는 아래와 같이 4개의 레이아웃을 지원한다.
- QVBoxLayout 위젯들을 수직으로 순서대로 배치한다
- QHBoxLayout 위젯들을 수평으로 순서대로 배치한다
- QGridLayout 위젯들을 Grid 상에 지정된 Row, Column에 배치한다
- QFormLayout QGridLayout와 비슷하지만 두 개의 컬럼만 있는 레이아웃이다
위의 예제에선 수직으로 컨트롤들을 배치하는 QVBoxLayout를 사용하였다. 먼저 QVBoxLayout 객체를 생성하고 이 layout 객체로부터 addWidget(위젯변수) 메서드를 호출하여 해당 위젯을 하나 하나 수직으로 추가한다.
레이아웃이 완전히 정해졌으면, 마지막으로 self.setLayout() 메서드를 호출하여 해당 레이아웃을 다이얼로그에 설정하면 된다. 이제 프로그램을 실행하면 아래와 같은 간단한 다이얼로그가 화면에 표시될 것이다.
3. 주요 위젯들
다음은 흔히 사용되는 위젯들에 대한 리스트이다. 이 클래스들은 PyQt4.QtGui 모듈에 있다.
위젯 | 설명 |
---|---|
QLabel | 텍스트 레이블 표시. 이미지, 동영상 등도 표시. |
QLineEdit | 단순한 한 라인 텍스트 박스 |
QTextEdit | 멀티 라인, Rich Text 에디트 |
QCheckBox | 체크박스 |
QPushButton | 일반적인 버튼. 토클 버튼 사용 가능. |
QRadioButton | 옵션 버튼 |
QListBox | 리스트 박스 |
QComboBox | 콤보 박스 |
QProgressBar | 프로그레스 바 |
QSlider | 막대 바로 표시된 슬라이스바 |
QMenu | 메뉴 클래스. QAction과 같이 사용. |
QPopupMenu | 팝업 컨텍스트 메뉴 |