Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否在QLineEdit中接收转义事件?_C++_Qt_Qt5_Key Events - Fatal编程技术网

C++ 是否在QLineEdit中接收转义事件?

C++ 是否在QLineEdit中接收转义事件?,c++,qt,qt5,key-events,C++,Qt,Qt5,Key Events,这是一个初学者的问题,但我没有找到解决办法 我正在使用一个自己的对象,它继承自QLineEdit,并将数字作为输入(现在可以顺利工作) 现在我想在用户按下退出按钮时接收一个事件。这不会发生在textChanged()-事件中。根据文件,没有特殊的逃逸事件。那么,还有什么其他办法可以做到这一点呢 谢谢 您可以执行按键事件: void LineEdit::keyPressEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Esca

这是一个初学者的问题,但我没有找到解决办法

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

现在我想在用户按下退出按钮时接收一个事件。这不会发生在
textChanged()
-事件中。根据文件,没有特殊的逃逸事件。那么,还有什么其他办法可以做到这一点呢


谢谢

您可以执行
按键事件

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);

我也有同样的问题。我通过在我的
qmain窗口中实现
keyPressEvent
来解决这个问题

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

每个
QWidget
(并且
QLineEdit
是一个)都有一个名为的方法。在您自己的子类中,您可以重载它并检查
event->key()
是否是转义键。但是不要忘记在之后调用基类
keyPressEvent
。不起作用。我在两个功能中都会得到事件,但在按下Esc键时不会得到。我的类不是直接从QLineEdit继承的,是否有可能其他人吃了这个事件?如果是,如何抑制keyPressEvent()/eventFilter()的功能?Nejat:我发现转义事件被发送到LineEdits父窗口,不是到行编辑字段本身…是否也可以将其转发到行编辑对象?那么为什么不在该窗口中处理按Escape键的事件?Nejat:然后对该事件执行什么操作-将其发送到所有子窗口小部件,因为其中一个需要它?我无法想象,没有办法在子小部件中获得Esc…如果您需要在“行编辑”中处理它,您可以在窗口中捕获它时将事件发布到子小部件。您可以发布按键事件,如:
void MainWindow::setupLineEditKeyEventList()
{
    lineEditKeyEventSet.insert(ui->lineEdit_1);
    lineEditKeyEventSet.insert(ui->lineEdit_2);
    lineEditKeyEventSet.insert(ui->lineEdit_3);
}