QDialog之屏蔽Esc键
屏蔽 ESC
2023-09-11 14:19:16 时间
通过查看QDialog的源码,我们很容易会发现keyPressEvent事件中,当按下Esc键时,会默认执行reject()
QKeyEvent *pKeyEvent = static_cast QKeyEvent* (event); if (pKeyEvent- key() == Qt::Key_Escape) return true; return QObject::eventFilter(obj, event); }
Win键+R键快捷命令汇总 对Windows操作比较熟的人都知道,Win键 + R键可以快速唤起Run窗口,输入命令就可以方便快捷地打开很多打开应用,可以使用到很多系统自带的工具,其中程序员用到的最多的肯定就是cmd了,可以打开DOS窗口。
屏蔽Windows98/2000/XP任务栏、win键、Ctrl+Esc、Alt+Tab等 关于这方面的文章挺多,对任务栏、win键、Ctrl+Esc、Alt+Tab的屏蔽,一般方法较为简单,最多用底层键盘钩子+DLL就能完美解决
Qt中Esc键会在一些控件中默认的进行一些事件的触发,比如:QDialog,按下Esc键窗口消失。大多数情况下,我们不需要这么做,那么就需要对默认事件进行屏蔽。
通过查看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_MAC if(e- modifiers() == Qt::ControlModifier e- key() == Qt::Key_Period) { reject(); } else #endif if (!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键的默认动作,则可以通过两种途径:
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); }
关于事件过滤器和事件重写其实是属于一种情况,都是基于事件判断和过滤的,而事件过滤器相对来说更易用、扩展性更好,不需要针对每个控件都去重写对应的事件。
更多参考:
Win键+R键快捷命令汇总 对Windows操作比较熟的人都知道,Win键 + R键可以快速唤起Run窗口,输入命令就可以方便快捷地打开很多打开应用,可以使用到很多系统自带的工具,其中程序员用到的最多的肯定就是cmd了,可以打开DOS窗口。
屏蔽Windows98/2000/XP任务栏、win键、Ctrl+Esc、Alt+Tab等 关于这方面的文章挺多,对任务栏、win键、Ctrl+Esc、Alt+Tab的屏蔽,一般方法较为简单,最多用底层键盘钩子+DLL就能完美解决
相关文章
- winform文本框不能粘贴、复制和屏蔽右键
- 【C#】对异步请求处理程序IHttpAsyncHandler的理解和分享一个易用性封装 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法 【手记】手机网页弹出层后屏蔽底层的滑动响应 【手记】ASP.NET提示“未能创建类型”处理 【Web】一个非常简单的移动web消息框 【手记】解决EXCEL跑SQL遇“查询无法运行或数据库表无法打开...”
- 屏蔽百度地图热点弹窗,弹出景点信息
- 屏蔽网站右键菜单和选择和复制等功能 一行代码搞定
- 如何在Ubuntu中屏蔽一个网站
- ThinkPHP3.2.3 的异常和错误屏蔽处理
- SemrushBot robot是什么蜘蛛?怎么屏蔽垃圾蜘蛛爬虫,屏蔽ip段?
- 屏蔽宽带运营商的弹窗广告
- js屏蔽键盘按键
- MikroTik路由器屏蔽外网访问Web配置界面
- 三星在谷歌商店上线广告屏蔽App 爆红后被下架
- CAD教程:正版CAD中屏蔽框开/关命令的使用技巧
- 如何让你的服务屏蔽Shodan扫描