PyQt5学习教程11:几种signal与slot处理事件的方法
来源:互联网 发布:wap淘宝是什么访客 编辑:程序博客网 时间:2024/06/03 17:53
所有的GUI应用程序都是基于事件驱动的,事件不仅可由应用程序产生,诸如Internet链接、窗体管理器,定时器等都可以产生事件。PyQt通过signal和slot处理事件,本文以实例的方式进行讲解4种signal与slot处理事件的方法。
1、本文加入LCDNumber和Slider控件,通过Slider值的改变来控制LCDNumber的显示。
2、处理btnOK、btnCancel和btnQuit三个控件的clicked事件。
3、从QObject类派生Communicate类,因为每个QObject都可以发射信号,我们将处理主窗体的mousePressEvent事件,让其发射信号,并将其指定到窗体的close slot中。
4、窗体键盘按下事件和关闭事件,进行了直接处理。
源程序:
import sysfrom PyQt5.QtWidgets import QWidget, \ QPushButton, \ QToolTip, \ QMessageBox, \ QApplication, \ QDesktopWidget, \ QMainWindow, \ QAction, \ qApp, \ QLCDNumber, \ QSlider, \ QVBoxLayout, \ QHBoxLayoutfrom PyQt5.QtCore import Qt, \ QObject, \ pyqtSignalfrom PyQt5.QtGui import QFont, \ QIconclass Communicate(QObject): closeApp = pyqtSignal()# QMainWindow是QWidget的派生类class CMainWindow(QMainWindow): def __init__(self): super().__init__() # ToolTip设置 QToolTip.setFont(QFont('华文楷体', 10)) # statusBar设置 self.statusBar().showMessage('准备就绪') # 退出Action设置 exitAction = QAction(QIcon('1.png'), '&Exit', self) exitAction.setShortcut('ctrl+Q') exitAction.setStatusTip('退出应用程序') exitAction.triggered.connect(qApp.quit) # qApp就相当于QCoreApplication.instance() # menuBar设置 menubar = self.menuBar() fileMenu = menubar.addMenu('&File') fileMenu.addAction(exitAction) # toolBar设置 self.toolbar = self.addToolBar('Exit') self.toolbar.addAction(exitAction) # 确认PushButton设置 btnOK = QPushButton("OK") btnOK.setToolTip("点击此按钮将确认改变!") # btnOK.setStatusTip("点击此按钮将确认改变!") btnOK.clicked.connect(self.buttonClicked) btnOK.resize(btnOK.sizeHint()) # 取消PushButton设置 btnCancel = QPushButton("Cancel") btnCancel.setToolTip("点击此按钮将放弃改变!") # btnCancel.setStatusTip("点击此按钮将放弃改变!") btnCancel.clicked.connect(self.buttonClicked) btnCancel.resize(btnCancel.sizeHint()) # 退出PushButton设置 btnQuit = QPushButton('退出') btnQuit.setToolTip("点击此按钮将退出应用程序!") btnQuit.setStatusTip("点击此按钮将退出应用程序!") btnQuit.clicked.connect(qApp.quit) btnQuit.resize(btnQuit.sizeHint()) # PushButton布局 hBox = QHBoxLayout() hBox.addStretch(1) hBox.addWidget(btnOK) hBox.addWidget(btnCancel) hBox.addWidget(btnQuit) # LCDNumber和Slider设置 lcd = QLCDNumber(self) sld = QSlider(Qt.Horizontal, self) sld.valueChanged.connect(lcd.display) # 布局 vBox = QVBoxLayout() vBox.addWidget(lcd) vBox.addWidget(sld) vBox.addLayout(hBox) widget = QWidget() self.setCentralWidget(widget) # 建立的widget在窗体的中间位置 widget.setLayout(vBox) self.c = Communicate() self.c.closeApp.connect(self.close) # Window设置 self.resize(500, 300) self.center() self.setFont(QFont('华文楷体', 10)) self.setWindowTitle('PyQt5应用教程(snmplink编著)') self.setWindowIcon(QIcon('10.png')) self.show() def center(self): # 得到主窗体的框架信息 qr = self.frameGeometry() # 得到桌面的中心 cp = QDesktopWidget().availableGeometry().center() # 框架的中心与桌面中心对齐 qr.moveCenter(cp) # 自身窗体的左上角与框架的左上角对齐 self.move(qr.topLeft()) def mousePressEvent(self, event): self.c.closeApp.emit() def buttonClicked(self): sender = self.sender() self.statusBar().showMessage(sender.text() + '按下') def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.close() def closeEvent(self, QCloseEvent): reply = QMessageBox.question(self, 'PyQt5应用教程(snmplink编著)', "是否要退出应用程序?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: QCloseEvent.accept() else: QCloseEvent.ignore()if __name__ == '__main__': app = QApplication(sys.argv) MainWindow = CMainWindow() sys.exit(app.exec_())
程序解释:
1、第11行:输入QLCDNumber模块,用于使用LCDNumber控件。
2、第12行:输入QSlider模块,用于使用Slider控件。
3、第16行:输入QObject模块,用于声明QObject对象,QObject对象可以发射和接收signal。
4、第17行;输入pyqtSignal模块,用于发射和接收signal。
5、第22行:定义Communicate类,该类从QObject派生,拥有pyqtSignal类型的成员closeApp。
6、第57行:处理了btnOK的单击事件,关联到buttonClicked方法。
7、第64行:处理了btnCancel的单击事件,关联到buttonClicked方法。
8、第82行:声明QLCDNumber对象lcd。
9、第83行:声明QSlider对象sld。
10、第84行:关联sld的valueChanged事件的slot为lcd的display方法,这样当sld的数值改变后,其值将会在lcd上显示。
11、第95行:建立Communicate对象c。
12、第96行:c的成员closeApp关联slot为self.close。
13、第116-117行:处理鼠标点击事件,当鼠标按下后c的closeApp发射信号,由于其已于close关联,所以会触发窗体关闭。
14、第119-121行,处理OK和Cancel按钮按下事件,其信息在状态栏输出。
15、第123-124行,处理键盘按下事件,当发生时,对按键进行判断,如果是ESC键,则调用sel.close。
程序运行效果:
1、拖动slider时,LCDNumber的值会随之改变。
2、点击OK和Cancel按钮,状态栏可以自动区分。
3、点击ESC键,可以触发窗体关闭。
4、鼠标点击窗体,可以触发窗体关闭。
原创性文章,转载请注明出处 http://user.qzone.qq.com/2756567163。
CSDN:http://blog.csdn.net/qingwufeiyang12346
- PyQt5学习教程11:几种signal与slot处理事件的方法
- QT中SIGNAL与SLOT连接的几种方式
- QT中的signal/slot的事件
- QT的signal和slot的几种常见使用场景
- Boost 的事件管理架構:Signal / Slot
- Boost 的事件管理架構:Signal / Slot(上)
- Boost 的事件管理架構:Signal / Slot(中)
- Boost 的事件管理架構:Signal / Slot(下)
- PyQt5教程-09-事件与信号
- PyQt5:重写事件处理方法(17)
- Qt学习笔记:Signal & Slot
- Qt 的 signal与slot底层实现机制详解
- signal和slot的权限
- Signal和Slot的粘合剂
- Qt的slot和signal
- CTK 事件管理机制(signal/slot)
- Qt的signal/slot的4种连接方式
- Signal & Slot
- 数据结构之循环队列
- 中文乱码问题
- 习题4.1
- CodeForces 315B(线段树+区间更新)
- 安卓面经之未解决问题
- PyQt5学习教程11:几种signal与slot处理事件的方法
- 【个人模板】图的广度,深度优先遍历
- Android中Toast的基础用法
- nodejs之pool连接池
- LeetCode.187 Repeated DNA Sequences
- 反射Class类、Constructor类、Field类
- SSH整合Demo
- Selenium常用方法2
- JAVA相关基础知识