如何阻止空格键触发聚焦的 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_Enter
。 if
条件类似于:
if((e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter) && (e->modifiers() & Qt::ControlModifier))
假设我有一个重点 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_Enter
。 if
条件类似于:
if((e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter) && (e->modifiers() & Qt::ControlModifier))