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

基于Qt的汽车仪表模拟

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

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

setFocusPolicy(Qt::NoFocus)

这样实现的方式其实不适合大的项目和多人协作的项目,目前还没有找到好的方式,来看下目前的效果吧。目前只有获取了ctrl 和方向键,后期根据需要在增加其他的按键解析。

看下代码吧

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;
     }
}

2019/08/20 13:07

发布了259 篇原创文章 · 获赞 535 · 访问量 55万+

猜你喜欢

转载自blog.csdn.net/z609932088/article/details/99842919