zl程序教程

您现在的位置是:首页 >  其它

当前栏目

QDialog之屏蔽Esc键

屏蔽 ESC
2023-09-11 14:19:16 时间
通过查看QDialog的源码,我们很容易会发现keyPressEvent事件中,当按下Esc键时,会默认执行reject()

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就能完美解决