QDialog之屏蔽Esc键

简介: 简述Qt中Esc键会在一些控件中默认的进行一些事件的触发,比如:QDialog,按下Esc键窗口消失。大多数情况下,我们不需要这么做,那么就需要对默认事件进行屏蔽。简述源码分析事件过滤器事件重写重写reject源码分析通过查看QDialog的源码,我们很容易会发现keyPressEvent事件中,当按下Esc键时,会默认执行reject()

简述

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

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

更多参考:

目录
相关文章
|
开发工具 数据安全/隐私保护 git
Git报错 Incorrect username or password (access token) 的解决方式
Git报错 Incorrect username or password (access token) 的解决方式
4123 0
Git报错 Incorrect username or password (access token) 的解决方式
|
6月前
|
监控 算法 自动驾驶
北斗卫星导航定位从核心框架到定位流程详解(一)
我国北斗系统通过“空间星座+地面控制+用户终端”协同,以伪距测量和空间后方交会为核心,实现从米级到厘米级的高精度定位,广泛应用于导航、测绘、交通等领域。如果您想进一步了解北斗卫星定位技术和案例,欢迎搜索维构lbs智能定位~
|
Shell 网络安全 数据安全/隐私保护
|
运维 Kubernetes 数据可视化
即时通讯开源项目OpenIM配置可视化-etcd配置中心
即时通讯开源项目OpenIM二次开发
1168 6
|
API UED
【Qt 学习笔记】Qt窗口 | 状态栏 | QStatusBar的使用及说明
【Qt 学习笔记】Qt窗口 | 状态栏 | QStatusBar的使用及说明
3048 4
|
图形学
【unity知识点】Unity 协程/携程Coroutine
【unity知识点】Unity 协程/携程Coroutine
1644 0
|
人工智能 开发框架 自然语言处理
ModelScope-Agent,助力每一位开发者搭建AI智能体
ModelScope-Agent,助力每一位开发者搭建AI智能体
2899 0
|
Java
double类型大小比较的方法
double类型大小比较的方法
1071 0
|
移动开发 前端开发 JavaScript
使用JS、CSS、H5实现简单的登录弹窗,可保存用户信息
使用JS、CSS、H5实现简单的登录弹窗,可保存用户信息。
1116 0
使用JS、CSS、H5实现简单的登录弹窗,可保存用户信息
|
JSON 数据库 数据安全/隐私保护
Qt使用MD5加密
Qt中包含了大部分常用的功能,比如json、数据库、网络通信、串口通信以及今天说的这个MD5加密;
699 0