1. 이벤트 핸들링
GUI 프로그램에서 버튼이 클릭되거나 콤보박스에서 아이템이 선택되거나 하는 것 같이 어떤 일이 발생하는 것을 이벤트(event)라 부른다. 이러한 이벤트들이 발생하면 특정 코드를 실행하도록 하는데, 이러한 이벤트 처리 코드(함수)를 이벤트핸들러(event handler)라 부른다. 참고로 Qt 에서는 이를 약간 다르게 표현하는데, 이벤트(event)를 Signal이라 칭하고, 이벤트핸들러를 Slot이라 부른다.
2. 이벤트핸들러 추가하기
앞의 [위젯] 아티클에서 만든 예제에서 OK 버튼이 클릭되었을 때 버튼 클릭 이벤트가 핸들링 되는 코드를 추가해 보자. 이벤트 핸들링을 정의하는 것은 문법적으로 특정한 이벤트를 이벤트핸들러 함수와 연결시키면 된다. 즉, 버튼의 경우 QPushButton 버튼 클래스에 있는 clicked 라는 이벤트를 특정한 함수와 연결(connect) 시키는 것이다. 이는 아래 예제와 같이 "UI객체.이벤트명.connect(핸들러함수명)"을 사용하여 구현할 수 있는데, 버튼 클릭 clicked 이벤트가 발생하면 self.btnOkClicked 함수가 실행되는 것이다.
여기서 한가지 주목할 점은 생성자가 아닌 다른 메서드에서 위젯을 사용하기 위해서는 해당 위젯을 "self.위젯객체" 와 같이 self 를 붙여 인스턴스 변수로 만들어 주어야 한다는 것이다. 아래 예제에서 editName은 btnOkClicked()라는 다른 메서드에서 사용되므로 생성자에서 self.editName 으로 하였다. lblName 이나 btnOk는 생성자 이외의 메서드에서 사용되지 않으므로 인스턴스 변수로 만들지 않았고 로컬 변수로 사용하였다.
class MyDialog(QDialog): def __init__(self): QDialog.__init__(self) lblName = QLabel("Name") self.editName = QLineEdit() btnOk = QPushButton("OK") layout = QVBoxLayout() layout.addWidget(lblName) layout.addWidget(self.editName) layout.addWidget(btnOk) self.setLayout(layout) btnOk.clicked.connect(self.btnOkClicked) def btnOkClicked(self): name = self.editName.text() QMessageBox.information(self, "Info", name)
위의 btnOkClicked() 메서드를 보면, editName 텍스트박스로부터 입력된 텍스트를 읽어서 이를 메시지박스로 보여주고 있다. 텍스트는 editName.text() 메서드를 사용하여 읽어오고, QMessageBox 클래스의 information() 메서드를 사용하여 메시지를 뿌려주게 된다. QMessageBox.information() 메서드의 첫번째 파라미터는 부모위젯을 표시하는 것으로 보통 self를 쓰면 되고, 두번째 파라미터는 메시지 박스의 타이틀을, 세번째 파라미터는 실제 메시지를 넣어 준다.