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

Posted

技术标签:

【中文标题】如何阻止空格键触发聚焦的 QPushButton?【英文标题】:How to stop spacebar from triggering a focused QPushButton? 【发布时间】:2020-02-11 18:50:02 【问题描述】:

假设我有一个专注的QPushButton

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

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

如何在 Qt 中实现这一点?

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

【问题讨论】:

安装事件过滤器或子类QPushButton 并重新实现keyReleaseEvent 方法。 Here is how it works in QAbstractButton 班级。你可能还得玩keyPressEvent 【参考方案1】:

我认为最好的方法是按照 @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))

【讨论】:

你会如何在 python3 中做到这一点? @CarlosMedina 我刚想说用 PyQt5 为 Python3 创建一个新问题会更好,因为我看到你已经这样做了:) (我很高兴看到你的问题在我写这篇评论的时候已经解决了)【参考方案2】:

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

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

另一方面,您可以设置焦点策略以避免空格键事件触发:

my_button->setFocusPolicy(Qt::NoFocus)

【讨论】:

如果我没记错的话,它不会禁用空格键触发。 是的,它按预期工作......或者是阻止触发来自空格键的信号的问题?? 如果我很好地理解了这个问题,那么 OP 想要 replace ("...我不想要这种行为。相反,..." )您提供的快捷方式(CTRL+Enter)从空格键获得的快捷方式。 注意,我还想阻止空格键触发按钮。 事实上,我认为它只有在专注的情况下才能发挥作用。而且您并没有真正删除空间句柄:) 实际上我认为重新实现 QPushButton::KeyPressEvent() 将是一个很好的解决方案。

以上是关于如何阻止空格键触发聚焦的 QPushButton?的主要内容,如果未能解决你的问题,请参考以下文章

聚焦时图像未突出显示的 QPushButton (MAC)

当用户按下其他控件/空格时,如何取消对UITextField的聚焦?

鼠标在圆角QPushButton时如何不触发悬停状态?

Kendo Grid 如何以编程方式聚焦网格单元并阻止选择文本

如何使用 QPushButton 在现有 QTabWidget 上添加“新选项卡”

PyQt5:可以通过 QPushButton 触发 QAction 功能吗