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

时间:2014-10-14 19:20:13

标签: 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);
}

2 个答案:

答案 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()删除事件过滤器   功能