Я думаю, что лучший способ это сделать, как сказал @ thuga . Идея состоит в том, чтобы создать подкласс QPushButton
и переопределить keyPressEvent()
.
. Это может выглядеть следующим образом:
.h
#include <QPushButton>
class MyQPushButton final : public QPushButton
{
Q_OBJECT
public:
MyQPushButton(const QIcon icon, const QString & text, QWidget * parent = nullptr);
MyQPushButton(const QString & text, QWidget * parent = nullptr);
MyQPushButton(QWidget * parent = nullptr);
protected:
void keyPressEvent(QKeyEvent * e) override;
};
.cpp
#include <QKeyEvent>
MyQPushButton::MyQPushButton(const QIcon icon, const QString & text, QWidget * parent) : QPushButton(icon, text, parent)
{}
MyQPushButton::MyQPushButton(const QString & text, QWidget * parent) : QPushButton(text, parent)
{}
MyQPushButton::MyQPushButton(QWidget * parent) : QPushButton(parent)
{}
void MyQPushButton::keyPressEvent(QKeyEvent * e)
{
if(e->key() == Qt::Key_Return && (e->modifiers() & Qt::ControlModifier))
click();
else
e->ignore();
}
Таким образом, событие Space больше не обрабатывается, а Ctrl + Enter запустит функцию click()
. Я протестировал его, и он успешно работал.
Я написал этот пример как можно проще. Конечно, не стесняйтесь адаптировать его под свои нужды.
Если вы хотите, чтобы он работал с клавишей numpad Enter , вы также можете поймать Qt::Key_Enter
. Условие if
будет выглядеть примерно так:
if((e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter) && (e->modifiers() & Qt::ControlModifier))