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