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

gmu*_*mad 5 c++ qt qt4 qwidget

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

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);
}
Run Code Online (Sandbox Code Playgroud)

Che*_*byl 11

在标题中:

protected:

     bool eventFilter(QObject *obj, QEvent *event);
Run Code Online (Sandbox Code Playgroud)

在构造函数中:

qApp->installEventFilter(this);
Run Code Online (Sandbox Code Playgroud)

过滤:

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);
}
Run Code Online (Sandbox Code Playgroud)

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

例如:

if ( obj == ui->listWidget )
//event from QListWidget
Run Code Online (Sandbox Code Playgroud)

根据你的评论:

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);
}
Run Code Online (Sandbox Code Playgroud)