如何阻止空格键触发聚焦的 QPushButton?

How to stop spacebar from triggering a focused QPushButton?

假设我有一个重点 QPushButton:

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

显示此按钮时,按 Space 将触发(即单击)该按钮。我不想要这种行为。相反,我想要 Ctrl+Enter 来触发按钮。

如何在 Qt 中实现这一点?

(工作示例真的很有帮助,因为这是我的第一个 Qt 应用程序的一部分)

您可以将点击按钮的插槽连接到快捷方式

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

另一方面,您可以设置焦点策略来避免 space 栏事件触发:

my_button->setFocusPolicy(Qt::NoFocus)

我认为最好的办法就是按照@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() 函数。
我已经测试过了,它成功了。

我已经尽可能简单地编写了这个示例。当然,您可以根据自己的需要随意调整它。


如果你想让它也与小键盘 Enter 键一起工作,你也可以抓住 Qt::Key_Enterif 条件类似于:

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