PyQt4编程之自定义插槽

首先声明,这是学习了别人的文章后写的,原网址点击打开链接

简单地说,就是把上一篇中的

self.connect(exit,QtCore.SIGNAL('triggered()'),QtCore.SLOT('close()'))

改写成

exit.triggered.connect(self.close)

其中exit.triggered是一个signal信号,这里self.close就是槽函数了。

我们先详细讲一下信号和槽之间的关系吧。

信号与槽能让任意的QT对象之间进行通信,信号可以被发射出去,槽可以接受信号。每个QT对象都包含预定的信号和槽。

信号与槽连接常用connect函数,connect(Object1,SIGNAL(signal),Object2,SLOT(slot))

我们来看一下connect函数的三个原型吧

connect(QObject, QT_SIGNAL, QObject, QT_SLOT_QT_SIGNAL, Qt.ConnectionType = Qt.AutoConnection) -> object
connect(QObject, QT_SIGNAL, Callable[..., None], Qt.ConnectionType = Qt.AutoConnection) -> object
connect(self, QObject, QT_SIGNAL, QT_SLOT_QT_SIGNAL, Qt.ConnectionType = Qt.AutoConnection) -> object
可以看出来没有改过的语句明显调用的是第二个原型,
我们也可以把它写成第一种和第三种形式,分别为
QtGui.QMainWindow.connect(exit,QtCore.SIGNAL('triggered()'),self,QtCore.SLOT('close()'))
QtGui.QMainWindow.connect(self,exit,QtCore.SIGNAL('triggered()'),QtCore.SLOT('close()'))

上文说的两个对象,就体现在connect函数中的Object1和Object2,signal是Object1对象的信号,注意要用SIGNAL宏包起来。当一个特定事件发生的时候(如点击按钮)或者Object1调用emit函数的时候,signal信号被发射。slot(槽)就是一个可以被调用处理特定信号的函数(或方法),是普通的对象成员函数。
它们存在一些特点:
1.一个信号可以与另一个信号相连
2.表示一个信号可以与多个槽相连
3.表示同一个槽可以响应多个信号
以上特点可以看出信号和槽是宽松地联系在一起的:一个发射信号的对象不用知道也不用注意哪个槽或哪些槽要接收这个信号。对象只负责发送信号,它不知道也不需要知道另一端是谁在接收这个信号。同样的,一个槽也不知道是否有任何信号与自己相连接。
一个简单实例:点击close按钮关闭应用程序 
这里写图片描述
 
 
import sys
from PyQt4 import QtGui, QtCore



class Example(QtGui.QWidget):


    def __init__(self):
        QtGui.QWidget.__init__(self)


        button = QtGui.QPushButton('close', self)
        button.move(100, 60)
        self.connect(button, QtCore.SIGNAL('clicked()'), self, QtCore.SLOT('close()'))


        self.setWindowTitle('Signal & slot')
        self.resize(250, 150)


app = QtGui.QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec_())



我们现在接着来看看自定义插槽。之前讲到exit.triggered是一个signal信号,这里self.close就是槽函数

给出一个例子,点击’change color’按钮,让背景颜色改变吧!
这里写图片描述

import sys
from PyQt4 import QtGui, QtCore



class Example(QtGui.QWidget):
    def change(self):
        print 'You pressed the butthon'
        palette = QtGui.QPalette(self) #create a object of class QPalette,  default
        palette.setColor(self.backgroundRole(), QtGui.QColor(192,253,123)) #给调色板设置背景颜色
        self.setPalette(palette) #把调色板的属性给self(即QWidget对象)


    def __init__(self):
        QtGui.QWidget.__init__(self)


        button = QtGui.QPushButton('change color', self)
        button.move(100, 60)


        self.setWindowTitle('Signal & slot')
        self.resize(250, 150)


        button.clicked.connect(self.change) #自定义的change函数



app = QtGui.QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec_())


详细讲解一下change函数部分吧,

同样地,可以猜测出来palette是QPalette的一个对象,而且是调用的缺省的构造函数。

这里调用的setColor函数原型是setColor(self, QPalette.ColorRole, QColor),(应该是),这一句话就是给调色板添上颜色的。

backgroundRole函数原型是backgroundRole(self) ,返回值类型是 QPalette.ColorRole

setPalette函数的原型是:def setPalette(self, QPalette),可以猜测出来是利用调色板给self设置背景颜色的。
各自函数属于的类是显而易见的,所以上面分析过程中我就没有说了。

change函数也可以这样写。
def change(self):
        print 'You pressed the butthon' palette = QtGui.QPalette(QtGui.QColor(0,0,0)) #这里调用的是带参数的构造函数。
 self.setPalette(palette)



以上部分内容转自http://blog.csdn.net/u011943221/article/details/47007315

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值