pyQt中的信号

1. 说明

  • 在调用exec_()方法时,应用会进入主循环,而主循环会监听、处理事件
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QWidget, QLCDNumber, QSlider,
    QVBoxLayout, QApplication)

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('Signal and slot')
        self.show()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
  • QLCDNumber: 是一个仿LCD显示屏的qt组件
  • QSlider: 是qt滑块组件
  • sld.valueChanged.connect(lcd.display): 绑定语句。将滑块的数字变化(内置方法)用connect()连接至lcd的显示(内置方法)
    • 本例中,事件发送者是sld;事件接收者是lcd

2. 事件处理器的重写

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget, QApplication

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):      
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Event handler')
        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: 是qt中预先定义好的类。在覆写时会保有原先定义的函数操作,若发生冲突,则以用户复写的内容为准。
  • 该程序逻辑为:若按下ESC键,就调用Qwidget中的close()函数
  • (self, e): e是行为的接收者,是事件对象。不同的事件覆写类会产生相应不同的事件对象。e.key()表示接收到的按键

3. 事件发送者的判断

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

class Example(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):      
        #定义了两个按钮并确定其位置
        btn1 = QPushButton("Button 1", self)
        btn1.move(30, 50)
        btn2 = QPushButton("Button 2", self)
        btn2.move(150, 50)
        #两个函数的点击事件都绑定至本类中定义的方法,即若发生点击,就调用定义的函数
        btn1.clicked.connect(self.buttonClicked)            
        btn2.clicked.connect(self.buttonClicked)
        #调用方法,创建了一个工具栏,在26行会用到
        self.statusBar()
        self.setGeometry(300, 300, 290, 150)
        self.setWindowTitle('Event sender')
        self.show()

    def buttonClicked(self):
        #用QMainWindow中的sender()方法确定了发送者,并获得了发送者的title
        target = self.sender()
        self.statusBar().showMessage(target.text() + ' was pressed')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

4. 信号发送

常继承QObject类,调用其中的方法来发送信号
import sys
from PyQt5.QtCore import pyqtSignal, QObject
from PyQt5.QtWidgets import QMainWindow, QApplication

#定义类,继承自QObject,其中的pyqtSignal()用于发送信号。
class Communicate(QObject):
    #用pyqtSignal()申请信号变量closeApp
    closeApp = pyqtSignal() 

class Example(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        #创建了一个变量c,是一个含信号closeApp的对象
        self.c = Communicate()
        #将该信号与QMainWindow的close相绑定
        self.c.closeApp.connect(self.close)       
        self.setGeometry(300, 300, 290, 150)
        self.setWindowTitle('Emit signal')
        self.show()

    def mousePressEvent(self, event):
        #覆写了该类,有点击事件发生时,就发送c中的closeApp信号,信号会调用close
        self.c.closeApp.emit()

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
posted @ 2022-08-13 09:38  dysonkkk  阅读(153)  评论(0编辑  收藏  举报