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++基础并且感兴趣的同学可以看一看。

0 0
原创粉丝点击