简述

Qt中Esc键会在一些控件中默认的进行一些事件的触发,比如:QDialog,按下Esc键窗口消失。大多数情况下,我们不需要这么做,那么就需要对默认事件进行屏蔽。

  • 简述
  • 源码分析
  • 事件过滤器
  • 事件重写
  • 重写reject

源码分析

通过查看QDialog的源码,我们很容易会发现keyPressEvent事件中,当按下Esc键时,会默认执行reject()。

void QDialog::keyPressEvent(QKeyEvent *e)
{//   Calls reject() if Escape is pressed. Simulates a button//   click for the default button if Enter is pressed. Move focus//   for the arrow keys. Ignore the rest.
#ifdef Q_OS_MACif(e->modifiers() == Qt::ControlModifier && e->key() == Qt::Key_Period) {reject();} else
#endifif (!e->modifiers() || (e->modifiers() & Qt::KeypadModifier && e->key() == Qt::Key_Enter)) {switch (e->key()) {case Qt::Key_Enter:case Qt::Key_Return: {QList<QPushButton*> list = findChildren<QPushButton*>();for (int i=0; i<list.size(); ++i) {QPushButton *pb = list.at(i);if (pb->isDefault() && pb->isVisible()) {if (pb->isEnabled())pb->click();return;}}}break;case Qt::Key_Escape:reject();break;default:e->ignore();return;}} else {e->ignore();}
}

Ok,我们如果想改变Esc键的默认动作,则可以通过两种途径:

  1. 重写Esc键对应的事件

  2. 重写reject()

事件过滤器

对QDialog使用事件过滤器,过滤Esc键。

installEventFilter(new EventFilter(this));

bool EventFilter::eventFilter(QObject *obj, QEvent *event)
{QDialog *pDialog = qobject_cast<QDialog *>(obj);if (pDialog != NULL){switch (event->type()){case QEvent::KeyPress:{QKeyEvent *pKeyEvent = static_cast<QKeyEvent*>(event);if (pKeyEvent->key() == Qt::Key_Escape){return true;}}}}return QObject::eventFilter(obj, event);
}

事件重写

重写QDialog的键盘事件keyPressEvent。

void Dialog::keyPressEvent(QKeyEvent *event)
{switch (event->key()){case Qt::Key_Escape:break;default:QDialog::keyPressEvent(event);}
}

重写reject

m_bClosed为关闭的条件,为true时,窗口才会关闭。

void Dialog::reject()
{if (m_bClosed)QDialog::reject();
}

关于事件过滤器和事件重写其实是属于一种情况,都是基于事件判断和过滤的,而事件过滤器相对来说更易用、扩展性更好,不需要针对每个控件都去重写对应的事件。

更多参考:

  • Qt之密码框不可选中、复制、粘贴、无右键菜单等

转载于:https://www.cnblogs.com/itrena/p/5938402.html

QDialog之屏蔽Esc键相关推荐

  1. esc键 qt 退出菜单_【Qt】QDialog之屏蔽Esc键【转】

    简述 Qt中Esc键会在一些控件中默认的进行一些事件的触发,比如:QDialog,按下Esc键窗口消失.大多数情况下,我们不需要这么做,那么就需要对默认事件进行屏蔽. 源码分析 通过查看QDialog ...

  2. MFC 屏蔽ESC键和ENTER键关闭对话框的方法

    重载PreTranslateMessage()函数,在这个函数里捕捉ESC键和ENTER键按下时的消息,然后什么都不做,或是添加代码完成自己想要实现的功能. 1. 完全屏蔽ESC退出键与ENTER回车 ...

  3. 对话框屏蔽Esc键的方法

    默认的,MFC里面当对话框弹出后,按"Esc"键对话框会退出.但有时候想屏蔽这个功能,思路就是屏蔽WM_KEYDOWN消息中的VK_ESCAPE 先添加PreTranslateMe ...

  4. 屏蔽ENTER键、ESC键的使用

    一.添加函数,屏蔽ENTER键和ESC键的使用: BOOL CBingLi::PreTranslateMessage(MSG* pMsg) {    // TODO: Add your special ...

  5. 屏蔽Enter键和ESC键的方法

    屏蔽Enter键和ESC键的方法 一.  Enter键的处理 [方法一]: 当用户按下 回车 键时,Windows发送一个特殊的WM_GETDEFID消息来获得缺省的命令ID,Windows再将它作为 ...

  6. Windows XP系统中如何屏蔽 Ctrl+Alt+Del、Alt+Tab以及Ctrl+Esc键序列

    Windows XP系统中如何屏蔽 Ctrl+Alt+Del.Alt+Tab以及Ctrl+Esc键序列 编译/northtibet 关键字:Ctrl+Alt+Del,Alt+Tab,Ctrl+Esc, ...

  7. 转:Windows XP系统中如何屏蔽 Ctrl+Alt+Del、Alt+Tab以及Ctrl+Esc键序列

    此处下载源代码:(http://download.csdn.net/source/2091219) 对于用过Windows的人,几乎没有人不知道Ctrl+Alt+Del组合键,尤其是在使用经常死机的W ...

  8. MFC EDIT控件 接收“回车”与“ESC”键 退出问题!

    在做MFC程序开发过程中,经常会出现DEIT控制按下了ENTER或者ESC键后,程序就会立刻退出(这是MFCR )实现的一种机制,但往往并不是我们想要的),今天教大家两种方法解决.         一 ...

  9. MFC 中 如何屏蔽Esc和Ente

    MFC 中]如何屏蔽Esc和Enter    一般来说,对于一个默认情况下的对话框程序,用户在运行的时候,如果不小心按下了 Enter或是Esc键,程序就会立刻退出.因为:当用户按下Enter时, W ...

  10. esc键 qt 退出菜单_qt之esc键

    Esc键对大家来说实在熟悉不过的了,在Qt中Esc键也会默认的进行一些事件的触发,今天对Esc键测试了一下,突然发现不像我想象的那样,在QDialog中按下Esc键会默认调用reject()方法而不是 ...

最新文章

  1. 英特尔专家告诉你 信息时代如何掌控数据安全(附视频PPT)
  2. oauth2 增加token 返回参数_一张图搞定OAuth2.0
  3. fiddler无法获取Android端https请求解决办法
  4. wxWidgets:wxSizeEvent类用法
  5. 一位女博士五年的艰难毕业历程
  6. NSIS UI 美化类插件分享
  7. php下xmlwriter,PHP实现基于XMLWriter操作xml的方法
  8. SparkStreaming DStream入门及其算子应用
  9. ecmall挂件开发实例二(转)
  10. 苦橙花---不喧哗,自有声
  11. jupyter notebook如何导入excel数据
  12. java三维动画_基于Java3D的交互式三维动画的研究
  13. python做人脸识别速度_Python人脸识别速度慢
  14. Spring简述以及AOP、IOC
  15. PAT 甲级1116 1117 1118 1119 解题报告
  16. 22岁90后白羊座罗生和勒索病毒的背后故事
  17. java8 Stream的基本操作
  18. TestNG入门教程-2-写第一个基于TestNG的用例
  19. 大数据开发---数据仓库技术
  20. 基于遥感卫星影像水体提取方法综述

热门文章

  1. python合并表格用什么库_python合并多个excel表格数据库-python实现excel合并
  2. 刚体与碰撞体及其移动碰撞问题
  3. redission分布式锁测试代码
  4. 三进制计算机_要做一个编程界优秀的攀登者,首先要认真计算机中的0和1
  5. [渝粤教育] 浙江大学 物理光学实验及仿真 参考 资料
  6. 【渝粤教育】电大中专电商运营实操 (12)作业 题库
  7. pku3277 City Horizon.(离散化+二分查找)
  8. http://visualgo.net/ 数据结构可视化。。。。
  9. 【ZOJ 4070】Function and Function
  10. MVC个层次之间的联系