这是一个有点初学者的问题,但我找不到解决方案。
我正在使用一个继承自
QLineEdit
的自己的对象,并接收数字作为输入(现在工作顺利)。
现在我想在用户按下 Escape 按钮时接收一个事件。
textChanged()
事件不会发生这种情况。根据文档,没有特殊的逃逸事件。那么还有什么办法可以做到这一点呢?
谢谢!
您可以实施
keyPressEvent
:
void LineEdit::keyPressEvent(QKeyEvent *event)
{
if (event->key() == Qt::Key_Escape)
{
...
}
QLineEdit::keyPressEvent(event);
}
或实施
eventFilter
:
bool LineEdit::eventFilter(QObject *obj, QEvent * event)
{
if((LineEdit *)obj == this && event->type()==QEvent::KeyPress && ((QKeyEvent*)event)->key() == Qt::Key_Escape )
{
...
}
return false;
}
使用
eventFilter
方法时,在构造函数中安装事件过滤器:
this->installEventFilter(this);
我也遇到了同样的问题。我通过在我的
keyPressEvent
中实现 QMainWindow
来解决这个问题。
void MainWindow::keyPressEvent(QKeyEvent *e)
{
if (e->key() == Qt::Key_Escape) {
QLineEdit *focus = qobject_cast<QLineEdit *>(focusWidget());
if (lineEditKeyEventSet.contains(focus)) {
focus->clear();
}
}
}
并设置
QSet<QLineEdit *> lineEditKeyEventSet
以包含需要此行为的 QLineEdit
。
void MainWindow::setupLineEditKeyEventList()
{
lineEditKeyEventSet.insert(ui->lineEdit_1);
lineEditKeyEventSet.insert(ui->lineEdit_2);
lineEditKeyEventSet.insert(ui->lineEdit_3);
}
您可以使用 Esc 键盘快捷键定义 QAction。
例如,我这样做是为了在更复杂的小部件中自动关闭弹出编辑:
auto edit = new QLineEdit(this);
// ...
auto action = new QAction(edit);
action->setShortcut(Qt::Key_Escape);
edit->addAction(action);
connect (action, &QAction::triggered, [edit](){
edit->hide();
});
(隐藏会使 QLineEdit 失去焦点,因此 editFinished() 信号将被触发)