[英]QWidget how to receive keyPressEvent inside child widgets
我有一個主要的Widget
,在這個主要小部件中,我有QListWidget
和兩個按鈕。 我已經覆蓋了主窗口小部件中的keyPressEvent
(繼承自QWidget
)。 當焦點不在QListWidget
,我可以接收keyPress
事件,但是當焦點在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);
}
在標題中:
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);
}
您需要使用事件過濾器 。
有時,對象需要查看並可能攔截傳遞給另一個對象的事件。 例如,對話框通常希望過濾某些小部件的按鍵操作; 例如,修改Return-key處理。
QObject :: installEventFilter()函數通過設置事件過濾器來啟用此功能,從而使指定的過濾器對象在其QObject :: eventFilter()函數中接收目標對象的事件。 事件過濾器可以在目標對象執行之前處理事件,從而允許它根據需要檢查和丟棄事件。 可以使用QObject :: removeEventFilter()函數刪除現有的事件過濾器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.