在上一章节中创建一个PushButton的视窗,但是点击之后没有触发任何效果,显然在用户交互的时候需要触发事件。这里就要提到两个概念Signals
(信号)和Slots
(插槽)。在某些编程语言中称为冒泡监听。
Signal
除了可以通知之外,还可以发送数据,类似于某些编程语言中的冒泡。而Slot
则是用于接收Signal
, 它类似于某些编程语言中的事件监听,但是与监听不同的是Slots
可以有很多个并行。
from PyQt5.QtWidgets import QApplication,QMainWindow,QPushButton
import sys
class 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事件监听1
button.clicked.connect(self.the_button_was_clicked)
# click事件监听2
button.clicked.connect(self.the_button_was_toggled)
# 自定义click事件
def the_button_was_clicked(self):
print("点击")
def the_button_was_toggled(self,data):
# 在默认情况下输出False
print(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,QVBoxLayout
import sys
class 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