이 글은 주로 PyQt5에서 매일 배워야 하는 이벤트와 신호에 대한 관련 정보를 자세히 소개합니다. 관심 있는 친구들이 참고할 수 있습니다.
이 부분에서는 PyQt5의 이벤트와 신호를 살펴보겠습니다. 애플리케이션에서 구현하는 방법.
Events
모든 GUI 애플리케이션은 이벤트 기반입니다. 응용 프로그램 이벤트는 주로 사용자에 의해 생성되지만 인터넷 연결, 창 관리자 또는 타이머와 같은 다른 방법에 의해 생성될 수도 있습니다. 애플리케이션의 exec_() 메소드를 호출하면 애플리케이션은 메인 루프로 들어갑니다. 메인 루프는 다양한 이벤트를 감지하여 이벤트 객체로 보냅니다.
이벤트 모델에는 세 명의 참가자가 있습니다.
이벤트 소스(이벤트 소스)
이벤트 객체(이벤트 객체)
이벤트 대상(이벤트 대상)
이벤트 소스 객체의 상태가 변경되면 이벤트가 생성됩니다. 이벤트 객체(event)는 이벤트 소스의 상태 변경을 캡슐화하는 객체입니다. 이벤트 대상은 알림을 받고 싶은 객체입니다. 이벤트 소스 객체는 이벤트 대상에 대한 이벤트를 처리하는 작업을 나타냅니다.
PyQt5는 고유한 신호 및 슬롯 메커니즘을 사용하여 이벤트를 처리합니다. 신호와 슬롯은 객체 간 통신에 사용됩니다. 특정 이벤트가 발생하면 신호가 방출됩니다. 슬롯은 모든 Python 호출이 될 수 있습니다. 연결된 슬롯이 호출되면 신호가 방출됩니다.
신호 및 슬롯신호 및 슬롯
이것은 PyQt5의 신호 및 슬롯을 보여주는 간단한 예입니다.
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ PyQt5 教程 这个例子中,我们将QSlider的滑动信号连接到QLCDNumber中。 作者:我的世界你曾经来过 博客:http://blog.csdn.net/weiaitaowang 最后编辑:2016年8月1日 """ import sys from PyQt5.QtWidgets import (QApplication, QWidget, QSlider, QLCDNumber, QVBoxLayout) from PyQt5.QtCore import Qt class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): lcd = QLCDNumber(self) sld = QSlider(Qt.Horizontal, self) vbox = QVBoxLayout() vbox.addWidget(lcd) vbox.addWidget(sld) self.setLayout(vbox) sld.valueChanged.connect(lcd.display) self.setGeometry(300, 300, 250, 150) self.setWindowTitle('信号/槽') self.show() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
이 예에서는 QtGui.QLCDNumber 및 QtGui.QSlider가 사용됩니다. 슬라이더를 드래그하여 LCD 숫자를 변경합니다.
sld.valueChanged.connect(lcd.display)
여기서 슬라이더의 valueChanged 신호는 LCD의 디스플레이 슬롯에 연결됩니다.
Sender는 신호를 보내는 객체입니다. 수신기는 신호를 받는 객체입니다. 슬롯은 신호에 대한 피드백 방법입니다.
프로그램 실행 후
시스템 이벤트 핸들러 덮어쓰기
PyQt5의 이벤트 처리는 이벤트 핸들러를 다시 작성하여 수행되는 경우가 많습니다.
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ PyQt5 教程 在这个例子中,我们执行事件处理程序。 作者:我的世界你曾经来过 博客:http://blog.csdn.net/weiaitaowang 最后编辑:2016年8月1日 """ import sys from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtCore import Qt class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 250, 150) self.setWindowTitle('事件处理') self.show() def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.close() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
우리의 경우 keyPressEvent() 이벤트 핸들러를 다시 구현합니다.
def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.close()
키보드의 Esc 키를 누르면 애플리케이션이 종료됩니다.
이벤트 전송자 이벤트 전송
동일한 이벤트 대상에 연결된 여러 이벤트 소스를 쉽게 구별하기 위해 PyQt5에서는 sender() 메서드를 사용할 수 있습니다.
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ PyQt5 教程 在这个例子中,我们确定事件发送对象。 作者:我的世界你曾经来过 博客:http://blog.csdn.net/weiaitaowang 最后编辑:2016年8月1日 """ import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton class Example(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): btn1 = QPushButton('按钮一', self) btn1.move(30, 50) btn2 = QPushButton('按钮二', self) btn2.move(150, 50) btn1.clicked.connect(self.buttonClicked) btn2.clicked.connect(self.buttonClicked) self.statusBar() self.setGeometry(300, 300, 300, 150) self.setWindowTitle('事件发送') self.show() def buttonClicked(self): sender = self.sender() self.statusBar().showMessage(sender.text() + ' 被按下') if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
우리의 경우에는 두 개의 버튼이 있습니다. 두 버튼 모두 ButtonClicked() 메서드에 연결되어 있으며 sender() 메서드를 호출하여 클릭된 버튼에 응답합니다.
btn1.clicked.connect(self.buttonClicked) btn2.clicked.connect(self.buttonClicked)
두 개의 버튼이 같은 슬롯에 연결되어 있습니다.
def buttonClicked(self): sender = self.sender() self.statusBar().showMessage(sender.text() + ' 被按下')
sender() 메소드를 호출하여 신호 소스를 결정합니다. 응용 프로그램의 상태 표시줄에 누른 버튼의 레이블이 표시됩니다.
프로그램이 실행된 후
사용자 정의된 신호 방출
QObject에서 생성된 객체는 신호를 방출할 수 있습니다. 아래 예에서는 방출된 신호를 사용자 정의할 수 있는 방법을 살펴보겠습니다.
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ PyQt5 教程 在这个例子中,我们显示了如何以发射信号。 作者:我的世界你曾经来过 博客:http://blog.csdn.net/weiaitaowang 最后编辑:2016年8月1日 """ import sys from PyQt5.QtWidgets import QApplication, QMainWindow from PyQt5.QtCore import pyqtSignal, QObject class Communicate(QObject): closeApp = pyqtSignal() class Example(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.c = Communicate() self.c.closeApp.connect(self.close) self.setGeometry(300, 300, 300, 150) self.setWindowTitle('发射信号') self.show() def mousePressEvent(self, event): self.c.closeApp.emit() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
closeApp이라는 새로운 신호를 생성합니다. 이 신호는 마우스 누르기 이벤트를 발생시킵니다. 이 신호는 QMainWindow의 close() 슬롯에 연결됩니다.
class Communicate(QObject): closeApp = pyqtSignal()
pyqtSignal() 클래스의 속성을 갖는 QObject에서 상속된 Communicate 클래스를 만듭니다.
self.c = Communicate() self.c.closeApp.connect(self.close)
사용자 정의 closeApp 신호를 QMainWindow의 close() 슬롯에 연결합니다.
def mousePressEvent(self, event): self.c.closeApp.emit()
프로그램 창을 마우스로 클릭하면 closeApp 신호가 방출됩니다(방출). 신청이 종료되었습니다.
관련 추천:
위 내용은 PyQt5에서 매일 배워야 하는 이벤트와 신호의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!