簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM