PyQt개발강좌, 이벤트 핸들링 (마우스, 키보드, 윈도우 이벤트)

PyQt는 Python을 위한 강력한 GUI 프레임워크로, Qt 프레임워크의 다양한 기능을 활용할 수 있도록 해줍니다. 이 강좌에서는 PyQt에서의 이벤트 핸들링, 특히 마우스 이벤트, 키보드 이벤트, 그리고 윈도우 이벤트에 대해 심도 있게 다루어 보겠습니다. 이벤트 핸들링은 사용자의 입력이나 시스템의 변화를 자동으로 감지하고 그에 따라 알맞은 반응을 하도록 만들어 주는 중요한 프로그래밍 기법입니다. 본 강좌를 통해 여러분은 PyQt에서 이벤트를 효과적으로 처리하는 방법을 배우게 될 것입니다.

이벤트 핸들링의 기본 개념

이벤트란 사용자가 프로그램에 대해 수행하는 어떤 행동을 말합니다. 사용자가 버튼을 클릭하거나 키보드를 누르는 등의 모든 행위는 이벤트로 간주됩니다. PyQt에서 이벤트 핸들링은 주로 이벤트를 발생시키는 위젯에 대해 정의된 메서드를 통해 이루어집니다. 이러한 메서드는 다음과 같이 이벤트를 감지하고 처리하는 각기 다른 형태를 가질 수 있습니다:

  • 이벤트 리스너: 특정 이벤트가 발생했을 때 호출되는 메서드.
  • 이벤트 객체: 이벤트에 대한 정보를 담고 있는 객체.
  • 상속: 기본 제공되는 이벤트 메서드를 오버라이드하여 기능을 추가.

마우스 이벤트 핸들링

마우스 이벤트는 사용자가 마우스를 클릭하거나 이동할 때 발생하는 이벤트입니다. PyQt에서는 다양한 마우스 이벤트를 다룰 수 있는데, 여기에는 마우스 클릭, 더블 클릭, 마우스 이동, 스크롤 등이 포함됩니다.

마우스 이벤트 처리 기본 예제


import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('Mouse Event Example')
        self.setGeometry(100, 100, 400, 300)

        layout = QVBoxLayout()
        self.button = QPushButton('Click Me', self)
        layout.addWidget(self.button)
        self.setLayout(layout)

        self.button.clicked.connect(self.on_click)  # 버튼 클릭 이벤트 연결

    def on_click(self):
        print('Button clicked!')

    def mousePressEvent(self, event):
        print(f'Mouse pressed at: ({event.x()}, {event.y()})')

    def mouseMoveEvent(self, event):
        print(f'Mouse moved to: ({event.x()}, {event.y()})')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyWidget()
    ex.show()
    sys.exit(app.exec_())

위의 예제에서, 사용자는 버튼을 클릭할 수 있으며, 마우스 버튼을 누르거나 움직일 때마다 해당 좌표가 출력됩니다. mousePressEventmouseMoveEvent 메서드를 오버라이드하여 마우스 이벤트를 처리하는 방법을 보여주었습니다.

키보드 이벤트 핸들링

키보드 이벤트는 사용자가 키보드의 키를 눌렀을 때 발생하는 이벤트입니다. 키보드 이벤트를 처리하면 사용자의 입력을 바탕으로 프로그램의 동작을 조정할 수 있습니다.

키보드 이벤트 처리 기본 예제


import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QVBoxLayout

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('Keyboard Event Example')
        self.setGeometry(100, 100, 400, 200)

        layout = QVBoxLayout()
        self.line_edit = QLineEdit(self)
        self.line_edit.setPlaceholderText('Type something and press Enter...')
        layout.addWidget(self.line_edit)
        self.setLayout(layout)

        self.line_edit.returnPressed.connect(self.on_enter)  # Enter 키 이벤트 연결

    def on_enter(self):
        text = self.line_edit.text()
        print(f'You typed: {text}')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyWidget()
    ex.show()
    sys.exit(app.exec_())

이 예제에서는 QLineEdit 위젯에 텍스트를 입력하고 Enter 키를 누르면 입력한 텍스트가 출력됩니다. returnPressed 시그널을 사용하여 Enter 키가 눌렸을 때 on_enter 메서드가 호출됩니다.

윈도우 이벤트 핸들링

윈도우 이벤트는 애플리케이션의 윈도우가 생성되거나 닫힐 때, 또는 크기가 조절될 때 발생하는 이벤트입니다. 일반적으로 위젯의 상태나 배치를 변경할 때 유용하게 사용됩니다.

윈도우 이벤트 처리 기본 예제


import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('Window Event Example')
        self.setGeometry(100, 100, 400, 300)

        self.label = QLabel('Resize the window to see the event.', self)
        self.label.setGeometry(10, 10, 300, 20)

    def resizeEvent(self, event):
        new_size = event.size()
        self.label.setText(f'Window resized to: {new_size.width()}x{new_size.height()}')
        print(f'Window resized to: {new_size.width()}x{new_size.height()}')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyWidget()
    ex.show()
    sys.exit(app.exec_())

위 예제에서는 윈도우의 크기를 조절할 때마다 그 크기가 라벨에 표시됩니다. resizeEvent 메서드를 오버라이드하여 예외적으로 윈도우의 크기 변경을 처리하였습니다.

복합적인 이벤트 처리

실제로 많은 경우, 여러 가지 이벤트가 동시에 발생합니다. 예를 들어, 마우스를 클릭하면서 키를 누르는 작업은 둘 이상의 이벤트를 포함합니다. 이러한 복합적인 이벤트를 처리하는 방법은 중요합니다.

복합 이벤트 처리 기본 예제


import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('Complex Event Handling Example')
        self.setGeometry(100, 100, 400, 300)

        self.label = QLabel('Press a key and click the mouse.', self)
        self.label.setGeometry(10, 10, 300, 20)

    def keyPressEvent(self, event):
        self.label.setText(f'Key pressed: {event.text()}')

    def mousePressEvent(self, event):
        self.label.setText(f'Mouse clicked at: ({event.x()}, {event.y()})')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyWidget()
    ex.show()
    sys.exit(app.exec_())

이 예제에서는 키를 누르고 마우스를 클릭했을 때 라벨이 업데이트되는 모습을 볼 수 있습니다. keyPressEventmousePressEvent를 각각 정의하여 이벤트를 처리하였습니다.

결론

이번 강좌에서는 PyQt의 이벤트 핸들링에 대해 다루어 보았습니다. 이벤트는 GUI 프로그램에서 매우 중요한 요소이며, 사용자와의 상호작용을 체계적으로 처리하는 방법을 배웠습니다. 마우스 이벤트, 키보드 이벤트, 그리고 윈도우 이벤트를 각각 살펴보았으며, 이러한 이벤트를 활용하는 여러 가지 예제를 통해 실습하였습니다. PyQt의 강력한 기능을 활용하여 더욱 풍부한 사용자 경험을 제공하는 애플리케이션을 만들어 보시기 바랍니다.

추가로, 여러분의 프로그램에 필요한 다양한 이벤트를 처리하는 방법에 대해 더욱 깊이 학습하기 위해서는 공식 문서와 예제 코드를 참조하는 것이 좋습니다. PyQt에는 다양한 위젯과 이벤트가 있으며, 이를 통해 여러분은 더욱 매력적이고 유용한 GUI 애플리케이션을 개발할 수 있습니다.

감사합니다!