简述

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 list = findChildren();

for (int i=0; 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(obj);

if (pDialog != NULL)

{

switch (event->type())

{

case QEvent::KeyPress:

{

QKeyEvent *pKeyEvent = static_cast(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();

}

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

更多参考:

esc键 qt 退出菜单_【Qt】QDialog之屏蔽Esc键【转】相关推荐

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

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

  2. esc键 qt 退出菜单_Qt中Esc键触发事件处理

    有一段时间没有使用Qt开发,最近给公司写的小DEMO中,用到了Qt编写的界面,其中有几处用到Event处理,在编写对Esc键处理的过程中,发现closeEvent无效,最终发现了两种解决办法. 1.重 ...

  3. 苹果home键在哪里设置_苹果最经典圆形home键,国产手机为何没有模仿?原因令人心疼...

    手机市场的鼎盛,除了科研工作者们一步步的专研和创新外,在如此多的手机品牌下,也难免互相借鉴.就像苹果的X系列开始搞起了刘海屏,虽然在才发布的一段时间里没少遭到攻击,但是依旧有其他手机品牌模仿苹果手机的 ...

  4. mysql主键干嘛的_数据库表中的主键有什么作用?

    展开全部 数据库主键 主键:表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行.这样e69da5e6ba9062616964757a686964616f31333365643534的一列或多列 ...

  5. qt 判断ctrl键被按下_马拉松被按下暂停键? 没关系,温州公安线上警马来袭!...

    每年都如期而至的线下警马 因为一场突如其来的疫情 被按下了暂停键 但身体是革命的本钱 作为人民警察 坚持锻炼.保持健康的体魄必不可少 为深入开展全警实战大练兵活动 进一步丰富全市公安民警业余生活 倡导 ...

  6. python输入esc退出循环_使python在按ESC键时立即退出程序

    在正常输入下没有办法做到这一点.raw_input一次读取整行.在 在某些(极少数)情况下,您可以这样做:message = '' while True: ch = sys.stdin.read(1) ...

  7. qt messagebox退出程序_[Qt] Mac平台安装最新版qt的方法(源码编译) - 刘傲天

    安装方式 安装方式有在线(online)和离线(offline)两个选项,因为在线安装可能要连接国外的服务器非常慢,还会经常失败,所以我们选择离线安装(offline). 选择安装方式 打开https ...

  8. qt禁止拖动_[Qt]QMdiArea,无框架窗口的拖动

    0:QMdiArea中添加子窗口后,想固定or调整窗口的大小 需要在addSubWindow()函数调用后返回子窗口的指针,然后再设置子窗口的大小 注意设置imagelabel的大小是没有效果的,im ...

  9. 4键电子手表说明书_迪士尼手表四键说明书

    提起迪士尼大家都会想到其动画电影和游乐园,其实迪士尼还有很多周边物品,比如服装.手表等,最近就有很多小伙伴对迪士尼的手表比较感兴趣,那么你们知道迪士尼手表四键说明书什么内容吗?下面就由小编带领大家了解 ...

最新文章

  1. Dubbo 18 问
  2. 【摄像头】摄像头IRCUT滤光片
  3. 必看干货|成为大数据专业人员必要且重要的7大技能
  4. Containerpilot 配置文件reload
  5. linux 报错 E: 无法定位软件包 python-lzma
  6. 【Paper】Learning to Predict Charges for Criminal Cases with Legal Basis
  7. 使用vue-happy-scroll 自定义滚动条
  8. 气门组的结构组成有哪些_挖机破碎钳子,液压粉碎钳都有哪些结构组成,你知道吗...
  9. 开源视频平台:MediaCore(MediaDrop)
  10. QCC300x hello world
  11. 《统计学习理论的本质》
  12. 下载Latex的IEEE模板
  13. 神经网络与深度学习(六)卷积神经网络(4)ResNet18实现MNIST
  14. 手机RAM、ROM和储存卡的那些事
  15. 读书和不读书的人,最大的区别是什么?--林语堂
  16. 微信小程序毕业设计论文求职招聘|兼职管理系统+后台管理项目源代码
  17. 免费获取慧炬虚拟操作系统(HopedotVOS)激活码
  18. js实现左右无缝轮播图
  19. Direct3D 12 尝鲜: 基本呈现
  20. 医学分子生物学试题答案

热门文章

  1. 解决:更改短信中心号码不能及时更新显示
  2. 从零开始在服务器上搭建QQ机器人——插件(二)
  3. 一个刚入行而又不甘于平庸的程序猿2019个人总结
  4. 哪些东西买了之后,会让人因生活质量和幸福感提升而感觉相见恨晚?
  5. 安检x光机原理计算机实现,安检X光机组成及工作原理(图文)
  6. 牛批,Ceph RBD 备份与恢复完全指南
  7. css3扭蛋机,微信小程序扭蛋抽奖机css3动画实现详解.pdf
  8. c语言双重性,C语言双重循环应用初探
  9. 老年人智能手机APP开发界面设计具体策略
  10. apmserv mysql,APMServ MySQL 1577错误解决方法