Qt--视频播放器
文章目錄
- 一、功能介紹
- 二、代碼
- 三、運行
一、功能介紹
能實現(xiàn)視頻播放
二、代碼
mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QMediaPlayer> #include <QMediaPlaylist> #include <QPushButton> #include <QSlider> #include <QVBoxLayout> #include <QHBoxLayout> #include <QListWidget> #include <QLabel> #include <QSpacerItem> #include <QVideoWidget>/* 媒體信息結(jié)構(gòu)體 */ struct MediaObjectInfo {QString fileName; // 用于保存視頻文件名QString filePath; // 用于保存視頻文件路徑 };class MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();/* 屬性 */ private:QMediaPlayer *videoPlayer; // 媒體播放器,用于播放視頻QMediaPlaylist *mediaPlaylist; // 媒體列表QVideoWidget *videoWidget; // 視頻顯示窗口QListWidget *videoListWidget; // 視頻列表QSlider *playProgressScrollBar; // 播放進度條QSlider *volumeScrollBar; // 音量條QPushButton *pushButton[5]; // 視頻播放器按鈕QHBoxLayout *hBoxLayout[3]; // 水平布局QWidget *hWidget[3]; // 水平容器QLabel *label[2]; // 標簽文本QWidget *vWidget[2]; // 垂直容器QVBoxLayout *vBoxLayout[2]; // 垂直布局 /* 函數(shù) */ public:void initWidget(); // 初始化窗口void mediaPlayerInit(); // 媒體播放初始化void scanVideoFiles(); // 掃描本地視頻文件/* 槽函數(shù) */ public slots:void SltBtnPlayClicked(); // 播放點擊void SltBtnNextClicked(); // 下一首點擊void SltBtnVolumeDownClicked(); // 聲音加點擊void SltBtnVolumeUpClicked(); // 聲音減點擊void SltBtnFullScreenClicked(); // 全屏點擊void SltVideoListWidgetCliked(QListWidgetItem*); // 視頻列表點擊void SltMediaPlaylistCurrentIndexChanged(int); // 媒體當前項改變void SltMediaPlayerStateChanged(QMediaPlayer::State); // 媒體播放狀態(tài)改變void SltMediaPlayerDurationChanged(qint64); // 媒體時長發(fā)生變化void SltMediaPlayerPositionChanged(qint64); // 媒體當前播放時間發(fā)生變化void SltPlayProgressScrollBarReleased(); // 播放進度條void SltVolumeScrollBarReleased(); // 音量進度條void resizeEvent(QResizeEvent *event); }; #endif // MAINWINDOW_Hmainwindow.cpp
#include "mainwindow.h" #include <QCoreApplication> #include <QDir>QString videoFilePath = "/home/luatao/qt/videoplayer/myVideo";MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) {initWidget(); // 初始化窗口mediaPlayerInit(); // 媒體播放初始化scanVideoFiles(); // 掃描本地視頻/* 按鈕連接信號槽 */connect(pushButton[0], SIGNAL(clicked()), this, SLOT(SltBtnPlayClicked())); // 播放connect(pushButton[1], SIGNAL(clicked()),this, SLOT(SltBtnNextClicked())); // 下一首connect(pushButton[2], SIGNAL(clicked()), this, SLOT(SltBtnVolumeDownClicked())); // 聲音減connect(pushButton[3], SIGNAL(clicked()), this, SLOT(SltBtnVolumeUpClicked())); // 聲音加connect(pushButton[4], SIGNAL(clicked()),this, SLOT(SltBtnFullScreenClicked())); // 全屏/* 列表連接信號槽 */connect(videoListWidget, SIGNAL(itemClicked(QListWidgetItem*)),this, SLOT(SltVideoListWidgetCliked(QListWidgetItem*)));/* 媒體連接信號槽 */connect(mediaPlaylist,SIGNAL(currentIndexChanged(int)),this,SLOT(SltMediaPlaylistCurrentIndexChanged(int)));connect(videoPlayer,SIGNAL(stateChanged(QMediaPlayer::State)),this,SLOT(SltMediaPlayerStateChanged(QMediaPlayer::State)));connect(videoPlayer, SIGNAL(durationChanged(qint64)),this,SLOT(SltMediaPlayerDurationChanged(qint64)));connect(videoPlayer,SIGNAL(positionChanged(qint64)), this,SLOT(SltMediaPlayerPositionChanged(qint64)));/* 滾動條連接 */connect(playProgressScrollBar, SIGNAL(sliderReleased()), this, SLOT(SltPlayProgressScrollBarReleased()));connect(volumeScrollBar, SIGNAL(sliderReleased()),this, SLOT(SltVolumeScrollBarReleased())); }MainWindow::~MainWindow() { }/*** @brief Widget::initWidget* 初始化窗口*/ void MainWindow::initWidget() {this->setGeometry(0, 0, 800, 480);QPalette pal;pal.setColor(QPalette::WindowText, Qt::white); // 設置窗口文字為白色/* 構(gòu)造對象 */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);}/* 設置按鈕的屬性 */pushButton[0]->setCheckable(true); // 播放pushButton[4]->setCheckable(true); // 全屏/* 設置樣式名 */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");/* 播放進度條 */playProgressScrollBar = new QSlider(Qt::Horizontal); // 水平方向playProgressScrollBar->setMaximumHeight(15);playProgressScrollBar->setObjectName("durationSlider");/* 聲音滾動條 */volumeScrollBar = new QSlider(Qt::Horizontal);volumeScrollBar->setRange(0, 100);volumeScrollBar->setMaximumWidth(80);volumeScrollBar->setObjectName("volumeSlider");volumeScrollBar->setValue(50); // 中間值/* 視頻列表 */videoListWidget = new QListWidget();videoListWidget->setObjectName("listWidget");videoListWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // 隱藏垂直滾動條videoListWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // 隱藏水平滾動條/* 視頻窗口 */videoWidget = new QVideoWidget();videoWidget->setStyleSheet("border-image: none;" "background: transparent;""border:none");videoWidget->setMinimumSize(500, 480); // 視頻窗口大小/* 下面是界面布局 *//* H0 布局 */vWidget[0]->setMinimumSize(300, 480);vWidget[0]->setMaximumWidth(300);hBoxLayout[0]->addWidget(videoWidget); // 視頻窗口 左邊hBoxLayout[0]->addWidget(vWidget[0]); // 右邊 垂直窗口hWidget[0]->setLayout(hBoxLayout[0]);hBoxLayout[0]->setContentsMargins(0, 0, 0, 0);setCentralWidget(hWidget[0]); // 只有Qmainwindow才能創(chuàng)建中心布局Qwidget不行/* V0 布局 */QSpacerItem *vSpacer0 = new QSpacerItem(0, 80,QSizePolicy::Minimum,QSizePolicy::Maximum);vBoxLayout[0]->addWidget(videoListWidget); // 添加視頻列表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(playProgressScrollBar); // 播放進度條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(volumeScrollBar);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]); }/*** @brief MainWindow::mediaPlayerInit* 媒體初始化*/ void MainWindow::mediaPlayerInit() {videoPlayer = new QMediaPlayer(this);mediaPlaylist = new QMediaPlaylist(this); // 播放列表mediaPlaylist->clear();videoPlayer->setPlaylist(mediaPlaylist);videoPlayer->setVideoOutput(videoWidget); // 設置視頻輸出窗口mediaPlaylist->setPlaybackMode(QMediaPlaylist::Loop); // 設置播放模式,Loop 是列循環(huán)videoPlayer->setVolume(50); // 設置默認軟件音量為 50% }/*** @brief MainWindow::scanVideoFiles* 掃描視頻文件*/ void MainWindow::scanVideoFiles() { // QDir dir(QCoreApplication::applicationDirPath()+ "/myVideo");QDir dir(videoFilePath); // 視頻文件路徑QDir dirbsolutePath(dir.absolutePath()); // 絕對路徑 // qDebug() << dirbsolutePath << endl;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))) {/* 添加到容器數(shù)組里儲存 *///mediaObjectInfo.append(info);/* 添加視頻名字至列表 */videoListWidget->addItem(info.fileName);} else {qDebug()<<mediaPlaylist->errorString().toUtf8().data()<< endl;qDebug()<< " Error number:"<< mediaPlaylist->error()<< endl;}}}else{qDebug()<< "目錄不存在 "<< endl;} } /*** @brief MainWindow::SltBtnPlayClicked* 播放點擊*/ void MainWindow::SltBtnPlayClicked() {int state = videoPlayer->state(); // 獲取播放的狀態(tài)switch (state) {case QMediaPlayer::StoppedState:/* 媒體播放 */videoPlayer->play();break;case QMediaPlayer::PlayingState:/* 媒體暫停 */videoPlayer->pause();break;case QMediaPlayer::PausedState:videoPlayer->play();break;} }/*** @brief MainWindow::SltBtnNextClicked* 下一首點擊*/ void MainWindow::SltBtnNextClicked() {videoPlayer->stop(); // 停止播放int count = mediaPlaylist->mediaCount(); // 獲取播放列表的視頻個數(shù)if (0 == count)return;/* 列表下一個 */mediaPlaylist->next();videoPlayer->play(); }/*** @brief MainWindow::SltBtnVolumeDownClicked* 聲音減點擊*/ void MainWindow::SltBtnVolumeDownClicked() {/* 點擊每次音量-5 */volumeScrollBar->setValue(volumeScrollBar->value() - 5);videoPlayer->setVolume(volumeScrollBar->value()); } /*** @brief MainWindow::SltBtnVolumeUpClicked* 聲音加點擊*/ void MainWindow::SltBtnVolumeUpClicked() {/* 點擊每次音量+5 */volumeScrollBar->setValue(volumeScrollBar->value() + 5);videoPlayer->setVolume(volumeScrollBar->value()); }/*** @brief MainWindow::SltBtnFullScreenClicked* 全屏點擊*/ void MainWindow::SltBtnFullScreenClicked() {/* 全屏/非全屏操作 */vWidget[0]->setVisible(!pushButton[4]->isChecked()); }/*** @brief MainWindow::SltVideoListWidgetCliked* 視頻列表點擊* @param item*/ void MainWindow::SltVideoListWidgetCliked(QListWidgetItem *item) {videoPlayer->stop();mediaPlaylist->setCurrentIndex(videoListWidget->row(item)); // 選中點擊的項videoPlayer->play(); }/*** @brief MainWindow::SltMediaPlaylistCurrentIndexChanged* 媒體當前項發(fā)生改變 選中播放列表* @param index*/ void MainWindow::SltMediaPlaylistCurrentIndexChanged(int index) {if (-1 == index)return;/* 設置列表正在播放的項 */videoListWidget->setCurrentRow(index); }/*** @brief MainWindow::SltMediaPlayerStateChanged* 媒體播放狀態(tài)發(fā)生改變* @param state*/ void MainWindow::SltMediaPlayerStateChanged(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;} } /*** @brief MainWindow::SltMediaPlayerDurationChanged* 媒體播放時長發(fā)生變化* @param duration*/ void MainWindow::SltMediaPlayerDurationChanged(qint64 duration) {playProgressScrollBar->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);elsemediaDuration = "0" + QString::number(minute, 10);if (second >= 10)mediaDuration = mediaDuration + ":" + QString::number(second, 10);elsemediaDuration = mediaDuration + ":0" + QString::number(second, 10);/* 顯示媒體總長度時間 */label[1]->setText("/" + mediaDuration); } /*** @brief MainWindow::SltMediaPlayerPositionChanged* 媒體當前播放時間發(fā)生變化* @param position*/ void MainWindow::SltMediaPlayerPositionChanged(qint64 position) {if (!playProgressScrollBar->isSliderDown()) // 進度條沒有按下playProgressScrollBar->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);elsemediaPosition = "0" + QString::number(minute, 10);if (second >= 10)mediaPosition = mediaPosition + ":" + QString::number(second, 10);elsemediaPosition = mediaPosition + ":0" + QString::number(second, 10);/* 顯示現(xiàn)在播放的時間 */label[0]->setText(mediaPosition); } /*** @brief MainWindow::SltPlayProgressScrollBarReleased* 播放進度條釋放*/ void MainWindow::SltPlayProgressScrollBarReleased() {/* 設置媒體播放的位置 */videoPlayer->setPosition(playProgressScrollBar->value() * 1000); } /*** @brief MainWindow::SltVolumeScrollBarReleased* 音量進度條釋放*/ void MainWindow::SltVolumeScrollBarReleased() {/* 設置音量 */videoPlayer->setVolume(volumeScrollBar->value()); } /*** @brief MainWindow::resizeEvent* 重繪窗口* @param event*/ void MainWindow::resizeEvent(QResizeEvent *event) {Q_UNUSED(event);vWidget[1]->setGeometry(0, this->height() - 80, this->width(), 80); }main.cpp
#include "mainwindow.h"#include <QApplication> #include <QFile>int main(int argc, char *argv[]) {QApplication a(argc, argv);/* 指定文件 */QFile file(":/style.qss");/* 判斷文件是否存在 */if (file.exists() ) {/* 以只讀的方式打開 */file.open(QFile::ReadOnly);/* 以字符串的方式保存讀出的結(jié)果 */QString styleSheet = QLatin1String(file.readAll());/* 設置全局樣式 */qApp->setStyleSheet(styleSheet);/* 關閉文件 */file.close();}MainWindow w;w.show();return a.exec(); }style.qss
QWidget {border-image:url(:/images/bg.png); }QLabel {border-image:none; }QWidget#hWidget1 {border-image:none;background:transparent; }QWidget#hWidget2 {border-image:none;background:transparent; }QWidget#vWidget1 {border-image:url(:/images/mask.png);background:#24252a; }QWidget#vWidget0 {border-image:none; }QListWidget#listWidget {color:white;font-size: 15px;border:none;background: "#20ffffff";border-image:none; }QListWidgetlistWidget:item:active {background: transparent; }QListWidget#listWidget:item {background: transparent;height:60; }QListWidget#listWidget:item:selected {color:#5edcf3;background: transparent; }QListWidget#listWidget:item:hover {background: transparent;color:#5edcf3;border:none; }QPushButton#btn_play {border-image:url(:/icons/btn_play1.png); }QPushButton#btn_play:hover {border-image:url(:/icons/btn_play2.png); }QPushButton#btn_play:checked {border-image:url(:/icons/btn_pause1.png); }QPushButton#btn_play:checked:hover {border-image:url(:/icons/btn_pause2.png); }QPushButton#btn_next {border-image:url(:/icons/btn_next1.png); }QPushButton#btn_next:hover {border-image:url(:/icons/btn_next2.png); }QPushButton#btn_volumedown {border-image:url(:/icons/btn_volumedown1.png); }QPushButton#btn_volumedown:hover {border-image:url(:/icons/btn_volumedown2.png); }QPushButton#btn_volumeup {border-image:url(:/icons/btn_volumeup1.png); }QPushButton#btn_volumeup:hover {border-image:url(:/icons/btn_volumeup2.png); }QSlider#durationSlider:handle:horizontal {border-image:url(:/icons/handle.png); }QSlider#durationSlider {border-image:none; }QSlider#durationSlider:add-page:horizontal {border-image:url(:/images/add_page.png); }QSlider#volumeSlider {border-image:none; } QSlider#volumeSlider:handle:horizontal {border-image:url(:/icons/handle.png); }QSlider#volumeSlider:handle:horizontal {background:transparent; }QSlider#volumeSlider:add-page:horizontal {border-image:url(:/images/add_page.png); }QPushButton#btn_screen {border-image:url(:/icons/btn_fullscreen1.png); }QPushButton#btn_screen:hover {border-image:url(:/icons/btn_fullscreen2.png); }QPushButton#btn_screen:checked {border-image:url(:/icons/btn_screen1.png); }QPushButton#btn_screen:checked:hover {border-image:url(:/icons/btn_screen2.png); }三、運行
總結(jié)
- 上一篇: 前端学习(1580):初始react
- 下一篇: 前端学习(1858)vue之电商管理系统