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

来源:互联网 发布:windows高级编程 编辑:程序博客网 时间:2024/06/05 02:10

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 callmeelse:    from functools import partialfrom 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 callmeelse:    from functools import partialfrom 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_()


运行结果截图:







0 0
原创粉丝点击