예제로 배우는 PyQt

예제 중심으로 배우는 PyQt 프로그래밍

예제 작성 과정 #2 - 소스 코드에서 시그널 및 슬롯 연결

예제 작성 과정 #1에서 두가지 방법으로 시그널 및 슬롯을 연결해 두었다.

  1. Qt Designer에서 직접 위젯간의 시그널 슬롯 연결
  2. 사용자 정의 슬롯 사용을 위한 슬롯 정의

1번의 경우에는 소스코드를 따로 작성할 필요 없이 완벽하게 각 객체가 이어진다. 현재 예제까지는 ui 파일을 Python 코드로 변환없이 uic 모듈을 사용하여 바로 사용하고 있지만, 결과적으로 ui 파일을 python 파일로 변환해서 살펴보면 시그널 슬롯을 이어주는 소스코드가 들어가 있는걸 확인 할 수 있다.

2벌의 경우에는 사용자 슬롯을 정의해 두었기 때문에 해당 슬롯의 이름을 가진 멤버 함수를 작성해야 한다. 해당 멤버함수가 소스코드에 존재하지 않는다면 에러가 실행시 슬롯이 없다며 에러가 나게 된다.

아래는 예제 작성 과정 #1에서 만든 ui 을 정의한 사용자 정의 슬롯을 작성한 소스코드이다.

# coding: utf-8

import sys
from PyQt5 import QtWidgets
from PyQt5 import QtGui
from PyQt5 import uic
from PyQt5 import QtCore
from PyQt5.QtCore import pyqtSlot


class Form(QtWidgets.QDialog):
    def __init__(self, parent=None):
        QtWidgets.QDialog.__init__(self, parent)
        self.ui = uic.loadUi("ui.ui", self)
        self.ui.show()

    @pyqtSlot()
    def slot_1st(self):
        self.ui.label.setText("첫번째 버튼")

    @pyqtSlot()
    def slot_2nd(self):
        self.ui.label.setText("두번째 버튼")

    @pyqtSlot()
    def slot_3rd(self):
        self.ui.label.setText("세번째 버튼")

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = Form()
    sys.exit(app.exec())

이제 각 Push Button을 클릭할 때마다 슬롯에 정의된 바와 같이 Label의 문구가 바뀌게 된다. 물론 문구가 아닌 다른 작업을 진행할 수 있으니 응용을 해보도록 하자.

댓글

댓글 본문
  1. Yong Hwan Kim
    안녕하세요~ 자세한 강의 감사드립니다.
    여쭤볼게 있는데...decorator @pyqtSlot()는 어떤 역할을 하나요?
  2. pYQT초보
    안녕하세요~강좌 정주행중인 회사원입니다.
    제가 이해한바로는 Designer에서 각 slot을 연결 시켜주었으믄, 코드 작성을 안해주어도 UI실행에는 큰 문제 없는거 아닌가요??만약 그렇다면 코드 작성하지 않고 designer에서 UI 실행은 어떻게 진행하나요??
  3. 아미쓔
    너도 팽펑님이랑 똑같은 문제가 있었어요. QtDesigner로 다이얼로그 생성할 때, QMainWindow로 만들어서 오류가 났던거구요.
    저도 임덕규님의 말대로 다시 QDialog with button 으로 만들어서 실행하니 오류 없이 잘 실행됩니다.
    대화보기
    • 임덕규
      쥬피터 노트북이나 ipython notebook을 이용하신거 같은데, python 파일로 직접 작성하시어 실행해보시기 바랍니다.
      대화보기
      • 제이엠
        The kernel appears to have died. It will restart automatically.

        이런경우는 뭐가 문제인가요??
      • Seankim
        굿~~
      • 임덕규
        Qt가 잘못 설치된거 같습니다. 다시 설치해보시기 바랍니다.
        대화보기
        • 파썬
          Traceback (most recent call last):
          File "C:\Users\YongYong\Desktop\두견\h.py", line 4, in <module>
          from PyQt5 import QtWidgets
          ImportError: DLL load failed: 지정된 프로시저를 찾을 수 없습니다.


          이라고 오류뜨는데 어떻게 하나요?
        • 팽펑
          빠른 답변 감사합니다.

          https://stackoverflow.com......get

          이 글의 맨 아래 링크를 보고, 주신 예제에서 11번 라인을

          class Form(QtWidgets.QMainWindow):

          으로 바꾸니 잘 실행되네요. 원리나 문서없이 일단 따라하고 있는 중이라 이유는 잘 모르겠습니다.
          대화보기
          • 임덕규
            본 예제에서는 QMainWindow 위젯을 사용하지 않습니다. QDialog 로 UI를 다시 만들어 보시기 바랍니다.
            대화보기
            • 팽펑
              저만 여기서
              TypeError: ('Wrong base class of toplevel widget', (<class '__main__.Form'>, 'QMainWindow'))
              라는 오류 뜨나요...?
            • 임덕규
              코드로 직접 작성하는 signal과 slot은 설계가 중요합니다. Qt 공식 위젯 문서들을 참고하시어 설계를 하시면 쉽게 학습하실 수 있습니다. 감사합니다.
              대화보기
              • 학습자
                import sys
                from PyQt5 import QtWidgets
                from PyQt5 import QtGui
                from PyQt5 import uic
                from PyQt5 import QtCore
                from PyQt5.QtCore import pyqtSlot


                class Form(QtWidgets.QDialog):
                def __init__(self, parent=None):
                QtWidgets.QDialog.__init__(self, parent)
                self.ui = uic.loadUi("ui.ui", self)
                self.ui.show()

                @pyqtSlot()
                def slot_1st(self):
                b1=self.ui.label1.text() #label1이 첫번째 버튼 이름(ui파일)입니다.
                self.ui.label.setText(b1)

                @pyqtSlot()
                def slot_2nd(self):
                b2=self.ui.label2.text() #label2가 두번째 버튼 이름(ui파일)입니다.
                self.ui.label.setText(b2)

                @pyqtSlot()
                def slot_3rd(self):
                b3=self.ui.label3.text()
                self.ui.label.setText(b3) #label3가 세번째 버튼 이름(ui파일)입니다.

                if __name__ == '__main__':
                app = QtWidgets.QApplication(sys.argv)
                w = Form()
                sys.exit(app.exec())


                # 올려주신 코드를 다른 강좌 코드와 조합하여 보았습니다.
                # 올려주신 코드는 첫번째 버튼, 두번째 버튼, 세번째 버튼을 코드에 있는 값을 그대로 출력하지만
                # 클릭하면 숫자가 올라가는 강좌를 보면 버튼의 값을 가져와서 버튼을 값을 출력하게끔 하는 코드처럼
                # 변경해 보았습니다. 유용한 강좌 감사합니다.
              • 임덕규
                https://opentutorials.org......974

                시그널과 슬롯에 대한 예제를 여러개 만들어 두었습니다. 설명은 따로 자세히 붙이지 않았습니다만 쉽게 이해가 되실거라 생각합니다. 답변이 많이 늦었네요.
                대화보기
                • Felix Hong-Soog Kim
                  @pyqtslot 데코레이터에 대한 설명을 추가해주세요.
                • 수수리
                  encoding이 맞지 않아서 다운될 수 있습니다.
                  utf-8로 셋팅해 보세요.
                  대화보기
                  • 왜 button을 클릭하면 pythonw.exe가 작동이 중지되었습니다. 하고 꺼질까요 ㅠㅠ