首页 > 代码库 > pyQt事件处理

pyQt事件处理

Qt事件处理01

Qt处理事件的第二种方式:"重新实现QObject::event()函数",通过重新实现event()函数,可以在事件到达特定的事件处理器之前截获并处理他们。这种方法可以用来覆盖已定义事件的默认处理方式,也可以用来处理Qt中尚未定义特定事件处理器的事件。当重新实现event()函数时,如果不进行事件处理,则需要调用基类的event()函数

Qt是事件驱动的, 程序每个动作都是由某个事件所触发。 Qt事件的类型很多,
我们可以通过查看Qt的 manual中的Event System 和 QEvent 来获得各个事件的详细信息。
事件来源
Spontaneous events(自发事件)
从系统得到的消息,比如鼠标按键,键盘按键等。Qt事件循环的时候读取这些事件,转化为QEvent后依次处理
Posted events
有Qt或应用程序产生,放入消息队列
QCoreApplication::postEvent()
Sent events
由Qt或应用程序产生,不放入队列,直接被派发和处理
QCoreApplication::sendEvent()
比如考虑重绘事件处理函数 paintEvent(),3种事件都能使得该函数被调用:

当窗口被其他窗口覆盖后,再次重新显示时,系统将产生 spontaneous 事件来请求重绘
当我们调用 update() 时,产生的是 Posted 事件
当我们调用 repaint() 时,产生的是 Sent 事件
事件派发事件循环

from PyQt4.QtGui import  *

from PyQt4.Qt import *

from PyQt4.QtCore import *

import sys

#第一种,自定义控件,使用重新实现特定事件处理器,派生一个组件,重新实现它的事件处理,主要使用mousePressEventmouseReleaseEvent以及mouseMoveEvent这三个事件处理

class MyBuuton(QPushButton):

    def __init__(self,parent=None):

        super(MyBuuton,self).__init__(parent)

    def mousePressEvent(self,event):

        self.setText(QString(‘x:%1,y:%2‘).arg(QString.number(event.x())).arg(QString.number(event.y())))

    def mouseReleaseEvent(self, event):

        self.setText(QString(‘x:%1,y:%2‘).arg(QString.number(event.x())).arg(QString.number(event.y())))

    def mouseMoveEvent(self, event):

        self.setText(QString(‘x:%1,y:%2‘).arg(QString.number(event.x())).arg(QString.number(event.y())))

 

QTextCodec.setCodecForTr(QTextCodec.codecForName(‘utf-8‘))

app =QApplication(sys.argv)

x = MyBuuton()

x.setWindowTitle(u‘处理器‘)

x.resize(400,200)

x.show()

app.exec_()

序运行时,Button上的文本随着鼠标在不同的位置点击、释放以及左击拖动鼠标的不同而显示相应的文本

如图:

________________________________________________________________________

Qt事件处理02

Qt处理事件的第二种方式:"重新实现QObject::event()函数",通过重新实现event()函数,可以在事件到达特定的事件处理器之前截获并处理他们。这种方法可以用来覆盖已定义事件的默认处理方式,也可以用来处理Qt中尚未定义特定事件处理器的事件。当重新实现event()函数时,如果不进行事件处理,则需要调用基类的event()函数。

from PyQt4.QtGui import  *

from PyQt4.Qt import *

from PyQt4.QtCore import *

import sys

#第一种,自定义控件,使用重新实现特定事件处理器,派生一个组件,重新实现它的事件处理,主要使用mousePressEventmouseReleaseEvent以及mouseMoveEvent这三个事件处理

class MyBuuton(QPushButton):

    def __init__(self,parent=None):

        super(MyBuuton,self).__init__(parent)

    def mousePressEvent(self,event):

        self.setText(QString(‘x:%1,y:%2‘).arg(QString.number(event.x())).arg(QString.number(event.y())))

    def mouseReleaseEvent(self, event):

        self.setText(QString(‘x:%1,y:%2‘).arg(QString.number(event.x())).arg(QString.number(event.y())))

    def mouseMoveEvent(self, event):

        self.setText(QString(‘x:%1,y:%2‘).arg(QString.number(event.x())).arg(QString.number(event.y())))

    def event(self, e):#看下&&

        if e.type()==QEvent.MouseButtonPress:

 

            event=MyBuuton(e)

            self.setText(QString(‘x:%1,y:%2‘).arg(QString.number(event.x())).arg(QString.number(event.y())))

            return True

        elif e.type()==QEvent.MouseButtonPress or e.type()==QEvent.MouseMove:#屏蔽MouseButtonReleaseMouseMove事件

            return True

        return QPushButton.event(e)#其他事件调用基类的event()函数进行处理

QTextCodec.setCodecForTr(QTextCodec.codecForName(‘utf-8‘))

app =QApplication(sys.argv)

x = MyBuuton()

x.setWindowTitle(u‘处理器‘)

x.resize(400,200)

x.show()

app.exec_()

 

return QPushButton.event(e)#其他事件调用基类的event()函数进行处理
TypeError: QPushButton.event(QEvent): first argument of unbound method must have type ‘QPushButton‘

如果有朋友看到这个博客时,请帮下指点,谢谢