前言:本项目是作为本人26年毕业设计开发,同步更新至2026.4月份吧(暂定)
目前实现了主界面和音乐播放界面以及天气界面
先上效果图界面后续会继续增加功能图标,左下1打算开发为行车数据监控界面
在这里插入图片描述
在这里插入图片描述

车载智能终端演示视频①

硬件环境:Windows 11 + Vmware 17.5 + 正点原子提供虚拟机 16.04 + QT 12.9
部分参考:https://blog.csdn.net/black_sneak/article/details/131889750

一、.pro文件配置

QT += core gui multimedia network
核心模块(core) 图形用户界面模块(GUI) 网络模块 音频模块
QT集成好的,面向对象编程的好处
在这里插入图片描述

二、主界面MainWindow设置

2.1 mainwindouw.h

class MainWindow : public QMainWindow
{
   Q_OBJECT
public:
   MainWindow(QWidget *parent = nullptr);
   ~MainWindow();
private:
   Ui::MainWindow *ui;
   musicWindow *music;	//音乐类的声明
   weather *wea;//天气类的声明
   void layoutinit();
   void setButtonStyle(QPushButton * button, const QString & filename);
   //时间定时器
   QTimer  *mytime;
private slots:
   void show_time();   //lcd时间显示
   void on_qqmusbtn_clicked();
   void on_weabtn_clicked();
};

2.2 MainWindow.c

通过继承musicWindow类和weather类来实现各界面的切换

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QGuiApplication>
#include <QScreen>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    layoutinit();
    music = new musicWindow(this);
    wea = new weather(this);
    //定时器
    mytime = new QTimer(this);
    connect(mytime,SIGNAL(timeout()),this,SLOT(show_time()));
    mytime->start();                        //启动定时器
}

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

void MainWindow::show_time()//时间显示
{
    QDateTime t = QDateTime::currentDateTime();
    ui->lcdNumber->setDigitCount(25);
    ui->lcdNumber->setSegmentStyle(QLCDNumber::Flat);
    ui->lcdNumber->display(t.toString("yyyy-MM-dd hh:mm:ss   "));
    ui->lcdNumber->setStyleSheet("border:none;font-size:45px;color: green;");

}
void MainWindow::setButtonStyle(QPushButton * button, const QString & filename) //设置button的图标
{
    button->setFixedSize(190,190);
    button->setIcon(QIcon(filename));
    button->setIconSize(QSize(button->width(),button->height()));
    button->setStyleSheet("background-color:transparent;border:none");
}
void MainWindow::layoutinit() //设置各button的Icon
{
    setButtonStyle(ui->qqmusbtn, ":/icon/QQmusic.png");
    setButtonStyle(ui->mapbtn, ":/icon/map.png");
    setButtonStyle(ui->weabtn, ":/icon/weather.png");
    setButtonStyle(ui->mibtn, ":/icon/mi.png");
    setButtonStyle(ui->qqvediobtn, ":/icon/QQvedio.png");
/*这种方法好像不可行,手动设置了屏幕大小1000*600*/
//    /* 获取屏幕的分辨率,Qt官方建议使用这
//     * 种方法获取屏幕分辨率,防上多屏设备导致对应不上
//     * 注意,这是获取整个桌面系统的分辨率
//     */
//    QList <QScreen *> list_screen =  QGuiApplication::screens();
//    /* 如果是ARM平台,直接设置大小为屏幕的大小 */
//#if __arm__
//    /* 重设大小 */
//    this->resize(list_screen.at(0)->geometry().width(),
//                 list_screen.at(0)->geometry().height());
//#else
//    /* 否则则设置主窗体大小为800x480 */
//    this->resize(800, 480);
//#endif
}
void MainWindow::on_qqmusbtn_clicked() //音乐界面的进入
{
    music->show();
    this->hide();
}
void MainWindow::on_weabtn_clicked() //天气界面的进入
{
    wea->show();
    this->hide();
}

在这里插入图片描述

三、音乐界面设置

音乐界面是移植正点原子官方例程进行了适当的修改

3.1 musicWindow.h

#ifndef MUSICWINDOW_H
#define MUSICWINDOW_H
#include <QMainWindow>
#include <QMediaPlayer>
#include <QMediaPlaylist>
#include <QPushButton>
#include <QSlider>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QListWidget>
#include <QLabel>
#include <QSpacerItem>
#include <QDebug>
/* 媒体信息结构体 */
struct MediaObjectInfo {
    /* 用于保存歌曲文件名 */
    QString fileName;
    /* 用于保存歌曲文件路径 */
    QString filePath;
};
namespace Ui {
class musicWindow;
}
class musicWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit musicWindow(QWidget *parent = nullptr);
    ~musicWindow();
private:
    Ui::musicWindow *ui;
private:
    /* 媒体播放器,用于播放音乐 */
    QMediaPlayer *musicPlayer;
    /* 媒体列表 */
    QMediaPlaylist *mediaPlaylist;
    /* 音乐列表 */
    QListWidget *listWidget;
    /* 播放进度条 */
    QSlider *durationSlider;
    /* 音乐播放器按钮 */
    QPushButton *pushButton[7];
    /* 垂直布局 */
    QVBoxLayout *vBoxLayout[3];
    /* 水平布局 */
    QHBoxLayout *hBoxLayout[4];
    /* 垂直容器 */
    QWidget *vWidget[3];
    /* 水平容器 */
    QWidget *hWidget[4];
    /* 标签文本 */
    QLabel *label[4];
    /* 用于遮罩 */
    QWidget *listMask;
    /* 音乐布局函数 */
    void musicLayout();
    /* 主窗体大小重设大小函数重写 */
    void resizeEvent(QResizeEvent *event);
    /* 媒体信息存储 */
    QVector<MediaObjectInfo> mediaObjectInfo;
    /* 扫描歌曲 */
    void scanSongs();
    /* 媒体播放器类初始化 */
    void mediaPlayerInit();
private slots:
    /* 播放按钮点击 */
    void btn_play_clicked();
    /* 下一曲按钮点击*/
    void btn_next_clicked();
    /* 上一曲按钮点击 */
    void btn_previous_clicked();
    /* 媒体状态改变 */
    void mediaPlayerStateChanged(QMediaPlayer::State);
    /* 列表单击 */
    void listWidgetCliked(QListWidgetItem*);
    /* 媒体列表项改变 */
    void mediaPlaylistCurrentIndexChanged(int);
    /* 媒体总长度改变 */
    void musicPlayerDurationChanged(qint64);
    /* 媒体播放位置改变 */
    void mediaPlayerPositionChanged(qint64);
    /* 播放进度条松开 */
    void durationSliderReleased();

};
#endif // MUSICWINDOW_H

其他就不放了,可以直接去原子那下

四、天气界面的设置(移植github上)

4.1 weatherdata.h作为天气数据存放

// 存放今天的天气数据
class Today
{
public:
    Today()
    {
        date = "2023-7-28";
        city = "河南";
        ganmao = "感冒指数";
        wendu =  " ";
        shidu = "0%";
        pm25 = 0;
        quality = "无数据";
        type = "多云";
        fl = "2级";
        fx = "南风";
        high = 30;
        low = 18;

    }
    QString date;
    QString city;
    QString ganmao;
    QString wendu;
    QString shidu;
    int pm25;
    QString quality;
    QString type;
    QString fl;
    QString fx;
    int high;
    int low;
};
// 存放未来六天的天气数据
class Day
{
public:
    Day()
    {
        date = "2023-7-28";
        week = "周五";
        type = "多云";
        high = 0;
        low = 0;
        fx = "南风";
        fl = "2级";
        aqi = 0;
    }
    QString date;
    QString week;
    QString type;
    int high;
    int low;
    QString fx;
    QString fl;
    int aqi;
};

4.2 weathertool.h

代码太多了,放部分代码

class WeatherTool
{
private:
    static QMap<QString,QString> mCityMap;

    // 初始化城市名和城市编码的map
    static void initCityMap()
    {
        // 1. 读取文件
        QString filePath = ":/citycode.json"; //城市编码文件
        QFile file(filePath);
        file.open(QIODevice::ReadOnly | QIODevice::Text);
        QByteArray json =  file.readAll();
        file.close();

        // 2. 解析并写入到map中
        QJsonParseError err;
        QJsonDocument doc =  QJsonDocument::fromJson(json,&err);

        if(err.error != QJsonParseError::NoError)
            return;
        if(!doc.isArray())
            return;

        QJsonArray cities = doc.array();
        for(int i=0; i<cities.size(); i++)
        {
            QString city = cities[i].toObject().value("city_name").toString();
            QString code = cities[i].toObject().value("city_code").toString();

            if(code.size()>0)
            {
                mCityMap.insert(city,code);
            }
        }
    }

4.3 weather.h

#include <QMainWindow>
#include <QLabel>
#include <QMainWindow>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QPushButton>
#include "weatherdata.h"

namespace Ui {
class weather;
}

class weather : public QMainWindow
{
    Q_OBJECT

public:
    explicit weather(QWidget *parent = nullptr);
    ~weather();
protected:
    //重写事件,实现单击鼠标右键退出程序
    void contextMenuEvent(QContextMenuEvent* event);
    //获取鼠标按下/移动 时的位置
    void mousePressEvent(QMouseEvent* event);
    void mouseMoveEvent(QMouseEvent* event);

    //用于请求天气数据
    void getWeatherInfo(QString cityCode);

    //解析天气数据
    void parseJson(QByteArray& byteArray);

    //更新UI
    void updateUI();

    //重写父类的eventFilter方法
    bool eventFilter(QObject *watched, QEvent *ev);

    //绘制高低温曲线
    void paintHighCurve();
    void paintLowCurve();

    //天气类型
    void weatherType();

private slots:
    void on_btnSearch_clicked();

    void on_leCity_returnPressed();

private:
    //处理天气数据
    void onReplied(QNetworkReply* reply);
private:
    Ui::weather *ui;
    QMenu* mExitMenu;   // 右键退出的菜单
    QAction* mExitAct;  // 退出的行为
    QPoint mOffset;     // 窗口移动时,鼠标与窗口左上角的偏移
    QNetworkAccessManager* mNetAccessManager; //用于网络请求

    Today mToday; //当天的天气数据
    Day mDay[6];  //未来六天的天气数据

    //控件数组,用于更新UI
    //星期和日期
    QList<QLabel*> mWeekList;
    QList<QLabel*> mDateList;
    //天气和天气图标
    QList<QLabel*> mTypeList;
    QList<QLabel*> mTypeIconList;
    //天气污染指数
    QList<QLabel*> mAqiList;
    //风力和风向
    QList<QLabel*> mFxList;
    QList<QLabel*> mFlList;


    QMap<QString,QString> mTypeMap;
};
  • .ui界面设置
    在这里插入图片描述
    界面做了适当修改,增加了返回按钮,删除了对于鼠标的操作
    加入鼠标操作后会使界面在屏幕里任意移动
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐