HMI-60-【多媒体】空调部分 1

简介: 今天我们搞空调的按钮,今天这里我们不会堆砌大量的素材,而是用一个自定义的Button来实现这些,可以看到我们这次的空调按钮有以下元素

头图

前言

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

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

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

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

HMI-60-【多媒体】空调部分 1

​ 今天我们搞空调的按钮,今天这里我们不会堆砌大量的素材,而是用一个自定义的Button来实现这些,可以看到我们这次的空调按钮有以下元素

1 文字

2 选中/非选中

3 开关表示(橘色和灰色矩形)

4 图标

☑当前进度

​ 今天主要就是使用自定按钮,把空调界面的子功能开关实现了,这个如果要是堆图片资源,估计我的艺术家会打死我的,再说我的脑子估计也得坏掉,因为我资源的命名是没有规则的,这就会把我坑死,加上这次按钮还是基本一致的,可以有一定的规律可循。


[toc]

关键字: HMIMultifunctionQtQMediaPlayer收音机

1 自定义按钮

​ 自定义按钮需要实现的功能

1 文字

2 选中/非选中

3 开关表示(橘色和灰色矩形)

4 图标

​ 这里我们新建一个界面设计师类命名为MFD_AirConditioner_PushButon,在界面上按照上面列出的要素布局实现,如下图所示

image-20220502214127121

​ 应该是很好理解的吧,

​ 这里使用了一个水平布局,用来显示一个ICON图标和文字,文字可以分为普通文本文字和图片文字。图标就是一个普通的ICON图标。在文字的下方,放置了一个label开表示当前功能的开关。

​ 在上面两个元素的下一层图层中,放置了一个label来表示选中和不选中,这个功能在动画展示中没有表示出来,是因为这个需要和我们控制的中控旋钮进行联动,所以还没有实现。

代码实现

​ 这里看我我这个自定义的按钮控件的代码吧

头文件

#ifndef MFD_AIRCONDITIONER_PUSHBUTON_H
#define MFD_AIRCONDITIONER_PUSHBUTON_H

#include <QWidget>

namespace Ui {
class MFD_AirConditioner_PushButon;
}

class MFD_AirConditioner_PushButon : public QWidget
{
    Q_OBJECT

public:
    explicit MFD_AirConditioner_PushButon(QWidget *parent = nullptr);
    ~MFD_AirConditioner_PushButon();
    /**
     * @brief setICON
     * @param path
     * 设置图标
     */
    void setICON(QString path);
    /**
     * @brief setText
     * @param text
     * 设置文本文字
     */
    void setText(QString text);
    /**
     * @brief setPicText
     * @param path1  正常状态
     * @param path2  按下状态
     * 设置图片文字
     */
    void setPicText(QString path1,QString path2);
    /**
     * @brief selected
     * 选中
     */
    void selected();
    /**
     * @brief unSelected
     * 未选中
     */
    void unSelected();
    /**
     * @brief enter
     * 进入,与按下功能一致
     */
    void enter();
    /**
     * @brief releaseEnter
     * 进入按钮松开,与按钮松开功能一致
     */
    void releaseEnter();

private slots:

    void on_pushButton_pressed();

    void on_pushButton_released();



private:
    /**
     * @brief setONFlage
     * 设置功能开关图标
     */
    void setONFlage();

private:
    Ui::MFD_AirConditioner_PushButon *ui;
    QString mPicText1 = "";
    QString mPicText2 = "";
    bool isOn = false;
};

#endif // MFD_AIRCONDITIONER_PUSHBUTON_H

源文件

#include "mfd_airconditioner_pushbuton.h"
#include "ui_mfd_airconditioner_pushbuton.h"

MFD_AirConditioner_PushButon::MFD_AirConditioner_PushButon(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MFD_AirConditioner_PushButon)
{
    ui->setupUi(this);
    ui->label_mainback->hide();                                 // 隐藏Demo
    ui->label_selected->hide();                                 // 隐藏选中,即默认为不选中
    ui->label_icon->hide();                                     // 默认隐藏图标显示
    ui->label_on_off->setStyleSheet("border-image: url(:/AirConditioner/Resources/MultifunctionDisplay/AirConditioner/AirConditionerPushButton/off.png);");
    ui->pushButton->setStyleSheet("QPushButton{border-image: url(:/AirConditioner/Resources/MultifunctionDisplay/AirConditioner/AirConditionerPushButton/button.png);}"
                                  "QPushButton:pressed{border-image: url(:/AirConditioner/Resources/MultifunctionDisplay/AirConditioner/AirConditionerPushButton/button.png);}");

}

MFD_AirConditioner_PushButon::~MFD_AirConditioner_PushButon()
{
    delete ui;
}

void MFD_AirConditioner_PushButon::setICON(QString path)
{
    ui->label_icon->show();
    ui->label_icon->setStyleSheet(QString("border-image: url(%1);").arg(path));
}

void MFD_AirConditioner_PushButon::setText(QString text)
{
    ui->label_text->setText(text);
}

void MFD_AirConditioner_PushButon::setPicText(QString path1, QString path2)
{
    ui->label_text->setText("");
    mPicText1 = path1;
    mPicText2 = path2;
    ui->label_text->setStyleSheet(QString("border-image: url(%1);").arg(path1));
}

void MFD_AirConditioner_PushButon::selected()
{
    ui->label_selected->show();
}

void MFD_AirConditioner_PushButon::unSelected()
{
    ui->label_selected->hide();
}

void MFD_AirConditioner_PushButon::enter()
{
    on_pushButton_pressed();
}

void MFD_AirConditioner_PushButon::releaseEnter()
{
    on_pushButton_released();
}

void MFD_AirConditioner_PushButon::on_pushButton_pressed()
{
    if(mPicText2.isEmpty())
        ui->label_text->setStyleSheet("font: 30pt \"Microsoft YaHei UI\";color: rgb(255, 223, 106);");
    else
        ui->label_text->setStyleSheet(QString("font: 30pt \"Microsoft YaHei UI\";color: rgb(255, 223, 106);border-image: url(%1);").arg(mPicText2));
}


void MFD_AirConditioner_PushButon::on_pushButton_released()
{
    if(mPicText1.isEmpty())
        ui->label_text->setStyleSheet("font: 30pt \"Microsoft YaHei UI\";color: rgb(255, 255, 255);");
    else
        ui->label_text->setStyleSheet(QString("font: 30pt \"Microsoft YaHei UI\";color: rgb(255, 223, 106);border-image: url(%1);").arg(mPicText1));

    isOn = !isOn;
    setONFlage();
}

void MFD_AirConditioner_PushButon::setONFlage()
{
    if(isOn)
    {
        ui->label_on_off->setStyleSheet("border-image: url(:/AirConditioner/Resources/MultifunctionDisplay/AirConditioner/AirConditionerPushButton/open.png);");
    }
    else
    {
        ui->label_on_off->setStyleSheet("border-image: url(:/AirConditioner/Resources/MultifunctionDisplay/AirConditioner/AirConditionerPushButton/off.png);");
    }
}

2 使用自定义控件

​ 自动以控件使用其实也很简单,直接在界面上拖拽若干个QWidget,提升为我们上面的自定义类MFD_AirConditioner_PushButon,就基本文成了。如下图所示

image-20220502215149887

剩下的就是和使用普通的类没有啥区别了,直接在文件中调用接口就可以了,因为现在还没有功能,所以信号和槽还是没有写,和面根据实际功能,在丰富这个按钮控件类。暂时代码如下

void MFD_AirConditioner::initMyPushButtons()
{
    ui->myPushButton_auto->setText("AUTO");
    ui->myPushButton_ac->setText("AC");
    ui->myPushButton_macAC->setText("MAX A/C");
    ui->myPushButton_cycle->setPicText(":/AirConditioner/Resources/MultifunctionDisplay/AirConditioner/AirConditionerPushButton/cycle.png",
                                       ":/AirConditioner/Resources/MultifunctionDisplay/AirConditioner/AirConditionerPushButton/cycle_1.png");
    ui->myPushButton_aqs->setText("AQS");
    ui->myPushButton_dual->setText("DUAL");
    ui->myPushButton_rear->setText("REAR");
    ui->myPushButton_rear->setICON(":/AirConditioner/Resources/MultifunctionDisplay/AirConditioner/AirConditionerPushButton/lock.png");
    ui->myPushButton_ion->setText("ION");
}

其余内容,下篇见。


☞第三阶段成果展示

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

[video(video-yznBr6e3-1648369267384)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=679609061)(image-https://ucc.alicdn.com/images/user-upload-01/img_convert/4d157e1cb316b007a2cb9790cb2dbfde.png)(title-基于Qt的汽车仪表模拟 3.0)]

✈B站链接:https://www.bilibili.com/video/BV1WS4y137y1/


☞第二阶段成果展示

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

[video(video-2AqJ88TY-1645273728489)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=594179292)(image-https://ucc.alicdn.com/images/user-upload-01/img_convert/e75563c3ce68bc980547dde8f6e265ba.png)(title-基于Qt的汽车仪表模拟 2.0)]

✈B站链接:https://www.bilibili.com/video/BV1aq4y1t7H7/


☞第一阶段成果展示

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

[video(video-ArCvRvBQ-1642664938100)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=77197267)(image-https://ucc.alicdn.com/images/user-upload-01/img_convert/ccddd04e0cef191fd33d7f58d41adb24.png)(title-基于Qt的汽车仪表模拟 1.0))]

✈B站链接:https://www.bilibili.com/video/BV1qJ411X7Gs/


说明:

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

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

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

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

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

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


博客签名2021

相关文章
|
大数据 开发者 程序员
连接真实世界,高德地图背后的算法演进和创新
出行是生活的重要部分。我们都习惯了出门用导航,但一个导航App背后,需要什么样的数据和算法来支撑呢?算法又如何来推动出行体验的进步和创新呢?在阿里CIO学院攻“疫”技术公益大咖说的第十四场直播中高德地图首席科学家任小枫将为大家讲解高德地图背后的算法的演进和创新,分别从地图制作、搜索推荐、路径规划、时
11444 1
《面向对象分析与设计》一3.1 系统边界
本节书摘来自华章出版社《面向对象分析与设计》一书中的第3章,第3.1节,作者 麻志毅,更多章节内容可以访问云栖社区“华章计算机”公众号查看
4003 0
DC-MOTOR直流电机的simulink建模与性能仿真
使用MATLAB2022a和Simulink构建的DC电机模型进行仿真,展示了电机在240V电枢电压和150V励磁绕组输入下的性能。仿真输出包括转速、电枢及励磁电流、电磁转矩随时间的变化。结果以图像形式呈现,揭示了电机在洛伦兹力和电磁感应定律作用下的工作原理,通过电流与磁场的交互转换电能为机械能。直流电机借助换向器维持稳定的电磁转矩,并遵循法拉第电磁感应定律和楞次定律。
|
安全 物联网
物联网卡不能更换设备使用吗
物联网卡(IoT SIM卡)是否允许更换设备使用,这主要取决于物联网服务提供商的具体政策和服务条款。通常,物联网卡是为特定设备或应用场景设计的,因此一些服务提供商会限制卡的更换使用,主要是出于安全、管理、网络优化和避免滥用等考虑
|
数据采集 存储 数据可视化
【优秀python数据分析案例】基于python的中国天气网数据采集与可视化分析的设计与实现
本文介绍了一个基于Python的中国天气网数据采集与可视化分析系统,通过requests和BeautifulSoup库实现数据爬取,利用matplotlib、numpy和pandas进行数据可视化,提供了温湿度变化曲线、空气质量图、风向雷达图等分析结果,有效预测和展示了未来天气信息。
3469 3
|
程序员
解决报错Exception encountered during context initialization
程序员不是在去生产bug的路上,那就是在去解决bug的路上。
268 1
|
机器学习/深度学习 算法 Python
从零开始:构建你的第一个机器学习模型
【7月更文第16天】在机器学习的浩瀚宇宙中,迈出第一步总是充满挑战又激动人心的。本文旨在通过一个简单而经典的案例——线性回归,引领你动手构建首个机器学习模型,让你从零开始,逐步掌握模型构建的基本流程。
397 3
|
并行计算 关系型数据库 数据库
PostgreSQL 16 提高了查询并行性
PostgreSQL 16 提高了查询并行性
516 0
|
SQL 关系型数据库 MySQL
MySQL性能优化实战:从索引策略到查询优化
MySQL性能优化聚焦索引策略和查询优化。创建索引如`CREATE INDEX idx_user_id ON users(user_id)`可加速检索;复合索引考虑字段顺序,如`idx_name ON users(last_name, first_name)`。使用`EXPLAIN`分析查询效率,避免全表扫描和大量`OFFSET`。通过子查询优化分页,如LIMIT配合内部排序。定期审查和调整策略以提升响应速度和降低资源消耗。【6月更文挑战第22天】
1624 2
|
前端开发 数据可视化
前端轮询问题之使用setInterval进行轮询时遇到问题如何解决
前端轮询问题之使用setInterval进行轮询时遇到问题如何解决
328 0