在上一章节中创建一个PushButton的视窗,但是点击之后没有触发任何效果,显然在用户交互的时候需要触发事件。这里就要提到两个概念Signals(信号)和Slots(插槽)。在某些编程语言中称为冒泡监听。
Signal除了可以通知之外,还可以发送数据,类似于某些编程语言中的冒泡。而Slot则是用于接收Signal, 它类似于某些编程语言中的事件监听,但是与监听不同的是Slots可以有很多个并行。
from PyQt5.QtWidgets import QApplication,QMainWindow,QPushButtonimport sysclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("教学应用")button = QPushButton("提交")self.setCentralWidget(button)self.setFixedSize(600,300)self.setMaximumSize(800,400)self.setMinimumSize(200,100)# button在默认情况下没有勾选功能。如果设置为True则启动button.setCheckable(True)# click事件监听1button.clicked.connect(self.the_button_was_clicked)# click事件监听2button.clicked.connect(self.the_button_was_toggled)# 自定义click事件def the_button_was_clicked(self):print("点击")def the_button_was_toggled(self,data):# 在默认情况下输出Falseprint(data)app =QApplication(sys.argv)window = MainWindow()window.show()app.exec()
前端数据的存储
PyQt5 通过class的私有变量进行前端变量数据的存储。但是与前端编程使用state存储输入框内容不同,PyQt5有自己的机制:
from PyQt5.QtWidgets import QApplication,QMainWindow,QWidget,QPushButton,QLabel,QLineEdit,QVBoxLayoutimport sysclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("教学应用")self.label = QLabel()self.input = QLineEdit()# 监听输入框,self.lable.setText可直接修改label文本内容self.input.textChanged.connect(self.label.setText)layout = QVBoxLayout()layout.addWidget(self.input)layout.addWidget(self.label)container = QWidget()container.setLayout(layout)self.setCentralWidget(container)app =QApplication(sys.argv)window = MainWindow()window.show()app.exec()

由于前端的组件存在嵌套性,所以在某些情况下需要考虑到事件的接受和忽略:
class CustomButton(QPushButton)def mousePressEvent(self, e):e.accept()e.ignore()
pyqtSlot用法
from PyQt5.QtCore import pyqtSlot
