首页 > 其他分享 >installEventFilter、eventFilter函数理解

installEventFilter、eventFilter函数理解

时间:2024-03-11 15:14:15浏览次数:36  
标签:installEventFilter eventFilter monitoredObj filterObj 对象 函数

installEventFilter函数如下:
void QObject::installEventFilter(QObject *filterObj)
Qt助手的解释如下:

在对象上安装一个事件过滤器filterObj。如下:

monitoredObj->installEventFilter(filterObj);
其中monitoredObj、filterObj都是QObject的子类。上面代码意思是:在monitoredObj对象上安装一个事件过滤器filterObj。

传给monitoredObj的事件先经过filterObj的eventFilter处理后再由monitorObj处理

该函数一般和如下函数配合使用:

[virtual] bool QObject::eventFilter(QObject *watched, QEvent *event)
注意:该函数是虚函数,也就是说派生自QObject的子类可以重写该函数。

 上面monitoredObj对象安装一个filterObj过滤器后,则可以在filterObj对象所在类的eventFilter函数中拦截发送到monitoredObj对象的事件。如下为KeyPressEater类:

class KeyPressEater : public QObject
{
Q_OBJECT
...

protected:
bool eventFilter(QObject *obj, QEvent *event) override;
};

bool KeyPressEater::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
qDebug("Ate key press %d", keyEvent->key());
return true;
} else {
// standard event processing
return QObject::eventFilter(obj, event);
}
}
现在我们在按钮或QListView两个窗体部件上安装过滤器,如下:

KeyPressEater *keyPressEater = new KeyPressEater(this);
QPushButton *pushButton = new QPushButton(this);
QListView *listView = new QListView(this);

pushButton->installEventFilter(keyPressEater);
listView->installEventFilter(keyPressEater);
此时如果在按钮或QListView获取到键盘焦点时按下Esc键,按键事件被 KeyPressEater类的eventFilter函数拦截,从而弹出:

Ate key press 1048576

其中1048576为Esc键的虚拟键码。Qt的QShortcut类就是采取这种技术实现的。

注意:

  • 事件过滤器对象filterObj能阻止(拦截)或放行发向对象monitoredObj的事件。
  • 事件过滤器对象filterObj通过其类的eventFilter函数来接收事件。
  • 如果过滤器对象filterObj所在类的eventFilter函数返回true,则该事件被拦截,也就是原本发向monitoredObj对象的事件不再发向monitoredObj对象;如果过滤器对象filterObj所在类的eventFilter函数返回false,则不拦截该事件,事件依然发向monitoredObj对象。
  • 如果同一个对象上安装多个过滤器,则最后一个过滤器首先被激活调用。
  • 如果在eventFilter函数中删除了接收事件的对象,请确保eventFilter函数返回true,否则Qt将会发送事件到删除的接收对象上,这将导致程序崩溃。
  • monitoredObj对象和filterObj对象必须位于同一个线程中。如果filterObj对象在不同的线程,调用installEventFilter函数则Qt什么都不会做。
  • 如果调用installEventFilter函数后,monitoredObj对象和filterObj对象被移到不同的线程中去了,则eventFilter函数不会被调用,直到monitoredObj对象和filterObj对象回到同一线程时才会被调用。
  • 过滤器对象filterObj所在类的eventFilter函数的第一个参数是被拦截对象monitoredObj,即installEventFilter函数的调用者。以上面的 KeyPressEater例子来说, KeyPressEater类的eventFilter函数的第一个参数是pushButton或listView

原文链接:https://blog.csdn.net/danshiming/article/details/122792144

标签:installEventFilter,eventFilter,monitoredObj,filterObj,对象,函数
From: https://www.cnblogs.com/keleman/p/18066114

相关文章

  • 给python入门者的帮助,关于函数和装饰器的理解。
    有时候学习不能过于较真,至少在合适的时机之前,还是闷头吞知识,等吃饱了,就有精力(足够的能量储备,足够的经验)来理解更深的理解,但是很多时候,包括我自己,都喜欢在吃饱之前就研究自己在吃什么,为什么这个东西能吃这种问题。最近发现几年前写的一篇关于python函数return的一些理解,又被查......
  • C语言基础-3、函数的参数和变量
    一、函数原型1、函数先后关系ex1:#include<stdio.h>//像这样把Max()函数写在上面,是因为:C的编译器自上而下顺序分析你的代码intMax(inta,intb){ intret; if(a>=b){ ret=a; } else { ret=b; } returnret;}intmain(){ intmax; max=Max(1,2);......
  • 函数回调(C++)
    函数回调C++部分​ 从C#逆向理解回去,这玩意应该就是delegate的原型了,只不过C#中将其作为一个单独的变量类型方便做管理,而C++这个老毕登这里则是以指针的形式表现出来。​ 作用在于,你不需要关心函数具体内容是什么,也不需要关心函数到底会处理什么,你只需要直接调用这个定义了的回......
  • wrf-chem-chem-kpp-kpp2.1-..-gen_kpp.c 文件函数顺序错误(kpp2.1版本),错误文件的路径是
    hereisamistakeinofficialfilegen_kpp.c,theirgen_kpp.c'sfunctiondefinitionorderisreserved!Sowhenyoumakethereisareportoferror:implicitfunction:write_list_to_screen,screen_out,check_all官方很多WRF版本的chem下面的/chem/KPP/util/wkc/gen_......
  • C语言基础-2、函数的定义与使用
    一、函数的定义和使用函数是一块代码,接受零个或多个参数,做一件事情,并返回零个或一个值函数定义:voidsum(intbegin,inend)//函数头;void:返回类型;sum:函数名,intbegin:参数表{ .......//函数体}1、调用函数函数名(参数值);ex1:#include<stdio.h>voidcheer(){ pr......
  • cache操作函数 --20240310
    Baremetal不讨论多级cache的情况下,裸驱两种关于dcache的操作:flush_dcache_all();//将cache里面的东西刷入内存invalidate_dcache_all();//将数据缓存中的所有内容无效化(invalidate)。该指令一般用于确保缓存中的数据与主内存中的数据同步flush_dcache_all()函数通常在嵌入......
  • printf函数与缓冲区 --20240310
    在linux下,printf输出到控制台经历了app->libc(stdio.h)->syscall->console驱动 下面是<<linux内核完全注释>>一书中的一段描述:继续看下write函数的实现:以下是write()函数的基本定义:#include<unistd.h>ssize_twrite(intfd,constvoid*buf,size_tcount);//ssize_t......
  • Sqlite3之左子串,右子串,中间串subStr函数(14)
    右子串  subStr('一二三四五',-4)selectsubStr('一二三四五',-4) 左子串  substr('一二三四五',1,3) 中串,比如取出三四  selectsubStr('一二三四五',3,2) ......
  • 第15章_存储过程与函数
    第15章_存储过程与函数讲师:尚硅谷-宋红康(江湖人称:康师傅)官网:http://www.atguigu.comMySQL从5.0版本开始支持存储过程和函数。存储过程和函数能够将复杂的SQL逻辑封装在一起,应用程序无须关注存储过程和函数内部复杂的SQL逻辑,而只需要简单地调用存储过程和函数即可。1.存储过......
  • 通达信买入翻倍, 年年翻倍的一个指标,没未来函数
    {通达信买入翻倍,年年翻倍的一个指标,没未来函数}买入翻倍,让年年翻倍的一个指标,没未来函数VAR1:=REF(CLOSE,1);VAR2:=SMA(MAX(CLOSE-VAR1,0),6,1)/SMA(ABS(CLOSE-VAR1),6,1)*100;VAR3:=SMA(MAX(CLOSE-VAR1,0),12,1)/SMA(ABS(CLOSE-VAR1),12,1)*100;VAR4:=(BARSLAST(VAR......