[ICT인턴십] PyQt5 Event 처리

김유상·2022년 10월 19일
0

ICT인턴십

목록 보기
5/21

Signal, Slots, Events

Event: 프로그램 외부에서 프로그램으로 전달되는 작용, 예를 들어 마우스 클릭, 키보드 입력, 드래그, 포커스인/아웃 등

Signal: 전달된 이벤트가 프로그램 내의 오브젝트에 전달될 때, 오브젝트가 발생시키는 것, 예를 들어 button clicked

Slot: Signal에 의해 실행되는 로직(콜백 함수)
Referenced: https://gaussian37.github.io/python-gui-pyqt5_snippets/


PyQt5 KeyEvent

PyQt에는 키보드 키를 입력받고 특별한 이벤트를 발생시킬 수 있다. 이때 이벤트라 함은 특정 함수를 호출하는 정도가 될 수 있는데 아래의 직접 작성한 코드를 확인하면 왼쪽 방향키를 누르면 prevBtnAction과 같은 동작을 하는 것을 알 수 있다. 오른쪽도 마찬가지이다. 이렇게 필요한 기능을 키보드 키를 누를 때, 발생시킬 수 있는데

    def keyPressEvent(self, e):
        if e.key() == QtCore.Qt.Key_Escape:
            self.close()
        elif e.key() == QtCore.Qt.Key_Left and self.prev_btn.isEnabled():
            self.prevBtnAction(self.width_scale, self.folder_path, self.file_index, self.test_num)
        elif e.key() == QtCore.Qt.Key_Right and self.next_btn.isEnabled():
            self.nextBtnAction(self.width_scale, self.folder_path, self.file_index, self.test_num)

문제는 방향키를 입력하는데 발생했다. 방향키를 입력할 때, 화면 안에 커서가 잡혀있으면 방향 키가 내부 오브젝트를 이동하는 데 이용되도록 한다. 따라서 원하는 이벤트가 발생하지 못할 수 있는데 이런 경우에는 가장 바깥 쪽 실행로직을 작성할 때, 윈도우에 setFocus()를 이용해 커서를 이동시켜주면 된다.

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = LabelingMain()
    window.setFocus()
    app.installEventFilter(window)
    sys.exit(app.exec_())

Referenced: https://stackoverflow.com/questions/41370410/check-the-state-of-qpushbutton-in-pyqt4, https://stackoverflow.com/questions/57238032/how-do-i-make-this-pyqt5-character-move-on-arrow-key-input

profile
continuous programming

0개의 댓글