假设我专注于QPushButton
:
my_button = new QPushButton("Press me!", this);
my_button->setFocus();
显示此按钮时,按空格将触发(即单击)该按钮。我不要这种行为。相反,我想 Ctrl + Enter 来触发按钮。
如何在Qt中实现这一目标?
(工作示例确实有帮助,因为这是我的第一个Qt应用程序的一部分)
答案 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_Enter
。 if
条件类似于:
if((e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter) && (e->modifiers() & Qt::ControlModifier))