问题是事件过滤器不应该安装在确定按钮上。
如果您的 OK 按钮被禁用,那么它将不会收到 enter 事件。无论哪个小部件都有焦点。如果他们不接受 enter 事件,那么QDialog
就会accept()
自行处理。
解决问题的两种方法:
1)仅当启用 OK时,才在新函数中覆盖QDialog::accept()
和调用accept 方法QDialog
accept
void MyDialog::accept() {
if (okEnabled) {
QDialog::accept();
}
}
2)在对话框中不接受回车键的每个小部件上安装一个事件过滤器(行编辑,...)。
事件过滤器是这样的:
class KeyPressEater : public QObject
{
Q_OBJECT
protected:
bool eventFilter(QObject *obj, QEvent *event);
};
bool KeyPressEater::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
bool res = QObject::eventFilter(obj, event);
if (keyEvent->key() == Qt::Key_Return) {
return true; /* Always accept return */
} else {
return res;
}
} else {
// standard event processing
return QObject::eventFilter(obj, event);
}
}
在您的代码中,对于对话框中的每个小部件:
myWidget->installEventFilter(myKeyPressEater);