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的显示(内置方法)
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_())