How to stop spacebar from triggering a focused QPushButton?

十年热恋 提交于 2021-02-08 05:01:59

问题


Suppose I have a focused QPushButton:

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

When this button is displayed, pressing Space will trigger (i.e. click) the button. I don't want this behavior. Instead, I would like Ctrl+Enter to trigger the button.

How can I achieve this in Qt?

(Working examples would really help as this is part of my first Qt app)


回答1:


I think the best way is to do as @thuga said. The idea is to subclass the QPushButton and reimplement keyPressEvent().

This may look as follows:

.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();
}

This way, the Space event is not handled anymore and the Ctrl + Enter will run the click() function.
I have tested it and it worked successfully.

I've written this example as simple as possible. Of course, feel free to adapt it to best fit your needs.


If you want it to work with the numpad Enter key too, you can catch Qt::Key_Enter too. The if condition would be something like:

if((e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter) && (e->modifiers() & Qt::ControlModifier))



回答2:


you can connect the slot of the button clicked to a shortcut

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

on the other hand, you can do set the focus policy to avoid the space bar event trigger:

my_button->setFocusPolicy(Qt::NoFocus)


来源:https://stackoverflow.com/questions/58388744/how-to-stop-spacebar-from-triggering-a-focused-qpushbutton

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!