esc键 qt 退出菜单_【Qt】QDialog之屏蔽Esc键【转】
简述
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键【转】相关推荐
- esc键 qt 退出菜单_qt之esc键
Esc键对大家来说实在熟悉不过的了,在Qt中Esc键也会默认的进行一些事件的触发,今天对Esc键测试了一下,突然发现不像我想象的那样,在QDialog中按下Esc键会默认调用reject()方法而不是 ...
- esc键 qt 退出菜单_Qt中Esc键触发事件处理
有一段时间没有使用Qt开发,最近给公司写的小DEMO中,用到了Qt编写的界面,其中有几处用到Event处理,在编写对Esc键处理的过程中,发现closeEvent无效,最终发现了两种解决办法. 1.重 ...
- 苹果home键在哪里设置_苹果最经典圆形home键,国产手机为何没有模仿?原因令人心疼...
手机市场的鼎盛,除了科研工作者们一步步的专研和创新外,在如此多的手机品牌下,也难免互相借鉴.就像苹果的X系列开始搞起了刘海屏,虽然在才发布的一段时间里没少遭到攻击,但是依旧有其他手机品牌模仿苹果手机的 ...
- mysql主键干嘛的_数据库表中的主键有什么作用?
展开全部 数据库主键 主键:表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行.这样e69da5e6ba9062616964757a686964616f31333365643534的一列或多列 ...
- qt 判断ctrl键被按下_马拉松被按下暂停键? 没关系,温州公安线上警马来袭!...
每年都如期而至的线下警马 因为一场突如其来的疫情 被按下了暂停键 但身体是革命的本钱 作为人民警察 坚持锻炼.保持健康的体魄必不可少 为深入开展全警实战大练兵活动 进一步丰富全市公安民警业余生活 倡导 ...
- python输入esc退出循环_使python在按ESC键时立即退出程序
在正常输入下没有办法做到这一点.raw_input一次读取整行.在 在某些(极少数)情况下,您可以这样做:message = '' while True: ch = sys.stdin.read(1) ...
- qt messagebox退出程序_[Qt] Mac平台安装最新版qt的方法(源码编译) - 刘傲天
安装方式 安装方式有在线(online)和离线(offline)两个选项,因为在线安装可能要连接国外的服务器非常慢,还会经常失败,所以我们选择离线安装(offline). 选择安装方式 打开https ...
- qt禁止拖动_[Qt]QMdiArea,无框架窗口的拖动
0:QMdiArea中添加子窗口后,想固定or调整窗口的大小 需要在addSubWindow()函数调用后返回子窗口的指针,然后再设置子窗口的大小 注意设置imagelabel的大小是没有效果的,im ...
- 4键电子手表说明书_迪士尼手表四键说明书
提起迪士尼大家都会想到其动画电影和游乐园,其实迪士尼还有很多周边物品,比如服装.手表等,最近就有很多小伙伴对迪士尼的手表比较感兴趣,那么你们知道迪士尼手表四键说明书什么内容吗?下面就由小编带领大家了解 ...
最新文章
- Dubbo 18 问
- 【摄像头】摄像头IRCUT滤光片
- 必看干货|成为大数据专业人员必要且重要的7大技能
- Containerpilot 配置文件reload
- linux 报错 E: 无法定位软件包 python-lzma
- 【Paper】Learning to Predict Charges for Criminal Cases with Legal Basis
- 使用vue-happy-scroll 自定义滚动条
- 气门组的结构组成有哪些_挖机破碎钳子,液压粉碎钳都有哪些结构组成,你知道吗...
- 开源视频平台:MediaCore(MediaDrop)
- QCC300x hello world
- 《统计学习理论的本质》
- 下载Latex的IEEE模板
- 神经网络与深度学习(六)卷积神经网络(4)ResNet18实现MNIST
- 手机RAM、ROM和储存卡的那些事
- 读书和不读书的人,最大的区别是什么?--林语堂
- 微信小程序毕业设计论文求职招聘|兼职管理系统+后台管理项目源代码
- 免费获取慧炬虚拟操作系统(HopedotVOS)激活码
- js实现左右无缝轮播图
- Direct3D 12 尝鲜: 基本呈现
- 医学分子生物学试题答案
热门文章
- 解决:更改短信中心号码不能及时更新显示
- 从零开始在服务器上搭建QQ机器人——插件(二)
- 一个刚入行而又不甘于平庸的程序猿2019个人总结
- 哪些东西买了之后,会让人因生活质量和幸福感提升而感觉相见恨晚?
- 安检x光机原理计算机实现,安检X光机组成及工作原理(图文)
- 牛批,Ceph RBD 备份与恢复完全指南
- css3扭蛋机,微信小程序扭蛋抽奖机css3动画实现详解.pdf
- c语言双重性,C语言双重循环应用初探
- 老年人智能手机APP开发界面设计具体策略
- apmserv mysql,APMServ MySQL 1577错误解决方法