PyQt基础第2篇——信号槽机制实现和简析
来源:互联网 发布:三千万光棍 知乎 编辑:程序博客网 时间:2024/05/16 19:24
抛开Python下的Qt不说,将原汁原味的C++实现的Qt摆到台面上来说,Qt的灵魂就是它的信号槽。比起MFC简单了不止一个数量级(极大可能性是因为我在MFC上很菜)。这一节我们先分享一下Qt下信号槽的特点,然后再说PyQt下连接信号槽的实现,最后从C++的角度解释一下Qt信号槽的实现机制。
一、信号槽的特点:
1、一个信号可以连接一个或者多个槽函数。
2、一个信号可以连接到另外一个信号。
3、信号的参数可以是Python的任意类型(PyQt)。
4、一个槽函数可以链接多个信号。
5、连接信号的方式可以有同步和异步两种类型。
6、连接可能会跨线程。
7、连接可能会断开。
二、PyQt中关于信号槽的链接十分的方便,也十分灵活。PyQt4中QObject属性下还有connect可以链接,但是在PyQt5中,QObject已经没有connect属性。如图:
所以在PyQt5中是能用“新式”的信号槽连接方式了。如下是两种信号槽的连接实现:(代码可运行)
# -*- coding:utf-8 -*-import sysfrom PyQt5 import QtCorefrom PyQt5.QtWidgets import QMainWindowfrom PyQt5.QtWidgets import QLabelfrom PyQt5.QtWidgets import QDialogfrom PyQt5.QtWidgets import QPushButtonfrom PyQt5.QtWidgets import QApplicationfrom PyQt5.QtWidgets import QGridLayoutfrom PyQt5.QtWidgets import QMessageBoxfrom PyQt5 import QtCoreclass TestHelloWorld(QDialog): def __init__(self,parent = None): super().__init__(parent) #第一种连接信号槽的方式 self.__buttonOne = QPushButton("One",self) self.__buttonOne.clicked.connect(self.buttonOneClicked) #第二种连接信号槽的方式 self.__buttonTow = QPushButton("Tow",self,clicked = self.towButtonClicked) mainLayout = QGridLayout() mainLayout.addWidget(self.__buttonOne,0,0,1,1) mainLayout.addWidget(self.__buttonTow,0,1,1,1) self.setLayout(mainLayout) self.__buttonOne.clicked.connect(self.buttonOneClicked) def buttonOneClicked(self): messageBox = QMessageBox() messageBox.setText("Button One Clicked") messageBox.exec_() def towButtonClicked(self): messageBox = QMessageBox() messageBox.setText("Button Tow Clicked") messageBox.exec_() if __name__ == "__main__": app = QApplication(sys.argv) window = TestHelloWorld() window.show() sys.exit(app.exec_())三、信号槽实现机制简析:
Qt中每一个对象都有记录该对象的一个元对象,生成元对象(QMetaObject)所需要的参数有类名,父类名,slot和signal的信息以及信号和槽的个数。QObject实现了信号与槽的机制,它利用元对象中保存的信息,首先通过检查发送对象的信号和槽是否存在,如果存在那么获取其索引来建立连接。建立连接的时候分别是通过发送信号的对象、信号的索引、接受信号的对象、处理信号的类型和处理信号的索引来建立连接。当信号发生的时候根据信号槽链接的方式(同步/异步)来激活槽函数。
这里只能粗浅的将它的大概流程讲一遍。具体实现的源码在这里可以看到。该博主对源码进行了详细的注释,有C++基础并且感兴趣的同学可以看一看。
- PyQt基础第2篇——信号槽机制实现和简析
- 信号和槽-Pyqt
- PyQt基础第0篇——环境配置
- PyQt基础第4篇——导入图片资源
- pyQt不同窗体间的值传递(二)——使用信号槽机制
- PyQt学习笔记-开端篇 信号和槽 signal slot
- pyqt信号和槽传递额外参数
- PyQt 信号和槽传递额外参数
- pyqt信号和槽传递额外参数
- PyQt笔记003——简单的信号与槽
- pyqt通过信号槽机制来退出线程
- PyQT之信号槽
- pyqt信号与槽
- PyQt基础第1篇——QWidget,QDialog,QMainWindow介绍
- PyQt基础第3篇——自定义窗口(隐藏最大最小化按钮)
- 信号和槽函数的基础实现
- 信号和槽机制
- 信号和槽机制
- [线性代数] 矩阵#1
- OC 对象和方法的关系
- 栈和队列基础知识
- 极光推送
- jrtplib 3.9.1 交叉编译 linux arm
- PyQt基础第2篇——信号槽机制实现和简析
- System V 消息队列
- MediaStore 与Media.EXTERNAL_CONTENT_URI
- 爬楼梯
- C#Winform判断文件和路径是否存在
- 基于JWT的Socket.io用户认证
- wdk中使用自旋锁SpinLock的规则及原因分析
- 项目day02--<客户上下线时间程序实现>(中)
- rcnn的相关的知识