基于IMX6ULL的智能车载终端项目(代码开源)_imx6ull 开源 linux 项目 车载终端(1)

durationSlider->setObjectName("durationSlider");

/* 音乐列表 */
listWidget = new QListWidget();
listWidget->setObjectName("listWidget");
listWidget->resize(310, 265);
listWidget->setVerticalScrollBarPolicy(
            Qt::ScrollBarAlwaysOff);
listWidget->setHorizontalScrollBarPolicy(
            Qt::ScrollBarAlwaysOff);

/* 列表遮罩 */
listMask = new QWidget(listWidget);
listMask->setMinimumSize(310, 50);
listMask->setMinimumHeight(50);
listMask->setObjectName("listMask");
listMask->setGeometry(0,
                      listWidget->height() - 50,
                      310,
                      50);


/* 设置对象名称 */
pushButton[0]->setObjectName("btn_previous");
pushButton[1]->setObjectName("btn_play");
pushButton[2]->setObjectName("btn_next");
pushButton[3]->setObjectName("btn_favorite");
pushButton[4]->setObjectName("btn_mode");
pushButton[5]->setObjectName("btn_menu");
pushButton[6]->setObjectName("btn_volume");

/* 设置按钮属性 */
pushButton[1]->setCheckable(true);
pushButton[3]->setCheckable(true);

/* H0布局 */
vWidget[0]->setMinimumSize(310, 480);
vWidget[0]->setMaximumWidth(310);
vWidget[1]->setMinimumSize(320, 480);
QSpacerItem *hSpacer0 = new
        QSpacerItem(70, 480,
                    QSizePolicy::Minimum,
                    QSizePolicy::Maximum);

QSpacerItem *hSpacer1 = new
        QSpacerItem(65, 480,
                    QSizePolicy::Minimum,
                    QSizePolicy::Maximum);

QSpacerItem *hSpacer2 = new
        QSpacerItem(60, 480,
                    QSizePolicy::Minimum,
                    QSizePolicy::Maximum);

hBoxLayout[0]->addSpacerItem(hSpacer0);
hBoxLayout[0]->addWidget(vWidget[0]);
hBoxLayout[0]->addSpacerItem(hSpacer1);
hBoxLayout[0]->addWidget(vWidget[1]);
hBoxLayout[0]->addSpacerItem(hSpacer2);
hBoxLayout[0]->setContentsMargins(0, 0, 0, 0);

hWidget[0]->setLayout(hBoxLayout[0]);
setCentralWidget(hWidget[0]);

/* V0布局 */
listWidget->setMinimumSize(310, 265);
hWidget[1]->setMinimumSize(310, 80);
hWidget[1]->setMaximumHeight(80);
label[0]->setMinimumSize(310, 95);
label[0]->setMaximumHeight(95);
QSpacerItem *vSpacer0 = new
        QSpacerItem(310, 10,
                    QSizePolicy::Minimum,
                    QSizePolicy::Maximum);
QSpacerItem *vSpacer1 = new
        QSpacerItem(310, 30,
                    QSizePolicy::Minimum,
                    QSizePolicy::Minimum);
vBoxLayout[0]->addWidget(label[0]);
vBoxLayout[0]->addWidget(listWidget);
vBoxLayout[0]->addSpacerItem(vSpacer0);
vBoxLayout[0]->addWidget(hWidget[1]);
vBoxLayout[0]->addSpacerItem(vSpacer1);
vBoxLayout[0]->setContentsMargins(0, 0, 0, 0);

vWidget[0]->setLayout(vBoxLayout[0]);

/* H1布局 */
for (int i = 0; i < 3; i++) {
    pushButton[i]->setMinimumSize(80, 80);
}
QSpacerItem *hSpacer3 = new
        QSpacerItem(40, 80,
                    QSizePolicy::Expanding,
                    QSizePolicy::Expanding);
QSpacerItem *hSpacer4 = new
        QSpacerItem(40, 80,
                    QSizePolicy::Expanding,
                    QSizePolicy::Expanding);
hBoxLayout[1]->addWidget(pushButton[0]);
hBoxLayout[1]->addSpacerItem(hSpacer3);
hBoxLayout[1]->addWidget(pushButton[1]);
hBoxLayout[1]->addSpacerItem(hSpacer4);
hBoxLayout[1]->addWidget(pushButton[2]);
hBoxLayout[1]->setContentsMargins(0, 0, 0, 0);

hWidget[1]->setLayout(hBoxLayout[1]);

/* V1布局 */
QSpacerItem *vSpacer2 = new
        QSpacerItem(320, 40,
                    QSizePolicy::Minimum,
                    QSizePolicy::Maximum);
QSpacerItem *vSpacer3 = new
        QSpacerItem(320, 20,
                    QSizePolicy::Minimum,
                    QSizePolicy::Maximum);
QSpacerItem *vSpacer4 = new
        QSpacerItem(320, 30,
                    QSizePolicy::Minimum,
                    QSizePolicy::Minimum);
label[1]->setMinimumSize(320, 320);
QImage Image;
Image.load(":/images/cd.png");
QPixmap pixmap = QPixmap::fromImage(Image);
int with = 320;
int height = 320;
QPixmap fitpixmap =
        pixmap.scaled(with, height,
                      Qt::IgnoreAspectRatio,
                      Qt::SmoothTransformation);
label[1]->setPixmap(fitpixmap);
label[1]->setAlignment(Qt::AlignCenter);
vWidget[2]->setMinimumSize(300, 80);
vWidget[2]->setMaximumHeight(80);
vBoxLayout[1]->addSpacerItem(vSpacer2);
vBoxLayout[1]->addWidget(label[1]);
vBoxLayout[1]->addSpacerItem(vSpacer3);
vBoxLayout[1]->addWidget(durationSlider);
vBoxLayout[1]->addWidget(vWidget[2]);
vBoxLayout[1]->addSpacerItem(vSpacer4);
vBoxLayout[1]->setContentsMargins(0, 0, 0, 0);

vWidget[1]->setLayout(vBoxLayout[1]);

/* V2布局 */
QSpacerItem *vSpacer5 = new
        QSpacerItem(300, 10,
                    QSizePolicy::Minimum,
                    QSizePolicy::Maximum);
hWidget[2]->setMinimumSize(320, 20);
hWidget[3]->setMinimumSize(320, 60);
vBoxLayout[2]->addWidget(hWidget[2]);
vBoxLayout[2]->addSpacerItem(vSpacer5);
vBoxLayout[2]->addWidget(hWidget[3]);
vBoxLayout[2]->setContentsMargins(0, 0, 0, 0);

vWidget[2]->setLayout(vBoxLayout[2]);

/* H2布局 */
QFont font;

font.setPixelSize(10);

/* 设置标签文本 */
label[0]->setText("Q Music,Enjoy it!");
label[2]->setText("00:00");
label[3]->setText("00:00");
label[2]->setSizePolicy(QSizePolicy::Expanding,
                        QSizePolicy::Expanding);
label[3]->setSizePolicy(QSizePolicy::Expanding,
                        QSizePolicy::Expanding);
label[3]->setAlignment(Qt::AlignRight);
label[2]->setAlignment(Qt::AlignLeft);
label[2]->setFont(font);
label[3]->setFont(font);

pal.setColor(QPalette::WindowText, Qt::white);
label[0]->setPalette(pal);
label[2]->setPalette(pal);
label[3]->setPalette(pal);

hBoxLayout[2]->addWidget(label[2]);
hBoxLayout[2]->addWidget(label[3]);

hBoxLayout[2]->setContentsMargins(0, 0, 0, 0);
hWidget[2]->setLayout(hBoxLayout[2]);

/* H3布局 */
QSpacerItem *hSpacer5 = new
        QSpacerItem(0, 60,
                    QSizePolicy::Minimum,
                    QSizePolicy::Maximum);
QSpacerItem *hSpacer6 = new
        QSpacerItem(80, 60,
                    QSizePolicy::Maximum,
                    QSizePolicy::Maximum);
QSpacerItem *hSpacer7 = new
        QSpacerItem(80, 60,
                    QSizePolicy::Maximum,
                    QSizePolicy::Maximum);
QSpacerItem *hSpacer8 = new
        QSpacerItem(80, 60,
                    QSizePolicy::Maximum,
                    QSizePolicy::Maximum);
QSpacerItem *hSpacer9 = new
        QSpacerItem(0, 60,
                    QSizePolicy::Minimum,
                    QSizePolicy::Maximum);

for (int i = 3; i < 7; i++) {
    pushButton[i]->setMinimumSize(25, 25);
    pushButton[i]->setMaximumSize(25, 25);
}

hBoxLayout[3]->addSpacerItem(hSpacer5);
hBoxLayout[3]->addWidget(pushButton[3]);
hBoxLayout[3]->addSpacerItem(hSpacer6);
hBoxLayout[3]->addWidget(pushButton[4]);
hBoxLayout[3]->addSpacerItem(hSpacer7);
hBoxLayout[3]->addWidget(pushButton[5]);
hBoxLayout[3]->addSpacerItem(hSpacer8);
hBoxLayout[3]->addWidget(pushButton[6]);
hBoxLayout[3]->addSpacerItem(hSpacer9);
hBoxLayout[3]->setContentsMargins(0, 0, 0, 0);
hBoxLayout[3]->setAlignment(Qt::AlignHCenter);

hWidget[3]->setLayout(hBoxLayout[3]);

//hWidget[0]->setStyleSheet("background-color:red");
//hWidget[1]->setStyleSheet("background-color:#ff5599");
//hWidget[2]->setStyleSheet("background-color:#ff55ff");
//hWidget[3]->setStyleSheet("background-color:black");
//vWidget[0]->setStyleSheet("background-color:#555555");
//vWidget[1]->setStyleSheet("background-color:green");
//vWidget[2]->setStyleSheet("background-color:gray");

}

MainWindow::~MainWindow()
{
}

void MainWindow::btn_play_clicked()
{
int state = musicPlayer->state();

switch (state) {
case QMediaPlayer::StoppedState:
    /* 媒体播放 */
    musicPlayer->play();
    break;

case QMediaPlayer::PlayingState:
    /* 媒体暂停 */
    musicPlayer->pause();
    break;

case QMediaPlayer::PausedState:
    musicPlayer->play();
    break;
}

}

void MainWindow::btn_next_clicked()
{
musicPlayer->stop();
int count = mediaPlaylist->mediaCount();
if (0 == count)
return;

/* 列表下一个 */
mediaPlaylist->next();
musicPlayer->play();

}

void MainWindow::btn_previous_clicked()
{
musicPlayer->stop();
int count = mediaPlaylist->mediaCount();
if (0 == count)
return;

/* 列表上一个 */
mediaPlaylist->previous();
musicPlayer->play();

}

void MainWindow::mediaPlayerStateChanged(
QMediaPlayer::State
state)
{
switch (state) {
case QMediaPlayer::StoppedState:
pushButton[1]->setChecked(false);
break;

case QMediaPlayer::PlayingState:
    pushButton[1]->setChecked(true);
    break;

case QMediaPlayer::PausedState:
    pushButton[1]->setChecked(false);
    break;
}

}

void MainWindow::listWidgetCliked(QListWidgetItem *item)
{
musicPlayer->stop();
mediaPlaylist->setCurrentIndex(listWidget->row(item));
musicPlayer->play();
}

void MainWindow::mediaPlaylistCurrentIndexChanged(
int index)
{
if (-1 == index)
return;

/* 设置列表正在播放的项 */
listWidget->setCurrentRow(index);

}

void MainWindow::musicPlayerDurationChanged(
qint64 duration)
{
durationSlider->setRange(0, duration / 1000);
int second = duration / 1000;
int minute = second / 60;
second %= 60;

QString mediaDuration;
mediaDuration.clear();

if (minute >= 10)
    mediaDuration = QString::number(minute, 10);
else
    mediaDuration = "0" + QString::number(minute, 10);

if (second >= 10)
    mediaDuration = mediaDuration
            + ":" + QString::number(second, 10);
else
    mediaDuration = mediaDuration
            + ":0" + QString::number(second, 10);

/* 显示媒体总长度时间 */
label[3]->setText(mediaDuration);

}

void MainWindow::mediaPlayerPositionChanged(
qint64 position)
{
if (!durationSlider->isSliderDown())
durationSlider->setValue(position/1000);

int second  = position / 1000;
int minute = second / 60;
second %= 60;

QString mediaPosition;
mediaPosition.clear();

if (minute >= 10)
    mediaPosition = QString::number(minute, 10);
else
    mediaPosition = "0" + QString::number(minute, 10);

if (second >= 10)
    mediaPosition = mediaPosition
            + ":" + QString::number(second, 10);
else
    mediaPosition = mediaPosition
            + ":0" + QString::number(second, 10);

/* 显示现在播放的时间 */
label[2]->setText(mediaPosition);

}

void MainWindow::resizeEvent(QResizeEvent *event)
{
Q_UNUSED(event);
listMask->setGeometry(0,
listWidget->height() - 50,
310,
50);
}

void MainWindow::durationSliderReleased()
{
/* 设置媒体播放的位置 */
musicPlayer->setPosition(durationSlider->value() * 1000);
}

void MainWindow::scanSongs()
{
QDir dir(QCoreApplication::applicationDirPath()
+ “/myMusic”);
QDir dirbsolutePath(dir.absolutePath());
/* 如果目录存在 /
if (dirbsolutePath.exists()) {
/
定义过滤器 /
QStringList filter;
/
包含所有.mp3后缀的文件 /
filter << "
.mp3";
/* 获取该目录下的所有文件 /
QFileInfoList files =
dirbsolutePath.entryInfoList(filter, QDir::Files);
/
遍历 /
for (int i = 0; i < files.count(); i++) {
MediaObjectInfo info;
/
使用utf-8编码 /
QString fileName = QString::fromUtf8(files.at(i)
.fileName()
.replace(“.mp3”, “”)
.toUtf8()
.data());
info.fileName = fileName + “\n”
+ fileName.split(“-”).at(1);
info.filePath = QString::fromUtf8(files.at(i)
.filePath()
.toUtf8()
.data());
/
媒体列表添加歌曲 /
if (mediaPlaylist->addMedia(
QUrl::fromLocalFile(info.filePath))) {
/
添加到容器数组里储存 /
mediaObjectInfo.append(info);
/
添加歌曲名字至列表 */
listWidget->addItem(info.fileName);
} else {
qDebug()<<
mediaPlaylist->errorString()
.toUtf8().data()
<< endl;
qDebug()<< " Error number:"
<< mediaPlaylist->error()
<< endl;
}
}
}
}

void MainWindow::mediaPlayerInit()
{
musicPlayer = new QMediaPlayer(this);
mediaPlaylist = new QMediaPlaylist(this);
/* 确保列表是空的 /
mediaPlaylist->clear();
/
设置音乐播放器的列表为mediaPlaylist /
musicPlayer->setPlaylist(mediaPlaylist);
/
设置播放模式,Loop是列循环 */
mediaPlaylist->setPlaybackMode(QMediaPlaylist::Loop);
}



> 
> 上述代码就是常规的 QT 页面布局以及操作函数和信号,代码参考了正点原子的教程。特别需要注意的地方是需要在 QMusic 的功能页中加入退出按钮,即切换至其父进程!具体如下图:
> 
> 
> 


![](https://img-blog.csdnimg.cn/4d083ba535c547938e37d0cab4e7ec04.png)


**运行结果:**


![](https://img-blog.csdnimg.cn/3261e58da26f4963866dd626d922b1d9.png)


### 3.2 QVideo视频播放器


视频播放器依旧是各家嵌入式机构QT练习的常规项目,与音乐播放器一样使用 **QMediaPlayer** 类,不同的是需要使用 **setVideoOutput(QVideoWidget\*)** 设置一个视频输出窗口,好让视频在此窗口显示,其他步骤基本都一样。


★在项目文件 **15\_videoplayer.pro** 文件第一行添加的代码:**multimedia multimediawidgets**


![](https://img-blog.csdnimg.cn/76e9c9059230493792f5515fc75e2c25.png)


在头文件 **“mainwindow.h”** 具体代码如下



#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

/* 媒体信息结构体 /
struct MediaObjectInfo {
/
用于保存视频文件名 /
QString fileName;
/
用于保存视频文件路径 */
QString filePath;
};

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();

private:
/* 媒体播放器,用于播放视频 */
QMediaPlayer *videoPlayer;

/* 媒体列表 */
QMediaPlaylist *mediaPlaylist;

/* 视频显示窗口 */
QVideoWidget *videoWidget;

/* 视频列表 */
QListWidget *listWidget;

/* 播放进度条 */
QSlider *durationSlider;

/* 音量条 */
QSlider *volumeSlider;

/* 视频播放器按钮 */
QPushButton *pushButton[5];

QPushButton *exit_button;

/* 水平布局 */
QHBoxLayout *hBoxLayout[3];

/* 水平容器 */
QWidget *hWidget[3];

/* 标签文本 */
QLabel *label[2];

/* 垂直容器 */
QWidget *vWidget[2];

/* 垂直界面 */
QVBoxLayout *vBoxLayout[2];

/* 视频布局函数 */
void videoLayout();

/* 主窗体大小重设大小函数重写 */
void resizeEvent(QResizeEvent *event);

/* 媒体信息存储 */
QVector<MediaObjectInfo> mediaObjectInfo;

/* 扫描本地视频文件 */
void scanVideoFiles();

/* 媒体初始化 */
void mediaPlayerInit();

private slots:
/* 播放按钮点击 */
void btn_play_clicked();

/* 下一个视频按钮点击 */
void btn_next_clicked();

/* 音量加 */
void btn_volmeup_clicked();

/* 音量减 */
void btn_volmedown_clicked();

/* 全屏 */
void btn_fullscreen_clicked();

/* 媒体状态改变 */
void mediaPlayerStateChanged(QMediaPlayer::State);

/* 列表单击 */
void listWidgetCliked(QListWidgetItem*);

/* 媒体列表项改变 */
void mediaPlaylistCurrentIndexChanged(int);

/* 媒体总长度改变 */
void musicPlayerDurationChanged(qint64);

/* 媒体播放位置改变 */
void mediaPlayerPositionChanged(qint64);

/* 播放进度条松开 */
void durationSliderReleased();

/* 音量条松开 */
void volumeSliderReleased();

};
#endif // MAINWINDOW_H


在源文件**“mainwindow.cpp”**具体代码如下:



#include “mainwindow.h”
#include
#include
#include
#include

QProcess * mypro;
MainWindow::MainWindow(QWidget parent)
: QMainWindow(parent)
{
/
视频播放器布局初始化 */
videoLayout();

/* 媒体初始化 */
mediaPlayerInit();

/* 扫描本地视频 */
scanVideoFiles();

/* 设置按钮的属性 */
pushButton[0]->setCheckable(true);
pushButton[4]->setCheckable(true);

/* 按钮连接信号槽 */
connect(pushButton[0], SIGNAL(clicked()),
        this, SLOT(btn_play_clicked()));
connect(pushButton[1], SIGNAL(clicked()),
        this, SLOT(btn_next_clicked()));
connect(pushButton[2], SIGNAL(clicked()),
        this, SLOT(btn_volmedown_clicked()));
connect(pushButton[3], SIGNAL(clicked()),
        this, SLOT(btn_volmeup_clicked()));
connect(pushButton[4], SIGNAL(clicked()),
        this, SLOT(btn_fullscreen_clicked()));

/* 列表连接信号槽 */
connect(listWidget, SIGNAL(itemClicked(QListWidgetItem*)),
        this, SLOT(listWidgetCliked(QListWidgetItem*)));

/* 媒体连接信号槽 */
connect(videoPlayer,
        SIGNAL(stateChanged(QMediaPlayer::State)),
        this,
        SLOT(mediaPlayerStateChanged(QMediaPlayer::State)));
connect(mediaPlaylist,
        SIGNAL(currentIndexChanged(int)),
        this,
        SLOT(mediaPlaylistCurrentIndexChanged(int)));
connect(videoPlayer, SIGNAL(durationChanged(qint64)),
        this,
        SLOT(musicPlayerDurationChanged(qint64)));
connect(videoPlayer,
        SIGNAL(positionChanged(qint64)),
        this,
        SLOT(mediaPlayerPositionChanged(qint64)));

/* slider信号槽连接 */
connect(durationSlider, SIGNAL(sliderReleased()),
        this, SLOT(durationSliderReleased()));
connect(volumeSlider, SIGNAL(sliderReleased()),
        this, SLOT(volumeSliderReleased()));

/* 退出按钮 */
exit_button = new QPushButton(this);
exit_button->setMinimumSize(60, 50);
exit_button->setMaximumSize(60, 50);
exit_button->move(740,10);
exit_button->setStyleSheet("QPushButton{background: black}");

connect(exit_button,&QPushButton::clicked,[=](){
    mypro->close();
    exit(1);//退出程序
});

}

MainWindow::~MainWindow()
{
}

void MainWindow::videoLayout()
{
/* 设置位置与大小,这里固定为800, 480 */
this->setGeometry(0, 0, 800, 480);
// this->setMinimumSize(800, 480);
// this->setMaximumSize(800, 480);
QPalette pal;
pal.setColor(QPalette::WindowText, Qt::white);

for (int i = 0; i < 3; i++) {
    /* 水平容器 */
    hWidget[i] = new QWidget();
    hWidget[i]->setAutoFillBackground(true);
    /* 水平布局 */
    hBoxLayout[i] = new QHBoxLayout();
}

for (int i = 0; i < 2; i++) {
    /* 垂直容器 */
    vWidget[i] = new QWidget();
    vWidget[i]->setAutoFillBackground(true);
    /* 垂直布局 */
    vBoxLayout[i] = new QVBoxLayout();
}

for (int i = 0; i < 2; i++) {
    label[i] = new QLabel();
}

for (int i = 0; i < 5; i++) {
    pushButton[i] = new QPushButton();
    pushButton[i]->setMaximumSize(44, 44);
    pushButton[i]->setMinimumSize(44, 44);
}

/* 设置 */
vWidget[0]->setObjectName("vWidget0");
vWidget[1]->setObjectName("vWidget1");
hWidget[1]->setObjectName("hWidget1");
hWidget[2]->setObjectName("hWidget2");
pushButton[0]->setObjectName("btn_play");
pushButton[1]->setObjectName("btn_next");
pushButton[2]->setObjectName("btn_volumedown");
pushButton[3]->setObjectName("btn_volumeup");
pushButton[4]->setObjectName("btn_screen");

QFont font;

font.setPixelSize(18);
label[0]->setFont(font);
label[1]->setFont(font);

pal.setColor(QPalette::WindowText, Qt::white);
label[0]->setPalette(pal);
label[1]->setPalette(pal);

label[0]->setText("00:00");
label[1]->setText("/00:00");

durationSlider = new QSlider(Qt::Horizontal);
durationSlider->setMaximumHeight(15);
durationSlider->setObjectName("durationSlider");

volumeSlider = new QSlider(Qt::Horizontal);
volumeSlider->setRange(0, 100);
volumeSlider->setMaximumWidth(80);
volumeSlider->setObjectName("volumeSlider");
volumeSlider->setValue(50);

listWidget = new QListWidget();
listWidget->setObjectName("listWidget");
listWidget->setVerticalScrollBarPolicy(
            Qt::ScrollBarAlwaysOff);
listWidget->setHorizontalScrollBarPolicy(
            Qt::ScrollBarAlwaysOff);
//listWidget->setFocusPolicy(Qt::NoFocus);
videoWidget = new QVideoWidget();
videoWidget->setStyleSheet("border-image: none;"
                           "background: transparent;"
                           "border:none");

/* H0布局 */
vWidget[0]->setMinimumSize(300, 480);
vWidget[0]->setMaximumWidth(300);
videoWidget->setMinimumSize(500, 480);

hBoxLayout[0]->addWidget(videoWidget);
hBoxLayout[0]->addWidget(vWidget[0]);

hWidget[0]->setLayout(hBoxLayout[0]);
hBoxLayout[0]->setContentsMargins(0, 0, 0, 0);

setCentralWidget(hWidget[0]);

/* V0布局 */
QSpacerItem *vSpacer0 = new
        QSpacerItem(0, 80,
                    QSizePolicy::Minimum,
                    QSizePolicy::Maximum);
vBoxLayout[0]->addWidget(listWidget);
vBoxLayout[0]->addSpacerItem(vSpacer0);
vBoxLayout[0]->setContentsMargins(0, 0, 0, 0);

vWidget[0]->setLayout(vBoxLayout[0]);

/* V1布局 */
/* 底板部件布局 */
hWidget[1]->setMaximumHeight(15);
hWidget[2]->setMinimumHeight(65);
vBoxLayout[1]->addWidget(hWidget[1]);
vBoxLayout[1]->addWidget(hWidget[2]);
vBoxLayout[1]->setAlignment(Qt::AlignCenter);

vWidget[1]->setLayout(vBoxLayout[1]);
vWidget[1]->setParent(this);
vWidget[1]->setGeometry(0, this->height() - 80, this->width(), 80);
vBoxLayout[1]->setContentsMargins(0, 0, 0, 0);
/* 位于最上层 */
vWidget[1]->raise();

/* H1布局 */
hBoxLayout[1]->addWidget(durationSlider);
hBoxLayout[1]->setContentsMargins(0, 0, 0, 0);
hWidget[1]->setLayout(hBoxLayout[1]);

/* H2布局 */
QSpacerItem *hSpacer0 = new
        QSpacerItem(300, 80,
                    QSizePolicy::Expanding,
                    QSizePolicy::Maximum);

hBoxLayout[2]->addSpacing(20);
hBoxLayout[2]->addWidget(pushButton[0]);
hBoxLayout[2]->addSpacing(10);
hBoxLayout[2]->addWidget(pushButton[1]);
hBoxLayout[2]->addSpacing(10);
hBoxLayout[2]->addWidget(pushButton[2]);
hBoxLayout[2]->addWidget(volumeSlider);
hBoxLayout[2]->addWidget(pushButton[3]);
hBoxLayout[2]->addWidget(label[0]);
hBoxLayout[2]->addWidget(label[1]);
hBoxLayout[2]->addSpacerItem(hSpacer0);
hBoxLayout[2]->addWidget(pushButton[4]);
hBoxLayout[2]->addSpacing(20);
hBoxLayout[2]->setContentsMargins(0, 0, 0, 0);
hBoxLayout[2]->setAlignment(Qt::AlignLeft | Qt::AlignTop);

hWidget[2]->setLayout(hBoxLayout[2]);

}

void MainWindow::mediaPlayerInit()
{
videoPlayer = new QMediaPlayer(this);
mediaPlaylist = new QMediaPlaylist(this);
/* 确保列表是空的 /
mediaPlaylist->clear();
/
设置视频播放器的列表为mediaPlaylist /
videoPlayer->setPlaylist(mediaPlaylist);
/
设置视频输出窗口 /
videoPlayer->setVideoOutput(videoWidget);
/
设置播放模式,Loop是列循环 /
mediaPlaylist->setPlaybackMode(QMediaPlaylist::Loop);
/
设置默认软件音量为50% */
videoPlayer->setVolume(50);
}

void MainWindow::resizeEvent(QResizeEvent *event)
{
Q_UNUSED(event);
vWidget[1]->setGeometry(0, this->height() - 80, this->width(), 80);
}

void MainWindow::btn_play_clicked()
{
int state = videoPlayer->state();
switch (state) {
case QMediaPlayer::StoppedState:
/* 媒体播放 */
videoPlayer->play();
break;

case QMediaPlayer::PlayingState:
    /* 媒体暂停 */
    videoPlayer->pause();
    break;

case QMediaPlayer::PausedState:
    /* 设置视频输出窗口 */
    videoPlayer->play();
    break;
}

}

void MainWindow::btn_next_clicked()
{
videoPlayer->stop();
int count = mediaPlaylist->mediaCount();
if (0 == count)
return;

/* 列表下一个 */
mediaPlaylist->next();
videoPlayer->play();

}

void MainWindow::btn_volmeup_clicked()
{
/* 点击每次音量+5 */
volumeSlider->setValue(volumeSlider->value() + 5);
videoPlayer->setVolume(volumeSlider->value());
}

void MainWindow::btn_fullscreen_clicked()
{
/* 全屏/非全屏操作 */
vWidget[0]->setVisible(!pushButton[4]->isChecked());
}

void MainWindow::btn_volmedown_clicked()
{
/* 点击每次音量-5 */
volumeSlider->setValue(volumeSlider->value() - 5);
videoPlayer->setVolume(volumeSlider->value());
}

void MainWindow::mediaPlayerStateChanged(
QMediaPlayer::State
state)
{
switch (state) {
case QMediaPlayer::StoppedState:
pushButton[0]->setChecked(false);
break;

case QMediaPlayer::PlayingState:
    pushButton[0]->setChecked(true);
    break;

case QMediaPlayer::PausedState:
    pushButton[0]->setChecked(false);
    break;
}

}

void MainWindow::listWidgetCliked(QListWidgetItem *item)
{
videoPlayer->stop();
mediaPlaylist->setCurrentIndex(listWidget->row(item));
videoPlayer->play();
}

void MainWindow::mediaPlaylistCurrentIndexChanged(
int index)
{
if (-1 == index)
return;

/* 设置列表正在播放的项 */
listWidget->setCurrentRow(index);

}

void MainWindow::musicPlayerDurationChanged(
qint64 duration)
{
durationSlider->setRange(0, duration / 1000);
int second = duration / 1000;
int minute = second / 60;
second %= 60;

QString mediaDuration;
mediaDuration.clear();

if (minute >= 10)
    mediaDuration = QString::number(minute, 10);
else
    mediaDuration = "0" + QString::number(minute, 10);

if (second >= 10)
    mediaDuration = mediaDuration
            + ":" + QString::number(second, 10);
else
    mediaDuration = mediaDuration
            + ":0" + QString::number(second, 10);

/* 显示媒体总长度时间 */
label[1]->setText("/" + mediaDuration);

}

void MainWindow::mediaPlayerPositionChanged(
qint64 position)
{
if (!durationSlider->isSliderDown())
durationSlider->setValue(position / 1000);

int second  = position / 1000;
int minute = second / 60;
second %= 60;

QString mediaPosition;
mediaPosition.clear();

if (minute >= 10)
    mediaPosition = QString::number(minute, 10);
else
    mediaPosition = "0" + QString::number(minute, 10);

if (second >= 10)
    mediaPosition = mediaPosition
            + ":" + QString::number(second, 10);
else
    mediaPosition = mediaPosition
            + ":0" + QString::number(second, 10);

/* 显示现在播放的时间 */
label[0]->setText(mediaPosition);

}

void MainWindow::durationSliderReleased()
{
/* 设置媒体播放的位置 */
videoPlayer->setPosition(durationSlider->value() * 1000);
}

void MainWindow::volumeSliderReleased()
{
/* 设置音量 */
videoPlayer->setVolume(volumeSlider->value());
}

void MainWindow::scanVideoFiles()
{
QDir dir(QCoreApplication::applicationDirPath()
+ “/myVideo”);
QDir dirbsolutePath(dir.absolutePath());
/* 如果目录存在 /
if (dirbsolutePath.exists()) {
/
定义过滤器 /
QStringList filter;
/
包含所有xx后缀的文件 /
filter << "
.mp4" << “.mkv" << ".wmv” << “.avi";
/
获取该目录下的所有文件 /
QFileInfoList files =
dirbsolutePath.entryInfoList(filter, QDir::Files);
/
遍历 /
for (int i = 0; i < files.count(); i++) {
MediaObjectInfo info;
/
使用utf-8编码 /
info.fileName = QString::fromUtf8(files.at(i)
.fileName()
.toUtf8()
.data());
info.filePath = QString::fromUtf8(files.at(i)
.filePath()
.toUtf8()
.data());
/
媒体列表添加视频 /
if (mediaPlaylist->addMedia(
QUrl::fromLocalFile(info.filePath))) {
/
添加到容器数组里储存 /
mediaObjectInfo.append(info);
/
添加视频名字至列表 */
listWidget->addItem(info.fileName);
} else {
qDebug()<<
mediaPlaylist->errorString()
.toUtf8().data()
<< endl;
qDebug()<< " Error number:”
<< mediaPlaylist->error()
<< endl;
}
}
}
}



> 
> 与上一小节音乐播放器的一样,在构造函数里布局初始化,然后执行扫描本地视频文件。之后就是一些信号槽的连接,基本上就是这么一个流程了。特别注意:IMX6ULL因为不能进行汉字解码,所以汉字名的 mp4 等格式文件名会变成???,但是不影响程序运行!
> 
> 
> 


**运行结果:**


![](https://img-blog.csdnimg.cn/b2455e3b45034020bc6ef4fcd5a77b52.png)


### 3.3 AP3216C监测



> 
> 本项目作者替换的智能家居 APP 的功能页为 AP3216C 的车载内室监测功能!
> 
> 
> **篇幅有限,AP3216的使用和 QT 功能页设计博客:**[http://t.csdn.cn/cN6p1]( )
> 
> 
> 


**运行结果:**


![](https://img-blog.csdnimg.cn/031f82058ee14194a597096efc3498e6.png)


### 3.4 终端APP切换实现



> 
> **★该部分为本篇博客核心部分,希望读者朋友可以通过这里掌握 Linux+QT 下的多进程操作!**
> 
> 
> 


#### 3.4.1 Picture制作



> 
> 作者一直认为 QT 的灵魂是设计美学,优化流程丝滑方面,功能的实现是非常基础的部分!各别作者可能尝试自己制作一些产品可能没有美工,作者这边提供一种方法!
> 
> 
> 


通过网络选择我们需要的图标和图片信息,使用去在线去背景网站进行去背景操作!


![](https://img-blog.csdnimg.cn/68b8687de2b047f78760bfbcf6c04940.png)


将去背景后的图片导入到 Ubuntu 中,图标大小尽量保持一致(允许存在些许偏差!)


![](https://img-blog.csdnimg.cn/ae9b7cc5c4ff4c568856530239e7efe7.png)


#### 3.4.2 APP功能页制作


考虑到这些 **APP** 图标的功能实现和框架是相似的,作者这里仅以 **QMusic** 为例进行教学!


通过添加**Qt Resource File** 资源放置我们之前准备好的 **APP** 图标!


![](https://img-blog.csdnimg.cn/eebdd89cf0a14706aadcbffc00be6bf8.png)


**1、智能车载终端的时间显示(扫描检测):**



/* 获取屏幕的分辨率,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,400);
#endif

/* 构建布局标题和背景色 */
this->setWindowTitle("智能车载系统");
this->setStyleSheet("background-color: rgb(240, 255, 255);");   //QT颜色标:http://t.csdn.cn/SF7Rc

//给进程分配空间
my_pro = new QProcess(this);

//时间显示label
QLabel *time_label = new QLabel(this);
time_label->setGeometry(10,20,240,100);//设置坐标
//time_label->setStyleSheet("font-size:55px;color:black");//设置大小颜色
time_label->setFont(QFont("Helvetica", 72));
//time_label->ssetFont(QFont("Helvetica", 30)); // 设置字体为Arial,大小为16

//日期显示label
QLabel *date_label = new QLabel(this);
date_label->setGeometry(200,100,240,100);//设置坐标
date_label->setStyleSheet("font-size:25px;color:green");//设置大小颜色

//智能车载装置
QFont font("Arial", 30, QFont::Normal);
QLabel *title_label = new QLabel(this);
title_label->setGeometry(40,180,260,50);//设置坐标
title_label->setFont(font);
title_label->setText("智能车载终端");

m_pLCD = new QLCDNumber(this);
// 设置能显示的位数
m_pLCD->setDigitCount(8);

m_pLCD->setGeometry(20,30,230,100);
// 设置显示的模式为十进制
m_pLCD->setMode(QLCDNumber::Dec);
// 设置样式
m_pLCD->setStyleSheet("border: 1px solid green;font-size:70%;color: green");
m_pLCD->resize(300,100);

//定时器刷新显示
QTimer *timer = new QTimer(this);
timer->start(200);

connect(timer,&QTimer::timeout,[=](){
    /* 获取当前日期 */
    QDate date = QDate::currentDate();//获取当前日期
    QString date_msg = QString("%1-%2-%3").arg(date.year()).arg(date.month()).arg(date.day());
    date_label->setText(date_msg);

    // 获取系统当前时间
    QDateTime dateTime = QDateTime::currentDateTime();
    // 显示的内容
    m_pLCD->display(dateTime.toString("HH:mm:ss"));


    /* 判断进程状态 */
    if(my_pro->state() == QProcess::NotRunning)
    {
        this->show();//重新显示窗口
    }
    else
    {
        this->hide();
    }

});

![](https://img-blog.csdnimg.cn/3f448a0f52f44fbd9fd9021723cf7ee4.png)


上述代码通过 **Q\_Label** 和 **QLCDNumber** 分别创造了普通字体的日期和 “LED数码管” 字体,创造一个 timer,每 **200ms** 触发一次信号,信号中函数进行更新时间!同时关键的是进行检测 my\_pro 进程是否停止运行,如果停止运行就显示当前 this 进程(主菜单进程),否则就隐藏 this 进程!


**2、QMusic 功能按钮操作:**


**menubutton.h:**



#ifndef MENUBUTTON_H
#define MENUBUTTON_H
#include
#include
#include
#include
#include

#include
#include

/*

  • 作者:混分巨兽龙某某
  • csdn:混分巨兽龙某某
  • 邮箱:1178305328@qq.com
  • 嵌入式技术交流群:958820627
    */

/* 创建了MenuButton的类,并且该类继承QPushButton */
class MenuButton : public QPushButton
{
Q_OBJECT

public:
MenuButton(QString normal_path,QString press_path=“”,int pixwidth=10,int pixheight=10);
void zoom1();
void zoom2();

private:
QString normal_path;
QString press_path;
QPropertyAnimation* animation;

protected:
//void mousePressEvent(QMouseEvent * e);
//void mouseReleaseEvent(QMouseEvent * e);

signals:

public slots:
};

#endif // MENUBUTTON_H


通过上述 **menubutton.h**文件,我们创建了一个 **MenuButton** 的类,该类继承了 **QPushButton** 可以作为一个按钮(核心技巧)。我们通过读取 **Qt Resource File** 文件中的 **APP** 图标作为按钮!随后,对 **APP** 按钮进行布局和设置大小!



/* 菜单按钮切屏定时器 */
time1= new QTimer(this);

//音乐按钮
MenuButton * music_button=new MenuButton(":/picture/music.png","",245,245);
music_button->setParent(this);
music_button->move(400,10);
//音乐按钮按下处理
connect(music_button,&MenuButton::clicked,[=](){
    /* 设计动作图标 */
    music_button->zoom1();//弹跳
    music_button->zoom2();
    /* 延迟500ms后启动播放器进程 */
    time1->start(500);
    connect(time1,&QTimer::timeout,[=](){
        time1->stop();
        my_pro->close();
        my_pro->start("./QMusicPlayer");});
 });


> 
> 当用**MenuButton** 类创建了一个 **music\_button** 对象,即 APP 按钮被按下之后触发设定好的函数,**music\_button->zoom1()** 和 **music\_button->zoom2()** 其实就是 APP 按钮的跳动动画(使得车载终端更美化)。开启 **time1**,**500ms** 之后触发信号,关闭 **time1** ,关闭当前**my\_pro** 进程,并将该进程开启成 **QMusicPlayer** 进程!其余的以此类推!
> 
> 
> 



> 
> **我们需要注意的是,start 函数后面的进程名一定要存在当前目录中,且可以在当前设备环境下运行才可以**
> 
> 
> 


![](https://img-blog.csdnimg.cn/714ad18438cf4e5b8f647f3cd9affe7c.png)


#### 3.4. 3 完整代码


**menubutton.h:**



#ifndef MENUBUTTON_H
#define MENUBUTTON_H
#include
#include
#include
#include
#include

#include
#include

/*

  • 作者:混分巨兽龙某某
  • csdn:混分巨兽龙某某
  • 邮箱:1178305328@qq.com
  • 嵌入式技术交流群:958820627
    */

/* 创建了MenuButton的类,并且该类继承QPushButton */
class MenuButton : public QPushButton
{
Q_OBJECT

public:
MenuButton(QString normal_path,QString press_path=“”,int pixwidth=10,int pixheight=10);
void zoom1();
void zoom2();

private:
QString normal_path;
QString press_path;
QPropertyAnimation* animation;

protected:

signals:

public slots:
};

#endif // MENUBUTTON_H


**mainwindow.h:**



#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include
#include
#include
#include

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

/*

  • 作者:混分巨兽龙某某
  • csdn:混分巨兽龙某某
  • 邮箱:1178305328@qq.com
  • 嵌入式技术交流群:958820627
    */

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();

private:
QLCDNumber *m_pLCD;
QProcess *my_pro;
QTimer *time1;

/* 布局初始化 */
void layoutInit();

private slots:
//void onTimeOut();
};
#endif // MAINWINDOW_H


**menubutton.cpp:**



#include “menubutton.h”
#include

MenuButton::MenuButton(QString normal_path,QString press_path,int pixwidth,int pixheight)
{
this->normal_path=normal_path;
this->press_path=press_path;

QPixmap pix;
bool ret = pix.load(this->normal_path);
if(!ret)
{
    qDebug()<<"图片加载失败";
    return ;

}
//设置图片固定大小
this->setFixedSize(pixwidth,pixheight);
//设置不规则图片样式
this->setStyleSheet( "QPushButton{border:0px;}" );
//设置图标
this->setIcon(pix);
//设置图标大小
this->setIconSize(QSize(pixwidth,pixheight));

this->setFocusPolicy(Qt::NoFocus);     //去除虚线边框

animation = new QPropertyAnimation(this,"geometry");

}

void MenuButton::zoom1()
{
//设置动画时间间隔
animation->setDuration(200);
//设置起始位置
animation->setStartValue(QRect(this->x(),this->y()+10,this->width(),this->height()));
//设置结束位置
animation->setEndValue(QRect(this->x(),this->y(),this->width(),this->height()));
//设置弹跳曲线
animation->setEasingCurve(QEasingCurve::OutBounce);
//执行动画
animation->start();
}

void MenuButton::zoom2()
{
//设置动画时间间隔
animation->setDuration(200);
//设置起始位置
animation->setStartValue(QRect(this->x(),this->y(),this->width(),this->height()));
//设置结束位置
animation->setEndValue(QRect(this->x(),this->y()-10,this->width(),this->height()));

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

ocus); //去除虚线边框

animation = new QPropertyAnimation(this,"geometry");

}

void MenuButton::zoom1()
{
//设置动画时间间隔
animation->setDuration(200);
//设置起始位置
animation->setStartValue(QRect(this->x(),this->y()+10,this->width(),this->height()));
//设置结束位置
animation->setEndValue(QRect(this->x(),this->y(),this->width(),this->height()));
//设置弹跳曲线
animation->setEasingCurve(QEasingCurve::OutBounce);
//执行动画
animation->start();
}

void MenuButton::zoom2()
{
//设置动画时间间隔
animation->setDuration(200);
//设置起始位置
animation->setStartValue(QRect(this->x(),this->y(),this->width(),this->height()));
//设置结束位置
animation->setEndValue(QRect(this->x(),this->y()-10,this->width(),this->height()));

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-MLveSyvB-1715682715669)]

[外链图片转存中…(img-YyjASdOz-1715682715671)]

[外链图片转存中…(img-SSneZ7zY-1715682715671)]

[外链图片转存中…(img-78p199i6-1715682715672)]

[外链图片转存中…(img-9iyNrwKX-1715682715672)]

[外链图片转存中…(img-OZhsy6XO-1715682715673)]

[外链图片转存中…(img-871CqI4l-1715682715674)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值