简述

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键的默认动作,则可以通过两种途径:

  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();
}

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

更多参考:

最新文章

  1. LeetCode刷题系列
  2. Java暗箱操作之自动装箱与拆箱
  3. JS 跳转页面 在新的选项卡打开
  4. ubuntu 搭建PPTP VPN服务器
  5. 设计模式--外观(Facade)模式
  6. CRM plugin 激活 停用 事件
  7. 根据CreateDirectory递归创建多级目录
  8. Ubuntu常见问题
  9. css3中的圆角属性
  10. RedHat下MySQL 5.6 安装、维护
  11. jchat:linux聊天程序2:MySQL
  12. Git在下搭建下环境的工具
  13. 用EditPlus编辑器配置C#开发环境
  14. 实现基于lnmp的电子商务网站
  15. Selenium自动化测试脚本中三种等待时间简介
  16. FZU 2234
  17. JVM 工作原理和流程
  18. 【算法】LeetCode算法题-Valid Parentheses
  19. listView item分割线不显示
  20. array_rand

热门文章

  1. 禁止触屏滑动touchmove方法介绍
  2. Web流程
  3. CSS Hack大全-可区分出IE6-IE10、FireFox、Chrome、Opera
  4. HDOJ 2069 Coin Change(母函数)
  5. BZOJ2961: 共点圆
  6. 压测2.0:云压测 + APM = 端到端压测解决方案
  7. 程序员必须知道的git托管平台
  8. OleDbType.Decimal在插入DB2后会默认赋值0.00,改为OleDbType.Double则正常
  9. CF 197 DIV2 Xenia and Bit Operations 线段树
  10. 关于linux下rar文件的解压缩操作