HMI-5-[QtKeyEvent]:解决Qt键盘事件无法获取到上下左右等按键并实现键盘解析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: HMI-5-[QtKeyEvent]:解决Qt键盘事件无法获取到上下左右等按键并实现键盘解析

image.png

今天在编写代码的时候,发现重载键盘事件的时候无法获取到上下左右键盘案件的消息,百度后才知道是因为我窗口上面有很多控件,获取了键盘的事件。

我的做法就是让这些按控件都不要焦点

image.png

看下代码吧

void ControlPanel::keyPressEvent(QKeyEvent *event)
{
    switch (event->key())
    {
    case Qt::Key_Control:
    {
        controlIsPressed = true;
        m_maincontrol->setKeyBordPressed(key_Control);
        break;
    }
    case Qt::Key_Down:
        m_maincontrol->setKeyBordPressed(Key_Down);
        break;
    case Qt::Key_Left:
        m_maincontrol->setKeyBordPressed(key_Left);
        break;
    case Qt::Key_Right:
        m_maincontrol->setKeyBordPressed(key_Right);
        break;
    case Qt::Key_Up:
        m_maincontrol->setKeyBordPressed(key_Up);
        break;
    default:
        break;
    }
}
void ControlPanel::keyReleaseEvent(QKeyEvent *event)
{
    switch (event->key()) {
    case Qt::Key_Control:
    {
        controlIsPressed = false;
        m_maincontrol->setKeyBordRelease(key_Control);
        break;
    }
    case Qt::Key_Down:
        m_maincontrol->setKeyBordRelease(Key_Down);
        break;
    case Qt::Key_Left:
        m_maincontrol->setKeyBordRelease(key_Left);
        break;
    case Qt::Key_Right:
        m_maincontrol->setKeyBordRelease(key_Right);
        break;
    case Qt::Key_Up:
        m_maincontrol->setKeyBordRelease(key_Up);
        break;
    default:
        break;
    }
}

这里呢,我的展示界面放是这个子控件的子控件,多以我在写的时候,要想不被他们吧我的键盘事件拦截了,我得把其他的控件都设置成没有交点,这样开可以将我的键盘事件传递到最下面来。


具体展现方式很简单,就是根据现有的信号,做下图片资源的替换工作。


为了识别方便了,这里我把我需要的按键都做成了一个枚举,这样用起来就不1234567方便多了

enum controlKey
{
    key_Control,
    key_Up,
    Key_Down,
    key_Left,
    key_Right
};

目前呢,就是这么几个按键,后期有需求在正加按键吧。

实现切面图片资源替换的代码

void MainControl::setKeyBordPressed(controlKey key)
{
    switch (key)
    {
    case key_Control:
        ui->label_ctrl->setStyleSheet("QLabel{border-image:url(:/ControlPanel/Resources/ControlPanel/Key/ctrl_o.png);}");
        controlIsPressed = true;
        break;
    case key_Up:
        ui->label_up->setStyleSheet("QLabel{border-image:url(:/ControlPanel/Resources/ControlPanel/Key/up_o.png);}");
        break;
    case Key_Down:
        ui->label_down->setStyleSheet("QLabel{border-image:url(:/ControlPanel/Resources/ControlPanel/Key/down_o.png);}");
        break;
    case key_Left:
        ui->label_left->setStyleSheet("QLabel{border-image:url(:/ControlPanel/Resources/ControlPanel/Key/left_o.png);}");
        break;
    case key_Right:
        ui->label_right->setStyleSheet("QLabel{border-image:url(:/ControlPanel/Resources/ControlPanel/Key/right_o.png);}");
        break;
    default:
        break;
     }
}
void MainControl::setKeyBordRelease(controlKey key)
{
    switch (key)
    {
    case key_Control:
        ui->label_ctrl->setStyleSheet("QLabel{border-image:url(:/ControlPanel/Resources/ControlPanel/Key/ctrl_w.png);}");
        controlIsPressed = false;
        break;
    case key_Up:
        ui->label_up->setStyleSheet("QLabel{border-image:url(:/ControlPanel/Resources/ControlPanel/Key/up_w.png);}");
        break;
    case Key_Down:
        ui->label_down->setStyleSheet("QLabel{border-image:url(:/ControlPanel/Resources/ControlPanel/Key/down_w.png);}");
        break;
    case key_Left:
        ui->label_left->setStyleSheet("QLabel{border-image:url(:/ControlPanel/Resources/ControlPanel/Key/left_w.png);}");
        break;
    case key_Right:
        ui->label_right->setStyleSheet("QLabel{border-image:url(:/ControlPanel/Resources/ControlPanel/Key/right_w.png);}");
        break;
    default:
        break;
     }
}

image.png

目录
相关文章
|
6月前
|
存储 算法 API
【Qt 基本类】QDateTime类在C++中的应用与深度解析
【Qt 基本类】QDateTime类在C++中的应用与深度解析
226 0
|
6月前
|
存储 传感器 安全
【串口通信】使用C++和Qt设计和实现串口协议解析器(二)
【串口通信】使用C++和Qt设计和实现串口协议解析器
539 0
|
6月前
|
存储 开发框架 算法
【串口通信】使用C++和Qt设计和实现串口协议解析器(一)
【串口通信】使用C++和Qt设计和实现串口协议解析器
1482 0
|
6月前
|
存储 机器学习/深度学习 人工智能
Qt魔法书:打造自定义鼠标键盘脚本(二)
Qt魔法书:打造自定义鼠标键盘脚本
214 0
|
6月前
|
算法 Unix Linux
Linux与Qt线程优先级的对应关系:一次全面解析
Linux与Qt线程优先级的对应关系:一次全面解析
88 0
|
4月前
|
存储 算法 C++
【Qt应用开发】复刻经典:基于Qt实现Windows风格计算器(加减乘除、删除、归零功能全解析)
在Qt中,"栈"的概念主要体现在两个层面:一是程序设计中的数据结构——栈(Stack),二是用户界面管理中的QStackedWidget控件。下面我将分别简要介绍这两个方面:
142 4
|
2月前
|
编解码 开发工具 UED
QT Widgets模块源码解析与实践
【9月更文挑战第20天】Qt Widgets 模块是 Qt 开发中至关重要的部分,提供了丰富的 GUI 组件,如按钮、文本框等,并支持布局管理、事件处理和窗口管理。这些组件基于信号与槽机制,实现灵活交互。通过对源码的解析及实践应用,可深入了解其类结构、布局管理和事件处理机制,掌握创建复杂 UI 界面的方法,提升开发效率和用户体验。
156 12
|
4月前
|
调度
【浅入浅出】Qt多线程机制解析:提升程序响应性与并发处理能力
在学习QT线程的时候我们首先要知道的是QT的主线程,也叫GUI线程,意如其名,也就是我们程序的最主要的一个线程,主要负责初始化界面并监听事件循环,并根据事件处理做出界面上的反馈。但是当我们只限于在一个主线程上书写逻辑时碰到了需要一直等待的事件该怎么办?它的加载必定会带着主界面的卡顿,这时候我们就要去使用多线程。
155 6
|
6月前
|
XML 数据可视化 程序员
Qt 中的项目文件解析和命名规范
Qt 中的项目文件解析和命名规范
|
6月前
|
编译器 C语言
Qt使用MSVC编译错误: LNK2019: 无法解析的外部符号
Qt使用MSVC编译错误: LNK2019: 无法解析的外部符号
327 1

推荐镜像

更多