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

#第一种,自定义控件,使用重新实现特定事件处理器,派生一个组件,重新实现它的事件处理,主要使用mousePressEvent、mouseReleaseEvent以及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()函数。

# -*- coding: utf-8 -*-

# python:2.x

__author__ = 'Administrator'

"""

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

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

class MyBuuton(QPushButton):

def __init__(self,parnet=None):

super(MyBuuton,self).__init__(parnet)

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=e#(需要写成这样)

#而不是写成event=类名(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:#屏蔽MouseButtonRelease和MouseMove事件

return True

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

#不要写成QPushButton.event(e),会报错

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

app =QApplication(sys.argv)

x = MyBuuton()

x.setWindowTitle(u'处理器')

x.resize(400,200)

x.show()

app.exec_()

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

如图:

_______________________________________________________________________________________________________

Qt事件处理03

# -*- coding: utf-8 -*-

# python:2.x

__author__ = 'Administrator'

#Qt处理事件的第三种方式:"在QObject中注册事件过滤器",如果对象使用installEventFilter()函数注册了事件过滤器,目标对象中的所有事件将首先发给这个监视对象的eventFilter()函数

from PyQt4.QtGui import  *

from PyQt4.Qt import *

from PyQt4.QtCore import *

import sys

class MyBuuton(QPushButton):

def __init__(self,parnet=None):

super(MyBuuton,self).__init__(parnet)

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=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:#屏蔽MouseButtonRelease和MouseMove事件

return True

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

class MyBuuton1(QMainWindow):

def __init__(self,parnet=None):

super(MyBuuton1,self).__init__(parnet)

self.button=MyBuuton()

self.setCentralWidget(self.button)

self.button.installEventFilter(self)#安装过滤器

def eventFilter(self, obj,e):

if obj==self.button:

if e.type()==QEvent.MouseButtonRelease or e.type()==QEvent.MouseMove:#屏蔽MouseButtonRelease和MouseMove事件

return True

else:

return False

return QMainWindow.eventFilter(self,obj,e)#将事件交给上层对话框

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

app =QApplication(sys.argv)

x = MyBuuton1()

x.setWindowTitle(u'处理器')

x.resize(400,200)

x.show()

app.exec_()

#运行程序,可以发现button的文本不管是点击、释放还是拖动鼠标,都只显示鼠标按下的文本,因为我们已经为button注册了事件过滤器,在监视对象MainWindow中,事件处理函数eventFilter()函数屏蔽了button的MouseButtonRelease和MouseMove事件。所以目标对象button的MouseButtonRelease和MouseMove事件得不到响应。

#故事件是先经过监视对象的eventFilter()函数,然后在响应目标对象button的所有事件,程序运行界面如图:

__________________________________________________________________________________________________________

Qt事件处理04

pyQt事件处理的更多相关文章

  1. Python+Qt学习随笔:PyQt中常用的事件处理函数

    在PyQt图形界面中,我们经常要捕获特定事件如鼠标按键按下.鼠标按下等事件以执行特定操作,可以通过重写组件对象的相关事件处理函数来实现相关处理,具体特定事件常用的包括如下: keyPressEvent ...

  2. Python+Qt学习随笔:PyQt图形界面应用的事件处理流程

    图形界面的事件处理是界面操作的核心,经过编写测试程序验证,基本确认PyQt图形界面应用程序的事件处理流程如下: 1.操作系统或其他应用发送消息给应用主程序: 2.应用主程序调用notify将消息队列中 ...

  3. 第一个PyQt程序

    这个程序虽然小,具备pyqt程序的皱型,可以作为一个模板使用了 #!/usr/bin/python3 # -*- coding: utf-8 -*- import sys from PyQt5.QtW ...

  4. pyqt中使用matplotlib绘制动态曲线

    一.项目背景: 看了matplotlib for python developers这本书,基本掌握了在pyqt中显示曲线的做法,于是自己写一个. 二.需求描述: 1)X轴显示时间点,显示长度为1分钟 ...

  5. pyqt显示指定范围的数字

    # -*- coding: cp936 -*- # -*- coding: cp936 -*- import sys from PyQt4 import QtCore, QtGui   #导入模块 a ...

  6. pyqt中使用matplotlib绘制动态曲线 – pythonic

    一.项目背景: 看了matplotlib for python developers这本书,基本掌握了在pyqt中显示曲线的做法,于是自己写一个. 二.需求描述: 1)X轴显示时间点,显示长度为1分钟 ...

  7. PyQt4 的事件与信号 -- 重写事件处理方法

    # PyQt中的事件处理主要依赖重写事件处理函数来实现 import sys from PyQt4 import QtCore, QtGui class MainWindow(QtGui.QWidge ...

  8. 关于eric4和pyqt的入门学习(转)

    在Eric4下用PyQt4编写Python的图形界面程序 转载请注明作者RunningOn 本文是PyQt4的入门教程.网上能搜到其它教程,但我觉得讲得不是很清楚,希望这篇文章对入门者更加有帮助. 先 ...

  9. 从Qt到PyQt

    Hello World PyQt与Qt具有极其相似的类族和API,而且不再使用qmake系统和Q_OBJECT宏使得PyQt在没有编译链接时频繁的错误而且代码更加友好. from PyQt4 impo ...

随机推荐

  1. python linecache标准库基础学习

    #python标准库基础之:linecacge:高效读取文本文件#说明与作用"""可以从文件或者导入python模块获取文件,维护一个结果缓存,从而可以更高效地从相同文件 ...

  2. Hibernate试题解析

    1.在Hibernate中,以下关于主键生成器说法错误的是(AC). A.increment可以用于类型为long.short或byte的主键(byte类型不可以) B.identity用于如SQL ...

  3. java 版本SQLHelper

    package com.jack.SQLHelper; import java.sql.*;import java.util.logging.*;import javax.swing.table.*; ...

  4. Sqlserver统计语句

    --查看被缓存的查询计划 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED st.text AS [SQL] , cp.cacheobjtype , c ...

  5. 《第一行代码》学习笔记5-活动Activity(3)

    1.Menu:让菜单得到展示的同时,不占用任何屏幕的空间. public boolean onCreateOptionsMenu(Menu menu){ getMenuInflater().infla ...

  6. Windows命令行(DOS命令)教程–2 (转载) http://arch.pconline.com.cn//pcedu/rookie/basic/10111/15325_1.html

    二.符号约定 为了便于说明格式,这里我们使用了一些符号约定,它们是通用的: C: 盘符 Path 路径 Filename 文件名 .ext 扩展名 Filespec 文件标识符 [ ] 方括号中的项目 ...

  7. VC++ try catch (转)

    VC++ try catch (转)   以前都是用try{} catch(-){}来捕获C++中一些意想不到的异常, 今天看了Winhack的帖子才知道,这种方法在VC中其实是靠不住的.例如下面的代 ...

  8. Maven基础教程

    更多内容请参考官方文档:http://maven.apache.org/guides/index.html 官方文档很详细,基本上可以查找到一切相关的内容. 另外,快速入门可参考视频:孔浩的maven ...

  9. 转载:CPU的位数和操作系统的位数

    1. 32位系统最大只能使用3.5G的内存,而64位系统最大能够使用128G内存. 2. 32位CPU只能安装和使用32位.16位的系统和软件,无法使用64位系统及软件. 3. 64位可以安装64位系 ...

  10. 简单的thinkPHP3.2运行实例。

    在上一篇的环境基础下. 我们用zendstudio12.5版本编写我们的代码.具体的下载方式在这里就不多做注明了.自己百度就可以搞定. 首先我们用zendstudio12.5 导入我们从网上随处都可以 ...