gpt4 book ai didi

c++ - QWidget 如何在子部件中接收 keyPressEvent

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:57:44 24 4
gpt4 key购买 nike

我有一个主要的 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);
}

关于c++ - QWidget 如何在子部件中接收 keyPressEvent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26368659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com