PyQT5事件和信号
*无特殊注明,所有案例只修改第一个案例的对应部分* ## Signals & slots ```python import sys from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * # 继承QWidget,用户界面的基本控件,提供了基本的应用构造器 # 默认情况下,构造器是没有父级的,没有父级的构造器被称为窗口(window) class Example(QWidget): # 继承父类构造 def __init__(self): super().__init__() # 使用initUI()方法创建一个GUI self.initUI() # 初始化组件 def initUI(self): # 创建一个LCD屏幕和水平滑块 lcd = QLCDNumber(self) sld = QSlider(Qt.Horizontal, self) # 创建一个垂直布局,并将组件添加进去 vbox = QVBoxLayout() vbox.addWidget(lcd) vbox.addWidget(sld) # 将垂直布局放入窗口 self.setLayout(vbox) # 将sld的值与lcd的屏幕绑定 sld.valueChanged.connect(lcd.display) # 不注释了 self.setGeometry(300, 300, 300, 250) self.setWindowTitle('Signal and slot') self.show() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() # 进入应用的主循环中,调用exit()方法或直接销毁主控件时,主循环就会结束 sys.exit(app.exec_()) ``` ![](https://blog.coolcooltomato.com/uploads/article/Signals.png) ## 重构事件处理器 ```python # 初始化组件 def initUI(self): # 不注释了 self.setGeometry(300, 300, 300, 250) self.setWindowTitle('Event handler') self.show() # 重写事件处理器函数 def keyPressEvent(self, e): # 按下Esc键关闭程序 if e.key() == Qt.Key_Escape: self.close() ``` ![](https://blog.coolcooltomato.com/uploads/article/重构事件处理器.png) ## 事件对象 ```python # 初始化组件 def initUI(self): # 创建一个QGridLayout实例 grid = QGridLayout() grid.setSpacing(10) # 初始化x,y x = 0 y = 0 # 创建一个标签显示x,y的值 self.text = "x: {0}, y: {1}".format(x, y) self.label = QLabel(self.text, self) # 将标签加入grid grid.addWidget(self.label, 0, 0, Qt.AlignTop) # 事件追踪默认没有开启,当开启后才会追踪鼠标的点击事件 self.setMouseTracking(True) # 将QGridLayout实例放到窗口里 self.setLayout(grid) # 不注释了 self.setGeometry(300, 300, 300, 250) self.setWindowTitle('Event object') self.show() # e代表了事件对象,里面有我们触发事件(鼠标移动)的事件对象 def mouseMoveEvent(self, e): # 获取鼠标的坐标 x = e.x() y = e.y() # 更新text和label的值 text = "x: {0}, y: {1}".format(x, y) self.label.setText(text) ``` ![](https://blog.coolcooltomato.com/uploads/article/事件对象.png) ## 事件发送 这里使用的是QMainWindow ```python import sys from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * class Example(QMainWindow): # 继承父类构造 def __init__(self): super().__init__() # 使用initUI()方法创建一个GUI self.initUI() # 初始化组件 def initUI(self): # 按钮1 btn1 = QPushButton("Button 1", self) btn1.move(30, 50) # 按钮2 btn2 = QPushButton("Button 2", self) btn2.move(150, 50) # 绑定自定义函数 btn1.clicked.connect(self.buttonClicked) btn2.clicked.connect(self.buttonClicked) # 状态栏 self.statusBar() # 不注释了 self.setGeometry(300, 300, 300, 250) self.setWindowTitle('Event sender') self.show() # 自定义按钮点击函数 def buttonClicked(self): # 调用sender()方法的方式决定了事件源 sender = self.sender() # 显示事件源的text值+str self.statusBar().showMessage(sender.text() + ' was pressed') if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() # 进入应用的主循环中,调用exit()方法或直接销毁主控件时,主循环就会结束 sys.exit(app.exec_()) # 自定义按钮点击函数 def buttonClicked(self): # 调用sender()方法的方式决定了事件源 sender = self.sender() # 显示事件源的text值+str self.statusBar().showMessage(sender.text() + ' was pressed') ``` ![](https://blog.coolcooltomato.com/uploads/article/事件发送.png) ## 信号发送 QObject实例能发送事件信号,下面的例子是发送自定义的信号 ```python import sys from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * # Communicate类创建了一个pyqtSignal()属性的信号 class Communicate(QObject): closeApp = pyqtSignal() class Example(QMainWindow): # 不注释了 def __init__(self): super().__init__() self.initUI() # 初始化组件 def initUI(self): # closeApp信号QMainWindow的close()方法绑定 self.c = Communicate() self.c.closeApp.connect(self.close) # 不注释了 self.setGeometry(300, 300, 300, 250) self.setWindowTitle('Emit signal') self.show() # 点击窗口的时候,发送closeApp信号,程序终止 def mousePressEvent(self, event): self.c.closeApp.emit() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() # 进入应用的主循环中,调用exit()方法或直接销毁主控件时,主循环就会结束 sys.exit(app.exec_()) ``` ![](https://blog.coolcooltomato.com/uploads/article/信号发送.png)
创建时间:2023-04-19
|
最后修改:2023-12-27
|
©允许规范转载
酷酷番茄
首页
文章
友链