Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1523889
  • 博文数量: 164
  • 博客积分: 2993
  • 博客等级: 少校
  • 技术积分: 1718
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-24 11:42
文章分类

全部博文(164)

文章存档

2014年(1)

2013年(36)

2012年(90)

2011年(37)

分类: Python/Ruby

2011-08-29 09:43:13

事件和信号在应用程序中是非常重要的,在PyQt4中,与wxpython有许多不同,下面一起看看。

一,Events

事件是任何GUI程序中最重要的部分。事件由用户或者系统生成,当我们调用应用程序的exec_()方法时,应用程序进入了它的循环,主循环获取事件并将它们送给特定的对象处理。PyQt引入了一种独一无二的信号和插槽来处理事件。

二,信号与插槽(signal and slots)

当用户点击按钮,拖动滑块等操作时会产生信号,同时环境也可以产生信号,比如时钟的信号。插槽是一种针对信号进行处理的方法。Python中的插槽可以是任何的python可调用部分。

# !/usr/bin/python

import sys

from PyQt4 import QtGui, QtCore

class SigSlot(QtGui.QWidget):

    def __init__(self, parent=None):

        QtGui.QWidget.__init__(self, parent)

        self.setWindowTitle('signal & slot')

        lcd = QtGui.QLCDNumber(self)

        slider = QtGui.QSlider(QtCore.Qt.Horizontal, self)

        vbox = QtGui.QVBoxLayout()

        vbox.addWidget(lcd)

        vbox.addWidget(slider)

        self.setLayout(vbox)

        self.connect(slider, QtCore.SIGNAL('valueChanged(int)'), lcd, QtCore.SLOT('display(int)'))

        self.resize(250, 150)

app = QtGui.QApplication(sys.argv)

qd = SigSlot()

qd.show()

sys.exit(app.exec_())

上面我们定义了一个LCD number和一个slider,通过拖拽slider来改变LCD的数值。

self.connect(slider, QtCore.SIGNAL('valueChanged(int)'), lcd, QtCore.SLOT('display(int)'))

这一句就是将valueChanged()信号与lcd数字的display()插槽相关联。连接方法有四个参数,sender是发送信号的对象,signal是它产生的信号,receiver是信号接收的对象,最后slot是相应信号的方法。

三,事件处理重载

PyQt中的事件处理主要是通过对事件处理者的重载来进行的。看下面一个例子:

# !/usr/bin/python

import sys

from PyQt4 import QtGui, QtCore

class Escape(QtGui.QWidget):

    def __init__(self, parent=None):

        QtGui.QWidget.__init__(self, parent)

        self.setWindowTitle('escape')

        self.resize(250, 150)

        self.connect(self, QtCore.SIGNAL('closeEmitApp()'), QtCore.SLOT('close()'))

    def keyPressEvent(self, event):

        if event.key() ==QtCore.Qt.Key_Escape:

            self.close()

app = QtGui.QApplication(sys.argv)

qb = Escape()

qb.show()

sys.exit(app.exec_())

重载了KeyPressEvent()的方法,按下ESC键,程序关闭。

四,发送信号

通过QtCore.Qobject创建对象可以发送信号。如果我们点击按钮,就会产生一个clicked()的信号,看例子:

# !/usr/bin/python

import sys

from PyQt4 import QtGui, QtCore

class Escape(QtGui.QWidget):

    def __init__(self, parent=None):

        QtGui.QWidget.__init__(self, parent)

        self.setWindowTitle('escape')

        self.resize(250, 150)

        self.connect(self, QtCore.SIGNAL('closeEmitApp()'), QtCore.SLOT('close()'))

    def keyPressEvent(self, event):

        self.emit(QtCore.SIGNAL(‘closeEmitApp()’))

app = QtGui.QApplication(sys.argv)

qb = Escape()

qb.show()

sys.exit(app.exec_())

创建了一个叫closeEmitApp()的新信号。这个信号是在鼠标按下时产生的。

通过emit()来产生一个信号。

然后将我们手工产生的closeEmitApp()信号与close()插槽连接。

阅读(2247) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~