Qt中QLineEdit的按键事件

4
我在网上搜索了如何只捕获特定QWidget(QLineEdit)上的按键事件的方法。一种方法是继承该类并重写虚拟keyPress函数,但我无法这样做,因为我正在使用QtDesigner(是否可能使用QtDesigner实现?)
我还尝试在整个窗口上覆盖KeyPress事件,但我需要过滤仅当特定lineEdit处于活动状态时的事件,而我无法找到实现此操作的方法(但肯定有方法)
总体而言,解决这个问题的最佳方法是什么?谢谢 :)
1个回答

5
不,你不能使用 Designer 完成这个任务。如果你不想使用继承,那么你应该使用事件过滤器。例如:
bool Dialog::eventFilter(QObject *obj, QEvent *event)
{
    if (obj == ui->lineEdit && event->type() == QEvent::KeyPress)
    {
        QKeyEvent *key = static_cast<QKeyEvent *>(event);
        qDebug() << "pressed"<< key->key();
    }
    return QObject::eventFilter(obj, event);
}

要使用eventFilter,您还应该:

protected:
    bool eventFilter(QObject *obj, QEvent *event);//in Dialog header

并且

qApp->installEventFilter(this);//in Dialog constructor

谢谢 :) 你所指的aApp是什么?是main.cpp文件中的app对象吗? - kianenigma
它能够工作,但是仅当应用程序的主窗口聚焦时才能捕获事件,难道我不应该像ui->lineEdit.installEventFilter()这样做吗? - kianenigma
请参阅http://qt-project.org/doc/qt-5/qapplication.html#qApp以获取详细信息。它从lineEdit捕获事件,如果过滤器无法从lineEdit捕获事件,则lineEdit现在没有此事件。 - Jablonski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接