>  기사  >  백엔드 개발  >  PyQt5에서 매일 배워야 하는 이벤트와 신호

PyQt5에서 매일 배워야 하는 이벤트와 신호

不言
不言원래의
2018-04-20 13:59:453174검색

이 글은 주로 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에서 매일 배워야 하는 이벤트와 신호

시스템 이벤트 핸들러 덮어쓰기

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() 메소드를 호출하여 신호 소스를 결정합니다. 응용 프로그램의 상태 표시줄에 누른 버튼의 레이블이 표시됩니다.

프로그램이 실행된 후

PyQt5에서 매일 배워야 하는 이벤트와 신호

사용자 정의된 신호 방출

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 신호가 방출됩니다(방출). 신청이 종료되었습니다.

관련 추천:

Python PyQt4는 QQ 서랍 효과를 구현합니다

PyQt는 인터페이스 뒤집기 전환 효과를 구현합니다


위 내용은 PyQt5에서 매일 배워야 하는 이벤트와 신호의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.