QWidget如何在子小部件内接收keyPressEvent [英] QWidget how to receive keyPressEvent inside child widgets

查看:116
本文介绍了QWidget如何在子小部件内接收keyPressEvent的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个主要的 Widget,在这个主要的小部件中我有 QListWidget 和两个按钮.我已经覆盖了主小部件中的 keyPressEvent(继承自 QWidget).当焦点不在 QListWidget 上时,我可以接收 keyPress 事件,但是当焦点在 QListWidget 内时,我无法接收这些 keyPress 事件.以下是我用来实现此目的的代码:

I have one main Widget and inside this main widget I have QListWidget and two buttons. I have override the keyPressEvent inside the main widget (inherited from 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. 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);
}

推荐答案

在标题中:

protected:

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

在构造函数中:

qApp->installEventFilter(this);

过滤器:

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

使用此事件过滤器,您可以捕获所有按键事件并检查谁发出事件 (obj)

With this event filter you can catch all key press events and check who is emit event (obj)

例如:

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

根据您的评论:

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

这篇关于QWidget如何在子小部件内接收keyPressEvent的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆