一直对Event Filter似懂非懂, 通过看C++ GUI Programming with Qt4, Second Edition, 争取搞明白. 顺便自己把英文翻译成中文, 算是自己做的笔记了.Installing Event FiltersQT事件模块一个真正强大的特性是可以设置一个QObject的实例去监测另外一个QObject实例的事件,在被监测的实例see之前.假设我们有一个CustomerInfoDialog这样的widget, 它由几个QLineEdit组成.我们想用Spacer键来转变focus到下一个QLineEdit.这个非标准的行为可能对一个内部的程序很合适, 需要培训它的用户来使用它. 一个直接的方法是子类QLineEdit,然后重新实现keyPressEvent()来调用focusNextChild(), 像这样:[c-sharp] view plaincopyvoid MyLineEdit::keyPressEvent(QKeyEvent *event)
{  if (event->key() == Qt::Key_Space)   {  focusNextChild();  }  else  {  QLineEdit::keyPressEvent(event);  }
}  这个方法有一个主要的弊端: 如果我们在这个form中用到几个不同类型的widget(比如QComboBox和QSpinBox), 我们必须也子类化它们来表现出相同的行为. 一个更好的方案是让CustomerInfoDialog来监控它的子widget的按键事件,在监测的代码里执行需要的行为. 这可以用event Filter来达到. 设置一个event filter有两个步骤:1. 在目标对象上调用installEventFilter(),将监测对象注册到目标对象上.
2. 在监测对象的eventFilter()方法里处理目标对象的事件.在ctor里注册监测对象是一个好地方:[c-sharp] view plaincopy
CustomerInfoDialog::CustomerInfoDialog(QWidget *parent) :QDialog(parent)  {  ...  firstNameEdit->installEventFilter(this);  lastNameEdit->installEventFilter(this);  cityEdit->installEventFilter(this);  phoneNumberEdit->installEventFilter(this);  }  一旦event Filter注册了, 发送到firstNameEdit, lastNameEdit, cityEdit和phoneNumberEdit的事件在被发送到原来的目的地之前, 会先发到CustomerInfoDialog的eventFilter()函数.这是接收这些事件的eventFilter()函数:[c-sharp] view plaincopy
bool CustomerInfoDialog::eventFilter(QObject *target, QEvent *event)  {  if (target == firstnameEdit || target == lastNameEdit  || target == cityEdit || target == phoneNumberEdit)  {  if(event->type() == QEvent::KeyPress)  {  QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);  if (keyEvent->key() == Qt::Key_Space)  {  focusNextChild();  return true;  }  }  }  return QDialog::eventFilter(target, event);  }  首先,我们检查是否目标widget是一个QLineEdit. 如果是个key Press事件, 把它转换为QKeyEvent, 并检查哪个键值被按下.如果是space, 我们调用focusNextChild()把focus传到focus链上的下一个widget上, 返回true告诉Qt我们已经处理了这个事件. 如果我们返回false, Qt会发送这个event到它原来的目的地,导致一个假的空格被插入到QLineEdit.如果目标widget不是QLineEdit, 或者这个event不是一个space按键, 我们把控制权传回到基类的eventFilter去. 目标wdiget可以是基类-QDialog正在监测的某个widget.Qt提供了5个级别来处理和过滤事件.1. 我们可以重新实现特定的event handler.重新实现像mousePressEvent(), keyPressEvent()和paintEvent()这样的event Handler是目前处理event最普通的方式.2. 我们可以重新实现QObject::event().通过重新实现event(),我们可以在事件到达特定的event handler之前对它们作出处理. 这个方法主要是用来覆写Tab键的缺省实现. 也可以用来处理不同发生的事件类型,对它们,就没有特定的event handler. 当重新实现event()的时候,我们必须调用基类的event()来处理我们不显式处理的情况.3. 我们可以安装一个event filter到一个单独的QObject.一旦一个对象用installEventFilter注册了, 发到目标对象的所有事件都会先发到监测对象的eventFilter(). 如果同一object安装了多个event filter, filter会依次被激活, 从最近安装的回到第一个.4. 我们可以在QApplication对象上安装event filter.一旦一个event filter被注册到qApp(唯一的QApplication对象), 程序里发到每个对象的每个事件在发到其他event filter之前,都要首先发到eventFilter(). 这个方法对debugging非常有用. 也可以用来处理发到disable的widget上的事件, QApplication通常会丢弃它们.5. 我们可以子类QApplication并重新实现notify().Qt调用QApplication::notify()来发出事件. 在任何event filter得到之前, 重新实现这个函数是得到所有事件的唯一方法. event filter通常更有用, 因为可以有任意数目且同时存在的event filter, 但是只有一个notify()函数.许多事件类型,包括鼠标和按键事件, 可以被传播. 如果一个事件没有在传到目标对象的过程中被处理,或者被目标对象本身处理, 整个事件处理过程会重复, 不过, 这次, 目标对象的parent作为新的目标对象. 从parent到parent,这样继续下去,知道事件被处理了,或者到达了顶层的对象在现在的即时聊天程序中,一般都设置有快捷键来实现一些常用的功能,类似QQ可以用CTRL+Enter来实现信息的发送。在QT4中,所有的事件都继承与QEvent这个类,以下是用QEvent来实现快捷键的功能。首先所有QT类的基类QObject有一个成员函数installEventFilter,这个函数是用来将一个事件处理器和该QObject绑定起来,所以就有了我下面的想法。首先在chat类定义一个eventFilter,该函数是一个虚函数,可以由子类进行更改。所以声明eventFilter如下:virtual bool eventFilter(QObject *obj, QEvent *e);看了下QT文档对于这个函数的声明的解释,大概意思就是如果你要过滤某个事件就返回false,如果要使用某个事件就返回true。我想在这个函数中加入对Enter键和Ctrl+Enter组合键的判断,具体查看QKeyEvent类的文档QKeyEvent类中有函数key和modifier,key函数返回的是发生时间的按键值,modifier返回的而是修饰键,QT所支持的修饰键如下:Constant                              Value                                             DescriptionQt::NoModifier                   0x00000000                                   No modifier key is pressed.Qt::ShiftModifier                   0x02000000                                  A Shift key on the keyboard is pressed.Qt::ControlModifier              0x04000000                                  A Ctrl key on the keyboard is pressed.Qt::AltModifier                   0x08000000                                  An Alt key on the keyboard is pressed.Qt::MetaModifier              0x10000000                                 A Meta key on the keyboard is pressed.Qt::KeypadModifier               0x20000000                                 A keypad button is pressed.Qt::GroupSwitchModifier       0x40000000                                 X11 only. A Mode_switch key on the keyboard is pressed.所以可以重写eventFilter函数来实现快捷键的功能,可以根据QKeyEvent的key和modifire来分别是Enter还是Ctrl+enter被按下。重写eventFilter的函数如下:[c-sharp] view plaincopy
bool Window::eventFilter(QObject *obj, QEvent *e)  {  Q_ASSERT(obj == ui.inputMsgEdit);  if (e->type() == QEvent::KeyPress)  {  QKeyEvent *event = static_cast<QKeyEvent*>(e);  if (event->key() == Qt::Key_Return && (event->modifiers() & Qt::ControlModifier))  {  sendMessage();  return true;  }  }  return false;  }  然后把这个过滤器用installEventFilter函数安装在聊天窗口的输入框上(QTextEdit),这样就实现快捷键的功能了。三键组合Shift + Ctrl + A的实现只要在窗体中相应keyPressEvent事件函数即可。[c-sharp] view plaincopy
void Window::keyPressEvent(QKeyEvent *e)  {  if (e->modifiers() == (Qt::ShiftModifier | Qt::ControlModifier) && e->key() == Qt::Key_A)  {  //pressed  }  }  键盘按住Ctrl键 + 鼠标左键的实现在窗体中相应mousePressEvent事件函数在其中检测Ctrl键是否按住即可。[c-sharp] view plaincopy
void Window::mousePressEvent(QMouseEvent *e)  {  // 获取鼠标在点击窗体上的坐标  QPoint pos = e->pos();  if (e->button() == LeftButton)  {  if ( QApplication::keyboardModifiers () == Qt::ControlModifier)  {  //pressed  }  }  }  

qt Event Filter 控制Ctrl Shift Alt键相关推荐

  1. idea格式化代码快捷键 快捷键: Ctrl+Shift+Alt+L

    idea格式化代码快捷键 快捷键: Ctrl+Shift+Alt+L idea快捷键链接 https://www.jetbrains.com/help/idea/using-code-editor.h ...

  2. ps ctrl+shift+alt+t 重复自由变换

    ctrl+t 变形的用法 按shift等比例缩放 按alt+shift以中心点为中心等比例缩放 按alt自由缩放 按ctrl自由扭曲 按ctrl+alt对角点变换 按ctrl+shift水平或垂直扭曲 ...

  3. 操作系统笔记:windows 替换ctrl和alt键功能

    文章目录 1. 映射方法 2. 格式解读 3. 映射对照表(部分) 参考 1. 映射方法 保存下面内容到一个.reg结尾的文件中,然后双击导入,重启系统生效. Windows Registry Edi ...

  4. win7ctrl和alt功能互换_win7系统的ctrl和alt键被调换了,怎么调回来?

    错误代码0x80072F8F win7被锁定alt键,WIN7系统ALT键为何没反应 ALT键没反应是怎么回事啊?ALT+TAB切换不了,QQ聊天时ALT+S发送不了内容,+C也关不了聊天窗口!以前可 ...

  5. Windows中更改ctrl与alt键互换位置

    习惯了mac上的alt键的位置,在用Windows键盘的时候,老是把alt当作ctrl快捷键使用,搜了下更改两个键的方法,在此做个记录. 将下列内容复制粘贴到txt中,并重命名为.reg格式文件,然后 ...

  6. 如何识别键盘左右的shift,Ctrl或Alt键

    用API (GetAsyncKeyState)实现,在WIN 2K,XP 下有效: Private Declare Function GetAsyncKeyState Lib "user32 ...

  7. windows 将ctrl和alt键互换

    需求: 博主自己一直是使用的Window系统,由于之前入手了一台MacBook-pro还是不适应地很习惯,所以用通过官方的工具装上了双系统,现在win(command)和alt(option)按键位置 ...

  8. ps ctrl shift alt t不能复制

    需要选中以上图标,再按快捷键

  9. 【已解决】eclipse快捷键ctrl+shift+f键无法格式化代码而且之后输入法总是变繁体字可能与搜狗输入法快捷键设置冲突

    一.点击搜狗输入法,点击更多设置. 二.如图所示点击系统功能快捷键设置 三.把简繁切换取消就可以了.

最新文章

  1. java线程模拟生产者消费者问题
  2. 如何使用RecyclerView构建Horizo​​ntal ListView?
  3. 【深度学习笔记】F1-Score
  4. linux高编线程-------线程的创建,终止
  5. 考研 考研爬虫大数据分析专业热度
  6. QT绘制饼状图,自定义切片。
  7. python2048小游戏程序设计大作业_C语言大作业报告——2048小游戏程序
  8. zoj 3211 - Dream City
  9. facebook开源的prophet时间序列预测工具---识别多种周期性、趋势性(线性,logistic)、节假日效应,以及部分异常值
  10. JAVA中的“抽象接口”
  11. linux-2.6.22.6 内核源代码包的文件目录介绍
  12. 《Java从入门到放弃》框架入门篇:在MyEclipse中配置Mybatis框架
  13. 严格的概念认识——关系、关系模型
  14. 华为手机连电脑当摄像头用_今天才知道,华为手机摄像头还能这样用!还不会用你买什么华为?...
  15. 来自不同行业领域的50多个对象检测数据集
  16. tableau中的聚合和总计
  17. 天猫店铺半自动商品详情数据
  18. vue中已声明XX,但从未读取其值 解决方法
  19. 电信感知测试软件,智能算法在电信业务用户体验感知分析中的应用
  20. 【备战蓝桥】JavaB组算法小讲解——GCD和LCM

热门文章

  1. Flash、RAM、ROM的区别
  2. rtl8723du在am335x linux-4.19.94上的移植
  3. DJ12-2 8086 系列指令系统(第一节课)
  4. 语音信号处理 c语言,语音信号处理(毕业设计论文).doc
  5. 《数据库应用系统实践》------ 酒店客房管理系统
  6. ssm+Vue计算机毕业设计学生在线请假管理系统(程序+LW文档)
  7. 数据分片排序oracle,基于ORACLE数据库的海量数据脱敏方法与流程
  8. 【DBN分类】基于matlab深度置信网络DBN变压器故障诊断【含Matlab源码 2284期】
  9. 华为云hica学习笔记
  10. 世界各国人口相关指标(总人口、城镇/乡村人口及增长率、城镇化率、人口密度、男性/女性人口及增长率)1960-2021