QDialog之屏蔽Esc键
屏蔽 ESC
2023-09-14 08:56:50 时间
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键的默认动作,则可以通过两种途径:
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); }
关于事件过滤器和事件重写其实是属于一种情况,都是基于事件判断和过滤的,而事件过滤器相对来说更易用、扩展性更好,不需要针对每个控件都去重写对应的事件。
更多参考:
Win键+R键快捷命令汇总 对Windows操作比较熟的人都知道,Win键 + R键可以快速唤起Run窗口,输入命令就可以方便快捷地打开很多打开应用,可以使用到很多系统自带的工具,其中程序员用到的最多的肯定就是cmd了,可以打开DOS窗口。
屏蔽Windows98/2000/XP任务栏、win键、Ctrl+Esc、Alt+Tab等 关于这方面的文章挺多,对任务栏、win键、Ctrl+Esc、Alt+Tab的屏蔽,一般方法较为简单,最多用底层键盘钩子+DLL就能完美解决