QDialog之屏蔽Esc键
简述
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键的默认动作,则可以通过两种途径:
重写Esc键对应的事件
重写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键相关推荐
- esc键 qt 退出菜单_【Qt】QDialog之屏蔽Esc键【转】
简述 Qt中Esc键会在一些控件中默认的进行一些事件的触发,比如:QDialog,按下Esc键窗口消失.大多数情况下,我们不需要这么做,那么就需要对默认事件进行屏蔽. 源码分析 通过查看QDialog ...
- MFC 屏蔽ESC键和ENTER键关闭对话框的方法
重载PreTranslateMessage()函数,在这个函数里捕捉ESC键和ENTER键按下时的消息,然后什么都不做,或是添加代码完成自己想要实现的功能. 1. 完全屏蔽ESC退出键与ENTER回车 ...
- 对话框屏蔽Esc键的方法
默认的,MFC里面当对话框弹出后,按"Esc"键对话框会退出.但有时候想屏蔽这个功能,思路就是屏蔽WM_KEYDOWN消息中的VK_ESCAPE 先添加PreTranslateMe ...
- 屏蔽ENTER键、ESC键的使用
一.添加函数,屏蔽ENTER键和ESC键的使用: BOOL CBingLi::PreTranslateMessage(MSG* pMsg) { // TODO: Add your special ...
- 屏蔽Enter键和ESC键的方法
屏蔽Enter键和ESC键的方法 一. Enter键的处理 [方法一]: 当用户按下 回车 键时,Windows发送一个特殊的WM_GETDEFID消息来获得缺省的命令ID,Windows再将它作为 ...
- 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, ...
- 转:Windows XP系统中如何屏蔽 Ctrl+Alt+Del、Alt+Tab以及Ctrl+Esc键序列
此处下载源代码:(http://download.csdn.net/source/2091219) 对于用过Windows的人,几乎没有人不知道Ctrl+Alt+Del组合键,尤其是在使用经常死机的W ...
- MFC EDIT控件 接收“回车”与“ESC”键 退出问题!
在做MFC程序开发过程中,经常会出现DEIT控制按下了ENTER或者ESC键后,程序就会立刻退出(这是MFCR )实现的一种机制,但往往并不是我们想要的),今天教大家两种方法解决. 一 ...
- MFC 中 如何屏蔽Esc和Ente
MFC 中]如何屏蔽Esc和Enter 一般来说,对于一个默认情况下的对话框程序,用户在运行的时候,如果不小心按下了 Enter或是Esc键,程序就会立刻退出.因为:当用户按下Enter时, W ...
- esc键 qt 退出菜单_qt之esc键
Esc键对大家来说实在熟悉不过的了,在Qt中Esc键也会默认的进行一些事件的触发,今天对Esc键测试了一下,突然发现不像我想象的那样,在QDialog中按下Esc键会默认调用reject()方法而不是 ...
最新文章
- 英特尔专家告诉你 信息时代如何掌控数据安全(附视频PPT)
- oauth2 增加token 返回参数_一张图搞定OAuth2.0
- fiddler无法获取Android端https请求解决办法
- wxWidgets:wxSizeEvent类用法
- 一位女博士五年的艰难毕业历程
- NSIS UI 美化类插件分享
- php下xmlwriter,PHP实现基于XMLWriter操作xml的方法
- SparkStreaming DStream入门及其算子应用
- ecmall挂件开发实例二(转)
- 苦橙花---不喧哗,自有声
- jupyter notebook如何导入excel数据
- java三维动画_基于Java3D的交互式三维动画的研究
- python做人脸识别速度_Python人脸识别速度慢
- Spring简述以及AOP、IOC
- PAT 甲级1116 1117 1118 1119 解题报告
- 22岁90后白羊座罗生和勒索病毒的背后故事
- java8 Stream的基本操作
- TestNG入门教程-2-写第一个基于TestNG的用例
- 大数据开发---数据仓库技术
- 基于遥感卫星影像水体提取方法综述
热门文章
- python合并表格用什么库_python合并多个excel表格数据库-python实现excel合并
- 刚体与碰撞体及其移动碰撞问题
- redission分布式锁测试代码
- 三进制计算机_要做一个编程界优秀的攀登者,首先要认真计算机中的0和1
- [渝粤教育] 浙江大学 物理光学实验及仿真 参考 资料
- 【渝粤教育】电大中专电商运营实操 (12)作业 题库
- pku3277 City Horizon.(离散化+二分查找)
- http://visualgo.net/ 数据结构可视化。。。。
- 【ZOJ 4070】Function and Function
- MVC个层次之间的联系