QDialog之屏蔽Esc键(简单深刻,要么重写keyPressEvent然后break忽略此事件,要么重写eventFilter然后return,都是为了忽略此事件)
2024-09-20 11:25:39
简述
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键的默认动作,则可以通过两种途径:
重写Esc键对应的事件
重写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
最新文章
- .net core 源码解析-mvc route的注册,激活,调用流程(三)
- Linux 使用iftop命令查看服务器流量
- mongodb .net core 调用
- poj3502 恶心题
- iOS - 全屏滑动
- Linux中获取本机网络信息的几个函数及应用
- 在VS2013中查看C/C++预处理后的文件
- log_bin_trust_function_creators变量解释
- php读取xml文件内容,并循环写入mysql数据库
- mysql主从配置(转载)
- UITextFiled,UIButton,UIImageView交互相互之间的事件拦截
- Floating-Info---Android
- Quartz1.8.5例子(七)
- MongoDB命令行操作
- NYOJ 1249 物资调度(DFS+剪枝)
- 使用re开发python计算器
- Spark基本架构
- python基础(数组)
- 编译wxWidgets
- IDEA项目搭建一——使用Maven创建多模块项目
热门文章
- React Native 开发环境安装和配置使用报错: -bash: react-native: command not found
- Android 调整透明度的图片查看器
- 【codeforces 755A】PolandBall and Hypothesis
- Ehcache配置
- Go语言学习(十)bytes包处理字节切片
- [Angular] @ContentChildren and QueryList
- ScrollView嵌套ListView问题
- js取json对象的键和值
- 【序列操作IV】树状数组套线段树/树套树
- Web自动化工具对比