【问题标题】:Receive Escape-Event in QLineEdit?在 QLineEdit 中接收 Escape-Event?
【发布时间】:2015-01-28 10:08:38
【问题描述】:

这是一个初学者的问题,但我没有找到解决方案。

我正在使用一个自己的对象,它继承自 QLineEdit 并接收数字作为输入(现在可以顺利运行)。

现在我想在用户按下 Escape 按钮时接收一个事件。 textChanged()-事件不会发生这种情况。根据文档,没有特殊的逃生事件。那么这还能怎么做呢?

谢谢!

【问题讨论】:

  • 每个QWidgetQLineEdit 是一个)都有一个名为keyPressEvent 的方法。在您自己的子类中,您可以重载它并检查 event->key() 是否是 Escape 键。但是之后不要忘记调用基类keyPressEvent

标签: c++ qt qt5 key-events


【解决方案1】:

我遇到了同样的问题。我通过在我的QMainWindow 中实现keyPressEvent 来解决它。

void MainWindow::keyPressEvent(QKeyEvent *e)
{
    if (e->key() == Qt::Key_Escape) {
        QLineEdit *focus = qobject_cast<QLineEdit *>(focusWidget());
        if (lineEditKeyEventSet.contains(focus)) {
            focus->clear();
        }
    }
}

并设置QSet&lt;QLineEdit *&gt; lineEditKeyEventSet 以包含需要此行为的QLineEdits。

void MainWindow::setupLineEditKeyEventList()
{
    lineEditKeyEventSet.insert(ui->lineEdit_1);
    lineEditKeyEventSet.insert(ui->lineEdit_2);
    lineEditKeyEventSet.insert(ui->lineEdit_3);
}

【讨论】:

    【解决方案2】:

    你可以实现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);
    

    【讨论】:

    • 不起作用。我在这两个功能上都收到了事件,但在按下 Esc 键时没有。我的班级不直接从 QLineEdit 继承,是否有可能其他人吃掉这个事件?如果是,如何抑制 keyPressEvent()/eventFilter() 的功能?
    • Nejat:我发现 Escape 事件被发送到 LineEdits 父窗口,而不是行编辑字段本身...是否也可以将其转发到 LineEdit 对象?
    • 那你为什么不处理那个窗口中按下 Escape 的事件呢?
    • Nejat: 然后用这个事件做什么 - 将它发送给所有子小部件,因为其中一个需要它?我无法想象没有办法在子小部件中获取 Esc ......
    • 如果您需要在行编辑中处理它,您可以在窗口中捕获它时将事件发布到子小部件。您可以发布按键事件,例如:stackoverflow.com/questions/24322602/qt-sending-keypressevent/…
    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 2021-09-30
    • 2021-09-11
    • 2018-07-28
    相关资源
    最近更新 更多