本文共 2159 字,大约阅读时间需要 7 分钟。
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: { QListlist = findChildren (); for (int i=0; i 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); }}
m_bClosed为关闭的条件,为true时,窗口才会关闭。
void Dialog::reject(){ if (m_bClosed) QDialog::reject();}
关于事件过滤器和事件重写其实是属于一种情况,都是基于事件判断和过滤的,而事件过滤器相对来说更易用、扩展性更好,不需要针对每个控件都去重写对应的事件。
更多参考:
转载地址:http://wezxx.baihongyu.com/