博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
QDialog之屏蔽Esc键
阅读量:5945 次
发布时间:2019-06-19

本文共 2159 字,大约阅读时间需要 7 分钟。

简述

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

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

更多参考:

转载地址:http://wezxx.baihongyu.com/

你可能感兴趣的文章
Linux Namespace系列(09):利用Namespace创建一个简单可用的容器
查看>>
oracle中create table with as和insert into with as语句
查看>>
kafka连接异常
查看>>
11g废弃的Hint - BYPASS_UJVC
查看>>
为什么工业控制系统需要安全防护?
查看>>
Mongodb部署记录[3]-主从搭建
查看>>
hive sql操作
查看>>
tomcat 深度优化
查看>>
127 - "Accordian" Patience
查看>>
阿里云CentOS7安装Oracle11GR2
查看>>
nginc+memcache
查看>>
php正则匹配utf-8编码的中文汉字
查看>>
MemCache在Windows环境下的搭建及启动
查看>>
linux下crontab实现定时服务详解
查看>>
Numpy中的random模块中的seed方法的作用
查看>>
用java数组模拟登录和注册功能
查看>>
javaScript实现归并排序
查看>>
关于jsb中js与c++的相互调用
查看>>
UVA 122 Trees on the level 二叉树 广搜
查看>>
POJ-2251 Dungeon Master
查看>>