QDialog 之屏蔽 Esc 键

2024-05-27 19:48
文章标签 qdialog 屏蔽 esc

本文主要是介绍QDialog 之屏蔽 Esc 键,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者: 一去、二三里
个人微信号: iwaleon
微信公众号: 高效程序员

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_MACif(e->modifiers() == Qt::ControlModifier && e->key() == Qt::Key_Period) {reject();} else
#endifif (!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();
}

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

更多参考:

  • Qt之密码框不可选中、复制、粘贴、无右键菜单等

这篇关于QDialog 之屏蔽 Esc 键的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1008424

相关文章

Linux中如何屏蔽信号

本篇文章主要学习Linux的信号处理机制,着重学习屏蔽信号部分。屏蔽信号处理的两种方式类似于信号的捕获,一种方式是直接对其设置,另一种方式是先获得描述符的掩码,然后对其设置操作。 本文主要参考自《嵌入式linux系统使用开发》,作者何永琪,Thanks. 在linux系统中,如何处理某个进程发送的一个特定信号呢?一般来说有三种方式: 1) 忽略信号 2) 屏蔽信号 3) 为该信号添

CF #283 (Div. 2) A.(屏蔽数组元素)

题目链接:http://codeforces.com/contest/496/problem/A 解题思路: n不是很大,所以暴力。每次屏蔽掉a[ i ]中的一个元素,注意头和尾不能屏蔽。屏蔽后当i == j 时做特殊处理,即cnt = a[ i+ 1 ] - a[ i - 1 ]。最后更新最小值即可。 完整代码: #include <functional>#includ

关于QWidget和QDialog窗体居中的问题

最近开发中,遇到了窗体不能居中的问题,看了网上的很多文章,窗口居中,无非都是move至窗口的中心目标; 有两种方式, 一种在构造函数中直接计算中心坐标; 另一种是在窗口show后再move至相应坐标。但是自己在构造函数中添加了对应的句子以后,窗体不在窗口的(0,0)点显示,反而在右下角显示,自己很是郁闷。网上的两种方法,基本操作如下: 方法一:在窗口(QWidget类及派生类)的构造函数中

Scrapy ——如何防止被ban 屏蔽 之策略大集合(六)

话说在尝试设置download_delay小于1,并且无任何其他防止被ban的策略之后,我终于成功的被ban了。   关于scrapy的使用可参见之前文章:   http://blog.csdn.net/u012150179/article/details/34913315 http://blog.csdn.net/u012150179/article/details/34486677

ffmpeg h264解码, 屏蔽因为网络丢包等各种原因导致的花屏帧

ffmpeg h264解码, 屏蔽因为网络丢包等各种原因导致的花屏帧  ---->看来问题只能这样解决了,现在还要多测测,防止产生新的问题。目前来看,对现有代码没有影响,花屏的帧直接屏蔽掉了。 思路: 问了下机顶盒方面h264解码的,他们用的是硬件解码,他们做到不花屏的方法就是简单的设置了一个硬件解码提供的接口:设置了错误处理模式。 我想这个错误处理模式肯定对那些错误的帧直接屏

使用本地window远程桌面链接到阿里云ESC服务器

参考这篇博文,非常完整,找了很久   点击打开链接    https://yq.aliyun.com/articles/43232

Qt 5 error: C1083: 无法打开包括文件: “Qdialog”: No such file or directory

Qt5的GUI模块变动了,所有的QWidget都被剥离出来,单独成为qtwidgets模块 所以pro里QT+=里要有个qtwidgets 然后清理项目 在构建菜单下重新执行qmake 构建 执行

freeswitch借助fail2ban屏蔽骚扰注册

fail2ban屏蔽fs中的骚扰注册 背景Fail2Ban安装配置 背景 在阿里云上部了一套fs满足公网业务需要。布置好后打开fs_cli看了一眼,全是来自公网的骚扰注册,足见公网环境的风险(不过aws似乎情况稍好)。 Fail2Ban 使用Fail2Ban来防御注册骚扰的主要原因是,Fail2Ban已经和freeswitch有了很好的集成。Fail2Ban的工作原

PX4中ESC的驱动框架

Cdev继承的是Device,然后I2C又是继承的CDev,然后ESC又是继承的I2C,Device---->cdev---->I2C---->ESC。 在ESC的init函数里面:首先会调用I2C的init函数。然后配置RST管脚,然后配置电调的I2C地址,包括两个方面,一个是设置飞控程序里面的总线地址,另一个是motor端的I2C地址。 在I2C的init函数里面:_dev----px4_i

ESC_UP的框架

Frame of Esc_up.cpp 首先是在nuttshell中给esc_up_main传入参数,如果传入的参数是'start update',那么会新建一个ESC_UP类,然后初始化这个类,在init函数里面首先配置管脚并且复位所有的电调,然后在init函数里面还有一个start函数,在这个start函数里面就是创建了一个task_main的任务, 在task_main里面主要是有一个sw