简体   繁体   English

QWidget如何在子窗口小部件中接收keyPressEvent

[英]QWidget how to receive keyPressEvent inside child widgets

I have one main Widget and inside this main widget I have QListWidget and two buttons. 我有一个主要的Widget ,在这个主要小部件中,我有QListWidget和两个按钮。 I have override the keyPressEvent inside the main widget (inherited from QWidget ). 我已经覆盖了主窗口小部件中的keyPressEvent (继承自QWidget )。 I can receive the keyPress events when focus is not on QListWidget , but when focus is inside the QListWidget I am unable to receive these keyPress events. 当焦点不在QListWidget ,我可以接收keyPress事件,但是当焦点在QListWidget内时,我无法接收这些keyPress事件。 Below is the code I have used to achieve this: 以下是我用来实现此目的的代码:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    this->setFocusPolicy(Qt::StrongFocus);

    ui->listWidget->addItem(new QListWidgetItem("Item1"));
    ui->listWidget->addItem(new QListWidgetItem("Item2"));
    ui->listWidget->addItem(new QListWidgetItem("Item3"));

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::keyPressEvent(QKeyEvent *event)
{
    qDebug() << "event->key(): " << event->key();

    QWidget::keyPressEvent(event);
}

In header: 在标题中:

protected:

     bool eventFilter(QObject *obj, QEvent *event);

In constructor: 在构造函数中:

qApp->installEventFilter(this);

Filter: 过滤:

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{   
    if (event->type() == QEvent::KeyPress)
    {
        QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
           qDebug() << "key " << keyEvent->key() << "from" << obj; 
    }
    return QObject::eventFilter(obj, event);
}

With this event filter you can catch all key press events and check who is emit event ( obj ) 使用此事件过滤器,您可以捕获所有按键事件并检查谁是发出事件( obj

For example: 例如:

if ( obj == ui->listWidget )
//event from QListWidget

Accordingly to your comment: 根据你的评论:

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{ 
    if (event->type() == QEvent::KeyPress)
    {
        if(obj == ui->listWidget)
        {
            QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
            if(keyEvent->key() == Qt::Key_Up)
                qDebug() << "Up";
            if(keyEvent->key() == Qt::Key_Down)
                qDebug() << "Down";
        }
    }
    return QObject::eventFilter(obj, event);
}

You need to use event filters . 您需要使用事件过滤器

Sometimes an object needs to look at, and possibly intercept, the events that are delivered to another object. 有时,对象需要查看并可能拦截传递给另一个对象的事件。 For example, dialogs commonly want to filter key presses for some widgets; 例如,对话框通常希望过滤某些小部件的按键操作; for example, to modify Return-key handling. 例如,修改Return-key处理。

The QObject::installEventFilter() function enables this by setting up an event filter, causing a nominated filter object to receive the events for a target object in its QObject::eventFilter() function. QObject :: installEventFilter()函数通过设置事件过滤器来启用此功能,从而使指定的过滤器对象在其QObject :: eventFilter()函数中接收目标对象的事件。 An event filter gets to process events before the target object does, allowing it to inspect and discard the events as required. 事件过滤器可以在目标对象执行之前处理事件,从而允许它根据需要检查和丢弃事件。 An existing event filter can be removed using the QObject::removeEventFilter() function. 可以使用QObject :: removeEventFilter()函数删除现有的事件过滤器。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM