QDialog之屏蔽Esc键(简单深刻,要么重写keyPressEvent然后break忽略此事件,要么重写eventFilter然后return,都是为了忽略此事件)

摘要:
源代码分析事件筛选器事件重写重写拒绝源代码分析通过查看QDialog的源代码,我们可以很容易地发现,在keyPressEvent事件中,当按下Esc键时,默认情况下将执行拒绝()。e-˃modifiers()||){switch{caseQt::Key_Enter:caseQt::Key_Return:{QList<QPushButton*>list=findChildren<QPushButton*>();for{QPushButton*pb=list.at;if{ifpb-˃click();Return;}}}}break;caseQt::Key_Escape:reject();打破默认值:e-˃ignore();return;}}否则{e-˃ignore();}}好的,如果我们想更改Esc键的默认操作,我们可以通过两种方式来执行:重写与Esc键对应的事件,重写reject()事件筛选器,使用QDialog上的事件筛选器,并过滤Esckey=NULL){switch{caseQEvent::KeyPress:{QKeyEvent*pKeyEvent=static_cast<QKeyEvent*>;if{returntrue;}}}returnQObject::eventFilter;}该事件重写QDialog的键盘事件键PressEvent。voidDialog::keyPressEvent{switch{caseQt::Key_Escape:break;默认值:QDialog::keyPressEvent;}}重写拒绝_ BClosed是关闭条件。如果为真,窗口将关闭。
简述

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

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

http://blog.csdn.net/liang19890820/article/details/50357323

免责声明:文章转载自《QDialog之屏蔽Esc键(简单深刻,要么重写keyPressEvent然后break忽略此事件,要么重写eventFilter然后return,都是为了忽略此事件)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇5G网络(接入网+承载网+核心网)C# 解析带多个命名空间的xml文件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Python——pyHook监听鼠标键盘事件

pyHook包为Windows中的全局鼠标和键盘事件提供回调。底层C库报告的信息包括事件的时间,事件发生的窗口名称,事件的值,任何键盘修饰符等。而正常工作需要pythoncom等操作系统的API的支持。 先链上一篇《pyHook和pythoncom的安装》。 然后开始讲pyHook的使用。 关于pyHook的使用,网上现存的大多教程如下: import p...

浏览器的统一指针事件:Pointer Event

 在早期的浏览器,输入的事件其实相对单纯,只有考虑到鼠标和键盘两种;而当时的鼠标事件,其实就是 click、mousedown、mouseup 等等的事件。但是当手机、平板开始流行时候,再移动装置上的主要操作界面,已经从鼠标变成是触控了~ 由于触控和鼠标的操作逻辑,算是有根本上的差异的,再加上大部分的装置又支持多点触控,所以虽然浏览器大多会把触控的事件对应...

领域驱动设计概念(Domain-driven Design), Flower(响应式微服务框架)

DDD 领域驱动设计优势 领域专家和开发人员共同工作,这样软件可以准确表达业务规则,就像是领域专家开发出来的一样 帮助业务人员自我提高 知识集中,确保软件知识并不只是掌握在少数人手中 领域专家、开发者和软件间不需要“翻译”,彼此使用通用语言交流 设计就是代码,代码就是设计 DDD同时提供战略设计和战术设计。战略设计帮助理解必要的投入、团队人员构成;战术设...

embOS实时操作系统 任务通讯

1. 轮询全局变量 2. 使用事件驱动 A. 信号量 (1) 二进制信号量(resource/binary semaphore)< 互斥锁 Mutex( Mutual exclusion ) > 信号量只有二进制的0或1 OS_Use() Claims a resource and blocks it for other tasks OS_Un...

Opencv处理鼠标事件-OpenCV步步精深

在图片上双击过的位置绘制一个 圆圈 鼠标事件就是和鼠标有关的,比如左键按下,左键松开,右键按下,右键松开,双击右键等等。 我们可以通过鼠标事件获得与鼠标对应的图片上的坐标。我们通过以下函数来调用查看所有鼠标事件。 events=[i for i in dir(cv2) if 'EVENT'in i] print events 所有的鼠标事件 我们...

Web Worker javascript多线程编程(一)

什么是Web Worker? web worker 是运行在后台的 JavaScript,不占用浏览器自身线程,独立于其他脚本,可以提高应用的总体性能,并且提升用户体验。 一般来说Javascript和UI页面会共用一个线程,在HTML页面中执行js脚本时,页面的状态是不可响应的,直到脚本已完成。而这段代码可以交给Web Worker在后台运行,那么页面在...