如何停止空格键触发重点QPushButton?

时间:2019-10-15 06:48:34

标签: c++ qt qt4

假设我专注于QPushButton

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

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

如何在Qt中实现这一目标?

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

2 个答案:

答案 0 :(得分:0)

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

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

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

my_button->setFocusPolicy(Qt::NoFocus)

答案 1 :(得分:0)

我认为最好的方法是按照 @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()函数。 br /> 我已经对其进行了测试,并且可以成功运行。

我已将这个示例编写得尽可能简单。当然,请随时对其进行调整以使其最适合您的需求。


如果您也希望它与数字键盘的 Enter 键一起使用,则也可以捕获Qt::Key_Enterif条件类似于:

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