QWidget如何在子小部件内接收keyPressEvent [英] QWidget how to receive keyPressEvent inside child widgets
问题描述
我有一个主要的 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屋!