基於Qt實現視頻播放器功能
一、功能介紹
能實現視頻播放
二、代碼
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> /* 媒體信息結構體 */ 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 *videoListWidget; // 視頻列表 QSlider *playProgressScrollBar; // 播放進度條 QSlider *volumeScrollBar; // 音量條 QPushButton *pushButton[5]; // 視頻播放器按鈕 QHBoxLayout *hBoxLayout[3]; // 水平佈局 QWidget *hWidget[3]; // 水平容器 QLabel *label[2]; // 標簽文本 QWidget *vWidget[2]; // 垂直容器 QVBoxLayout *vBoxLayout[2]; // 垂直佈局 /* 函數 */ public: void initWidget(); // 初始化窗口 void mediaPlayerInit(); // 媒體播放初始化 void scanVideoFiles(); // 掃描本地視頻文件 /* 槽函數 */ public slots: void SltBtnPlayClicked(); // 播放點擊 void SltBtnNextClicked(); // 下一首點擊 void SltBtnVolumeDownClicked(); // 聲音加點擊 void SltBtnVolumeUpClicked(); // 聲音減點擊 void SltBtnFullScreenClicked(); // 全屏點擊 void SltVideoListWidgetCliked(QListWidgetItem*); // 視頻列表點擊 void SltMediaPlaylistCurrentIndexChanged(int); // 媒體當前項改變 void SltMediaPlayerStateChanged(QMediaPlayer::State); // 媒體播放狀態改變 void SltMediaPlayerDurationChanged(qint64); // 媒體時長發生變化 void SltMediaPlayerPositionChanged(qint64); // 媒體當前播放時間發生變化 void SltPlayProgressScrollBarReleased(); // 播放進度條 void SltVolumeScrollBarReleased(); // 音量進度條 void resizeEvent(QResizeEvent *event); }; #endif // MAINWINDOW_H
mainwindow.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); // 設置窗口文字為白色 /* 構造對象 */ 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才能創建中心佈局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 是列循環 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))) { /* 添加到容器數組裡儲存 */ //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(); // 獲取播放的狀態 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(); // 獲取播放列表的視頻個數 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 * 媒體當前項發生改變 選中播放列表 * @param index */ void MainWindow::SltMediaPlaylistCurrentIndexChanged(int index) { if (-1 == index) return; /* 設置列表正在播放的項 */ videoListWidget->setCurrentRow(index); } /** * @brief MainWindow::SltMediaPlayerStateChanged * 媒體播放狀態發生改變 * @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 * 媒體播放時長發生變化 * @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); 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); } /** * @brief MainWindow::SltMediaPlayerPositionChanged * 媒體當前播放時間發生變化 * @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); 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); } /** * @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); /* 以字符串的方式保存讀出的結果 */ 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); }
三、運行
到此這篇關於基於Qt實現視頻播放器功能的文章就介紹到這瞭,更多相關Qt–視頻播放器內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!