我有一个主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);
}
答案 0 :(得分:11)
在标题中:
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
)
例如:
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);
}
答案 1 :(得分:3)
您需要使用event filters。
有时候一个物体需要看,并可能拦截它 传递给另一个对象的事件。例如,对话框 通常希望过滤某些小部件的按键;例如,到 修改返回键处理。
QObject :: installEventFilter()函数通过设置启用此功能 事件过滤器,使指定的过滤器对象接收 QObject :: eventFilter()函数中目标对象的事件。一个 事件过滤器在目标对象之前处理事件, 允许它根据需要检查和丢弃事件。现有的 可以使用QObject :: removeEventFilter()删除事件过滤器 功能