Как остановить пробел от запуска сфокусированного QPushButton? - PullRequest
2 голосов
/ 15 октября 2019

Предположим, у меня есть сфокусированное QPushButton:

my_button = new QPushButton("Press me!", this);
my_button->setFocus();

Когда отображается эта кнопка, нажатие Пробел вызовет (т.е. щелкните) кнопку. Я не хочу такого поведения. Вместо этого я бы хотел Ctrl + Enter , чтобы вызвать кнопку.

Как мне добиться этого в Qt?

(рабочие примеры действительно помогли бы, так как это часть моего первого приложения Qt)

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Я думаю, что лучший способ это сделать, как сказал @ 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))
0 голосов
/ 15 октября 2019

вы можете подключить слот кнопки, к которой вы нажали, с ярлыком

connect(new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Enter), this), &QShortcut::activated, [this]() {on_pushButton_clicked();});

, с другой стороны, вы можете установить политику фокуса, чтобы избежать триггера события пробела:

my_button->setFocusPolicy(Qt::NoFocus)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...