当前位置 : 主页 > 编程语言 > python >

PyQt4调用partial函数绑定多个信号到相同slot源码实例

来源:互联网 收集:自由互联 发布时间:2022-06-18
PyQt4.3包含4.3操作的实例源码,本人是4.8.7: #coding=utf8 ''' 把一个button的clicked()信号连接到一个响应信号的方法可能是最常见的连接场景。 但是如果大多数处理是相同的,只需要一些参数

PyQt4.3包含4.3操作的实例源码,本人是4.8.7:

#coding=utf8
'''
把一个button的clicked()信号连接到一个响应信号的方法可能是最常见的连接场景。
但是如果大多数处理是相同的,只需要一些参数化即可确定哪个特定按钮被按下。
在这样的情况下,通常的做法是把没法button连接相同的slot。
这里有两种实现方法:
1》使用partial(局部)函数来包装一个带有参数的插槽(slot),这样当调用插槽(slot)时,它将对按钮进行参数化。
2》通过PyQt告诉我们那个按钮调用slot(插槽)
这两种方法,在该实例中都有演示。
'''
import sys
'''
如果python的版本小于2.5,这时可以使用functools.partial()函数或着
用户自己创建的函数partial()函数;
否则,从functools模块中导入partial.
通过partial()把一个slot和一个button名绑定在一起。
'''
if sys.version_info[:2]<(2,5):
def partial(func,arg):
def callme():
return func(arg)
return callme
else:
from functools import partial

from PyQt4.QtCore import *
from PyQt4.QtGui import *


class Form(QDialog):
def __init__(self,parent=None):
super(Form,self).__init__(parent)
#创建一个水平布局容器
#用来容纳button和label
hblayout=QHBoxLayout()
oneBtn=QPushButton("One")
twoBtn=QPushButton("Two")
threeBtn=QPushButton("Three")
fourBtn=QPushButton("Four")
fiveBtn=QPushButton("Five")
self.messageLabel=QLabel("No button is clicked")

hblayout.addWidget(oneBtn)
hblayout.addWidget(twoBtn)
hblayout.addWidget(threeBtn)
hblayout.addWidget(fourBtn)
hblayout.addWidget(fiveBtn)
hblayout.addWidget(self.messageLabel)

#调用partial函数把信号和slot绑定在一起
#如下方法在PyQt版本号4.3之前是无法使用的
#绑定函数在connect()调用时创建,但是在connect()调用完成后
#绑定函数不在范围内,然后被释放。
#从PyQt4.3(包括4.3)之后,当它们被用作如下代码所示的连接时,
#通过functools.partial()创建的绑定被特别对待。
#这意味着被连接的函数将不会被垃圾回收机制回收,所以下面所示的连接代码能正常使用。

self.connect(oneBtn, SIGNAL("clicked()"),partial(self.anyButton, "One"))
self.connect(twoBtn, SIGNAL("clicked()"),partial(self.anyButton, "Two"))
self.connect(threeBtn, SIGNAL("clicked()"),partial(self.anyButton, "Three"))
self.connect(fourBtn, SIGNAL("clicked()"),partial(self.anyButton, "Four"))
self.connect(fiveBtn, SIGNAL("clicked()"),partial(self.anyButton, "Five"))

self.setLayout(hblayout)

#创建点击信号发射时的响应函数
def anyButton(self,buttonName):
self.messageLabel.setText("You click button '%s'" %buttonName)



if __name__=="__main__":
app=QApplication(sys.argv)
form=Form()
form.show()
app.exec_()


对于PyQt4.0,4.1,4.2实例源码如下:

#coding=utf8
'''
把一个button的clicked()信号连接到一个响应信号的方法可能是最常见的连接场景。
但是如果大多数处理是相同的,只需要一些参数化即可确定哪个特定按钮被按下。
在这样的情况下,通常的做法是把没法button连接相同的slot。
这里有两种实现方法:
1》使用partial(局部)函数来包装一个带有参数的插槽(slot),这样当调用插槽(slot)时,它将对按钮进行参数化。
2》通过PyQt告诉我们那个按钮调用slot(插槽)
这两种方法,在该实例中都有演示。
'''
import sys
'''
如果python的版本小于2.5,这时可以使用functools.partial()函数或着
用户自己创建的函数partial()函数;
否则,从functools模块中导入partial.
通过partial()把一个slot和一个button名绑定在一起。
'''
if sys.version_info[:2]<(2,5):
def partial(func,arg):
def callme():
return func(arg)
return callme
else:
from functools import partial

from PyQt4.QtCore import *
from PyQt4.QtGui import *


class Form(QDialog):
def __init__(self,parent=None):
super(Form,self).__init__(parent)
#创建一个水平布局容器
#用来容纳button和label
hblayout=QHBoxLayout()
oneBtn=QPushButton("One")
twoBtn=QPushButton("Two")
threeBtn=QPushButton("Three")
fourBtn=QPushButton("Four")
fiveBtn=QPushButton("Five")
self.messageLabel=QLabel("No button is clicked")

hblayout.addWidget(oneBtn)
hblayout.addWidget(twoBtn)
hblayout.addWidget(threeBtn)
hblayout.addWidget(fourBtn)
hblayout.addWidget(fiveBtn)
hblayout.addWidget(self.messageLabel)

#调用partial函数把信号和slot绑定在一起

#对于PyQt4.0,4.1,4.2,任然能使用partial():
#首先,需要创建一个绑定的引用(只有在connect()被调用时使用该引用)
#其次,把该应用作为Form实例的一个属性,确保在form存在时,
#绑定函数没有超出使用范围,是的绑定函数任然可以使用。
#所以连接函数调用可以像下面这么使用
'''
self.oneBtnClic= partial(self.anyButton, "Two")
self.connect(oneBtn, SIGNAL("clicked()"),self.oneBtnClic)
self.twoBtnClic= partial(self.anyButton, "Two")
self.connect(twoBtn, SIGNAL("clicked()"),self.twoBtnClic)
self.threeBtnClic= partial(self.anyButton, "Three")
self.connect(threeBtn, SIGNAL("clicked()"),self.threeBtnClic)
self.fourBtnClic= partial(self.anyButton, "Four")
self.connect(fourBtn, SIGNAL("clicked()"),self.fourBtnClic)
self.fiveBtnClic= partial(self.anyButton, "Five")
self.connect(fiveBtn, SIGNAL("clicked()"),self.fiveBtnClic)
'''
self.setLayout(hblayout)

#创建点击信号发射时的响应函数
def anyButton(self,buttonName):
self.messageLabel.setText("You click button '%s'" %buttonName)



if __name__=="__main__":
app=QApplication(sys.argv)
form=Form()
form.show()
app.exec_()




运行结果截图:

PyQt4调用partial函数绑定多个信号到相同slot源码实例_参数化

PyQt4调用partial函数绑定多个信号到相同slot源码实例_PyQt4多个信号连接相同slot_02

PyQt4调用partial函数绑定多个信号到相同slot源码实例_PyQt4多个信号连接相同slot_03

PyQt4调用partial函数绑定多个信号到相同slot源码实例_插槽_04

PyQt4调用partial函数绑定多个信号到相同slot源码实例_插槽_05

PyQt4调用partial函数绑定多个信号到相同slot源码实例_PyQt4通过partial绑定信号与s_06


上一篇:PyQt4对话框(dialog类型介绍)
下一篇:没有了
网友评论