1. 课题背景
在项目开发过程中用到了纯按键的QT交互,我们通过自定义以下全局键盘事件类进行交互的实现:
class KEYPRESSFILTER_EXPORT KeyPressFilter : public QObject { Q_OBJECT public: static KeyPressFilter *instance() { if (m_instance == nullptr) { m_instance = new KeyPressFilter(); } return m_instance; } protected: bool eventFilter(QObject *obj, QEvent *event) override; ///////////////////////////////// ESC按键焦点栈及方法 public: /** * @brief 压栈,保存当前焦点 */ void pushFocus(QWidget *widget); /** * @brief 出栈,获取上一个焦点 */ QWidget *popFocus(); void handleEscKey(); void handleUpKey(); void handleDownKey(); private: static KeyPressFilter *m_instance; QStack<QWidget*> m_focusStack; // 焦点堆栈 void focusNextButton(); void focusPreviousButton(); void sendClicked(); explicit KeyPressFilter(); };
//////////////////////////////////////////////////////////////////////////////////////////////////////// 事件回调函数
/**
* @brief 按键交互事件函数
*/
bool KeyPressFilter::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
switch (keyEvent->key()) {
// clicked信号发送按键
case Qt::Key_Return:
case Qt::Key_Enter:
qDebug() << "Enter pressed";
sendClicked();
return true;
break;
// 上选按键
case Qt::Key_Up:
qDebug() << "Up arrow pressed";
handleUpKey();
break;
// 下选按键
case Qt::Key_Down:
qDebug() << "Down arrow pressed";
handleDownKey();
break;
// 左选按键
case Qt::Key_Left:
qDebug() << "Left arrow pressed";
focusPreviousButton();
return true; // 拦截事件,防止进一步传播
break;
// 右选按键
case Qt::Key_Right:
qDebug() << "Right arrow pressed";
focusNextButton();
return true; // 拦截事件,防止进一步传播
break;
// Esc按键
case Qt::Key_Escape:
qDebug() << "Esc pressed";
handleEscKey();
sendClicked();
return true;
break;
// home按键
case Qt::Key_Home:
qDebug() << "Home pressed";
break;
default:
break;
}
}
return QObject::eventFilter(obj, event);
}
需要交互的控件通过 installEventFilter(keyFilter) 安装我们自定义键盘事件,执行相应操作。
2. 自定义事件与默认事件的冲突
QT在执行事件时优先执行自定义事件,所以我们的自定义事件会优于默认事件执行。
标签:case,Qt,自定义,break,事件,Key,按键,QT From: https://www.cnblogs.com/hw-blog/p/18222538