赞
踩
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
/*
/* 创建了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
/*
/* 创建了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
/*
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年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合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%以上嵌入式&物联网开发知识点,真正体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。