PyQt Event事件

本文主要介绍PyQt5每天必须学习的事件和信号的相关信息,具有一定的参考价值,有兴趣的合作伙伴可以参考

在本节中,我们将探讨如何在应用程序中实现PyQt5的事件和信号。

 

事件

所有GUI应用程序都是事件驱动的。应用程序事件主要由用户生成,但是它们也可以通过其他方式生成,例如Internet连接,窗口管理器或计时器。当我们调用应用程序的exec_()方法时,应用程序进入主循环。主循环检测各种事件并将其发送到事件对象。

在事件模型中,有三个参与者。

  • 事件来源
  • 事件对象
  • 事件目标

事件源是生成事件的对象状态的变化。事件对象(event)是在事件源中封装状态更改的对象。事件目标是要通知的对象。事件源对象表示将事件处理到事件目标的任务。

PyQt5使用独特的信号和插槽机制来处理事件。信号和插槽用于对象之间的通信,并且当发生特定事件时,将触发该信号。该插槽可以是任何Python调用。信号传输过程中将调用与插槽的连接。

信号和插槽

这是一个简单的示例,演示PyQt5的信号和插槽。

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(250, 250, 250, 150)
       self.setWindowTitle('Events demo') 
       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的显示(显示)插槽。

发射器是发送信号的对象。接收器是接收信号的对象。什么时隙是对信号的反馈方法。

pyqt事件信号槽

覆盖系统事件处理程序。您可以使用任何键来触发事件。
在下面的示例中,转义键触发一个退出程序的事件。

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('PyQt events with keyboard') 
        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()方法。

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton

class Example(QMainWindow):

    def __init__(self):
         super().__init__()
         self.initUI()

    def initUI(self):
        btn1 = QPushButton('One', self)
        btn1.move(30, 50)
        btn2 = QPushButton('Two', 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('Window') 
        self.show()

    def buttonClicked(self):
        sender = self.sender()
        self.statusBar().showMessage(sender.text() + ' changed')

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() + ' changed')

我们通过调用sender()方法来确定信号源。在应用程序的状态栏中,显示所按下按钮的标签。

pyqt按钮单击事件

定制的发射信号

从QObject创建的对象可以发出信号。在下面的示例中,我们将研究如何自定义发送的信号。

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('Mouse events') 
        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()

创建一个从QObject继承的Communicate类,该类具有pyqtSignal()类的属性。

self.c = Communicate()
self.c.closeApp.connect(self.close)

将我们的自定义closeApp信号连接到QMainWindow中的close()插槽。

def mousePressEvent(self, event):
    self.c.closeApp.emit()

当我们的鼠标在程序窗口中单击时,CloseApp信号被发出(发射):应用程序终止。

标签

发表评论