本文主要是介绍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键的默认动作,则可以通过两种途径:
-
重写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之密码框不可选中、复制、粘贴、无右键菜单等
这篇关于QDialog 之屏蔽 Esc 键的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!