[PyQt5] 3. Class
이런 코드를 쓸 수도 있지만
조금만 프로젝트가 복잡해져도 힘들어지기 때문에
대부분 클래스를 이용해서 GUI를 만듭니다.
from PyQt5.QtWidgets import QApplication, QMainWindow
app = QApplication([])
my_window = QMainWindow()
my_window.setWindowTitle('My App')
my_window.setGeometry(100, 100, 300, 300)
my_window.show()
app.exec_()
https://github.com/pycrawling/pyqt5_study/blob/main/pyqt5_study_03-1.py
클래스를 만들고 최상위 위젯 QWidget, QDialog, QMainWindow 등을 상속합시다.
상속할 때 부모 클래스의 초기화 루틴을 실행해 주는 것을 잊으면 안 됩니다.
from PyQt5.QtWidgets import QApplication, QMainWindow
class MyWindow(QMainWindow): # QMainWindow 를 상속합니다.
def __init__(self):
super().__init__() # 부모 클래스의 초기화 메서드를 가져와 실행합니다.
self.setWindowTitle('My App')
self.setGeometry(100, 100, 300, 300)
app = QApplication([])
my_window = MyWindow()
my_window.show()
app.exec_()
https://github.com/pycrawling/pyqt5_study/blob/main/pyqt5_study_03-2.py
여기에 버튼을 추가합시다.
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
app = QApplication([])
my_window = QMainWindow()
my_window.setWindowTitle('My App')
my_window.setGeometry(100, 100, 300, 300)
# QPushButton 의 첫번째 인수는 버튼의 Title 입니다.
# 두번째 인수는 상위 위젯을 의미합니다.
# 버튼은 my_window 의 내부에 있게됩니다.
button1 = QPushButton('Click me', my_window)
button1.move(10, 10)
my_window.show()
app.exec_()
https://github.com/pycrawling/pyqt5_study/blob/main/pyqt5_study_03-3.py
클래스로 정리해 봅니다.
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
class MyWindow(QMainWindow):
def __init__(self):
super(MyWindow, self).__init__()
self.setWindowTitle('My App')
self.setGeometry(100, 100, 300, 300)
button1 = QPushButton('Click me', self)
button1.move(10, 10)
app = QApplication([])
my_window = MyWindow()
my_window.show()
app.exec_()
https://github.com/pycrawling/pyqt5_study/blob/main/pyqt5_study_03-4.py
클래스를 사용하는 것이 더 깔끔하고 직관적인 것 같습니다.
꼬리표(두 번째 인수) self가 아직 있습니다.
차후에 layout을 이용하면 self까지 생략할 수 있습니다.
self는 객체(인스턴스)가 되었을 때 객체 자신을 의미합니다.
여러 번 객체가 될 수도 있지만
여기서는 my_window = MyWindow()로 한 번 객체가 되었네요.
MyWindow 클래스에서 my_window 객체가 생성되었고
이때 self는 my_window가 됩니다.
클래스는 아주 중요한 개념이기 때문에
혹시 잘 모르신다면 다른 글들을 참고하십시오.