PyQt4 信号和槽详解

参照文档:

https://www.linuxzen.com/pyqt4-xin-hao-he-cao-xiang-jie.html

http://sofire.iteye.com/blog/1797845

使用起来并没有发生什么大问题,除了QtCore.SIGNAL以及QtCore.pyqtSignal的使用上出了偏差。

QtCore.pyqtSignal用来自定义一个pyqt的signal,要注意定义在pyqt的控件类的子类里,并且要作为类变量,而不是成员变量:

QtCore.pyqtSignal(int) 括号的int表示只接收一个类型为int的参数

那么关于signal的绑定有两种方式:(绑定到定义好的槽也差不多,目前没发现定义成槽有啥好处)

xxx.signal.connect(yyy.function) 通过signal绑定到具体的方法

yyy.connect(xxx,QtCore.SIGNAL('signal()'),function) 这个就有点蛋疼,因为实际上function是不固定的,意思就是说function可以和yyy没有一点关系,定义在yyy的外面都没有关系,当然了,xxx要是yyy的子控件(或者就是本身)

关于什么时候触发,也有两种方式:在控件里

self.clicked.emit() 这边关于参数的定义的话要放在signal定义的时候,需要传的参数放在这里。

self.emit(QtCore.SIGNAL("clicked()"),)后面想跟啥参数跟啥参数,槽那边或者绑定的方法记得接收就行了

这里的signal里面加不加括号有大区别,加括号意味着你里面怎么写,那边怎么收,中间有不同,就报错(和第一种触发方式一样)。但不加的话,首先那边信号接收也要不加括号,然后这边可以随便传参,那边也可以随便接收或者不接收,不会报错。

这两种中间实际有一个巨大的差别,那就是,使用第二种触发方式的话,你绝大多数并不需要真正给你的控件定义一个signal也能使用,当然了你绑定的方法也只能用第二种了。

目前只发现使用第二种绑定方法的情况下,如果你需要将这个signal绑定到transition给状态机用的话,那么不管transition那边你用哪种方式绑定,你都要定义一个signal。

你可能感兴趣的:(PyQt4 信号和槽详解)