【Qt】QDialog之屏蔽Esc键【转】
来源:互联网 发布:java方法声明无效 编辑:程序博客网 时间:2024/06/05 03:44
简述
Qt中Esc键会在一些控件中默认的进行一些事件的触发,比如:QDialog,按下Esc键窗口消失。大多数情况下,我们不需要这么做,那么就需要对默认事件进行屏蔽。
- 简述
- 源码分析
- 事件过滤器
- 事件重写
- 重写reject
源码分析
通过查看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();}
关于事件过滤器和事件重写其实是属于一种情况,都是基于事件判断和过滤的,而事件过滤器相对来说更易用、扩展性更好,不需要针对每个控件都去重写对应的事件。
更多参考:
- Qt之密码框不可选中、复制、粘贴、无右键菜单等
原文作者:一去丶二三里作者博客:去作者博客空间
0 0
- 【Qt】QDialog之屏蔽Esc键【转】
- QDialog之屏蔽Esc键
- QDialog之屏蔽Esc键
- qt 屏蔽ESC
- Qt之Esc键
- 屏蔽键盘esc键
- QT 之QDialog
- 屏蔽Enter或是Esc键
- javascript中屏蔽esc键
- 屏蔽 回车和ESC键
- javascript中屏蔽esc键
- QT学习笔记之Qdialog
- Qt之QWidget/QDialog/QMainWindow
- qt的Esc键
- 屏蔽ENTER键、ESC键的使用
- 屏蔽Enter键和Esc键
- 屏蔽ENTER键、ESC键的使用
- 屏蔽基于对话框程序ESC键
- 【Qt】Qt国际化(系统文本-QMessageBox按钮、QLineEdit右键菜单等)【转】
- 【Qt】Qt之密码框不可选中、复制、粘贴、无右键菜单等【转】
- 【Qt】Qt之重启应用程序【转】
- 沿海信标台站rbn-dgps的文献综述
- 【Qt】Qt之Tab键切换焦点顺序【转】
- 【Qt】QDialog之屏蔽Esc键【转】
- 【Qt】Qt之自定义搜索框【转】
- http协议
- 【Qt】Qt之设置QWidget背景色【转】
- 【Sql Server】使用触发器把一个表中满足条件的数据部分字段插入到另一个表中
- 电力行业安全建设方案
- Android开发需求功能一览表
- 【Qt】Qt之启动外部程序【转】
- 【Qt】QSettings介绍【转】