HMI-61-【多媒体】空调部分 2

530 阅读4分钟

“我正在参加「掘金·启航计划」”

头图

前言

如果这个系列Qt 汽车 HMI 仪表文章你都看过,或者大部分看过,知道整个项目的一个大致,那么可以接着看下去,如果是第一次就直接看到了这篇文章,那么多半应该是云里雾里的,因为写到现在,基本就是开发流水账了。除了个别知识点获取有参考价值,其他的应该没有太多的价值。

如果对这个项目感兴趣,那么有两个办法

1 联系作者(也就是我),获取源码

2 把Qt 汽车 HMI 仪表从头看看,至少知道我想要做什么,才能知道我现在在做什么。

HMI-61-【多媒体】空调部分 2

昨天我们已经实现了自定义的按钮了,今天我们把已经定义好的按钮和我们的控制台联动起来,使我们的多媒体部分不仅可以触屏控制,可一个使用控制台的旋钮来控制。演示如下

☑当前进度

实现了多媒体空调部分控件和控制台旋钮联动,如下图所示


HMI-61-【多媒体】空调部分 2☑当前进度1 控制台部分2 空调面板处理2.2 旋钮处理代码2.3 按钮状态控制代码2.4 旋钮按键处理☞第三阶段成果展示☞第二阶段成果展示☞第一阶段成果展示

关键字: HMIMultifunctionQtQMediaPlayer收音机

1 控制台部分

控制台部分主要就是将新增的 5个按钮的按下和松开信号发送出去。代码如下:

 void MainControl::on_pushButton_centerOk_pressed()
 {
     emit signal_ControlButton(0,1);
 }
 ​
 ​
 void MainControl::on_pushButton_centerOk_released()
 {
     emit signal_ControlButton(0,0);
 }
 ​
 ​
 void MainControl::on_pushButton_centerUp_pressed()
 {
     emit signal_ControlButton(1,1);
 }
 ​
 ​
 void MainControl::on_pushButton_centerUp_released()
 {
     emit signal_ControlButton(1,1);
 }
 ​
 ​
 void MainControl::on_pushButton_centerDoen_pressed()
 {
     emit signal_ControlButton(2,1);
 }
 ​
 ​
 void MainControl::on_pushButton_centerDoen_released()
 {
     emit signal_ControlButton(2,1);
 }
 ​
 ​
 void MainControl::on_pushButton_centerLeft_pressed()
 {
     emit signal_ControlButton(3,1);
 }
 ​
 ​
 void MainControl::on_pushButton_centerLeft_released()
 {
     emit signal_ControlButton(3,1);
 }
 ​
 ​
 void MainControl::on_pushButton_centerRight_pressed()
 {
     emit signal_ControlButton(4,1);
 }
 ​
 ​
 void MainControl::on_pushButton_centerRight_released()
 {
     emit signal_ControlButton(4,1);
 }

信号传递路径如下

image-20220502234038974

2 空调面板处理

空调面板处理部分有点东西,首先在昨天的基础上,我用了一个QList来存放我们自定义Button,这里其实是有坑的,在后面增加其他控件的时候就会触发,到时在想办法解决。

所以在初始化按钮的时候,我会顺便吧这些按钮按照一定顺序装到这个QList中,什么顺序呢,我这里定义了一个索引的枚举,如下。同样这个枚举内容也是会随着后期模块增多而增加。

 enum AirConditionerIndex
 {
 ​
     AC_auto = 0,
     AC_ac,
     AC_maxAC,
     AC_cycle,
     AC_aqs,
     AC_dual,
     AC_rear,
     AC_ion,
 ​
 ​
 ​
 ​
     AC_Count
 };
     ### 2.1 按钮初始化代码
 void MFD_AirConditioner::initMyPushButtons()
 {
     m_buttonList.clear();
 ​
     ui->myPushButton_auto->setText("AUTO");
     m_buttonList.append(ui->myPushButton_auto);
 ​
     ui->myPushButton_ac->setText("AC");
     m_buttonList.append(ui->myPushButton_ac);
 ​
     ui->myPushButton_maxAC->setText("MAX A/C");
     m_buttonList.append(ui->myPushButton_maxAC);
 ​
     ui->myPushButton_cycle->setPicText(":/AirConditioner/Resources/MultifunctionDisplay/AirConditioner/AirConditionerPushButton/cycle.png",
                                        ":/AirConditioner/Resources/MultifunctionDisplay/AirConditioner/AirConditionerPushButton/cycle_1.png");
     m_buttonList.append(ui->myPushButton_cycle);
 ​
     ui->myPushButton_aqs->setText("AQS");
     m_buttonList.append(ui->myPushButton_aqs);
 ​
     ui->myPushButton_dual->setText("DUAL");
     m_buttonList.append(ui->myPushButton_dual);
 ​
 ​
     ui->myPushButton_rear->setText("REAR");
     m_buttonList.append(ui->myPushButton_rear);
 ​
     ui->myPushButton_rear->setICON(":/AirConditioner/Resources/MultifunctionDisplay/AirConditioner/AirConditionerPushButton/lock.png");
 ​
     ui->myPushButton_ion->setText("ION");
     m_buttonList.append(ui->myPushButton_ion);
 ​
 }

image-20220502234619420

2.2 旋钮处理代码

 void MFD_AirConditioner::inputControlDialValue(int value)
 {
     if(value>0)
     {
         if(m_SelectIndex< AirConditionerIndex::AC_Count-1)
             m_SelectIndex++;
         else
             m_SelectIndex = 0;
     }
     else
     {
         if(m_SelectIndex > 0)
             m_SelectIndex--;
         else
             m_SelectIndex = AirConditionerIndex::AC_Count-1;
     }
 ​
     updateSelect();
 }

2.3 按钮状态控制代码

这里也就体现了使用QList的好处了,不然这里的代码,得长又长了。·

 void MFD_AirConditioner::updateSelect()
 {
     QListIterator<MFD_AirConditioner_PushButon*> list(m_buttonList);
     while (list.hasNext()) {
         list.next()->selected(false);
     }
     m_buttonList[m_SelectIndex]->selected(true);
 }

2.4 旋钮按键处理

这里我暂时只使用了OK按钮,来模拟旋钮按下和松开,代码如下:

 void MFD_AirConditioner::inputControButton(int index,int type)
 {
     switch (index) {
     case 0:         // OK
         if(type)
         {
             if(m_SelectIndex>=0)
                 m_buttonList[m_SelectIndex]->enter();
         }
         else
         {
             if(m_SelectIndex>=0)
                 m_buttonList[m_SelectIndex]->releaseEnter();
         }
         break;
     case 1:         // Up
 ​
         break;
     case 2:         // Down
 ​
         break;
     case 3:         // Left
 ​
         break;
     case 4:         // Right
 ​
         break;
     default:
         break;
     }
 }

☞第三阶段成果展示

目前已完成液晶仪表三种模式的初步显示,小模块后期根据精力更新了,主要还得找美术来搞资源,自己能力不够。暂未跟新计划。展示如下:

[video(video-yznBr6e3-1648369267384)(type-bilibili)(url-player.bilibili.com/player.html…img-blog.csdnimg.cn/img_convert…基于Qt的汽车仪表模拟 3.0)]

✈B站链接:www.bilibili.com/video/BV1WS…


☞第二阶段成果展示

目前以完成HUD界面及接口开发,液晶仪表舒适模式和运动模式的开发。视频展示如下:

[video(video-2AqJ88TY-1645273728489)(type-bilibili)(url-player.bilibili.com/player.html…img-blog.csdnimg.cn/img_convert…基于Qt的汽车仪表模拟 2.0)]

✈B站链接:www.bilibili.com/video/BV1aq…


☞第一阶段成果展示

目前以完成HUD界面及接口开发,液晶仪表舒适模式开发。展示如下:

[video(video-ArCvRvBQ-1642664938100)(type-bilibili)(url-player.bilibili.com/player.html…img-blog.csdnimg.cn/img_convert…基于Qt的汽车仪表模拟 1.0))]

✈B站链接:www.bilibili.com/video/BV1qJ…


说明:

本项目中所使借鉴原型来自:[吉利] 博瑞GE | 仪表HMI设计吉利汽车HMI项目

多媒体部分是来自吉利博瑞2017旗舰版界面所有权和解释权都归吉利汽车所有。

设计图的所有权和解释权都归吉利汽车所有。

本项目所有资源文件均由**打不死的小海**复刻制作。

本项目代码暂时不会开源,有需要的源码的可与我联系,左上角二维码加微信。

本项目仅限学习交流、禁止商业使用。