Qt5開發(fā)視頻播放器的項(xiàng)目實(shí)踐
一、播放器界面UI設(shè)計(jì)
| 控件對象名 | 位置(坐標(biāo)點(diǎn)) | 對象名稱 | 組件名稱 | 備注 |
|---|---|---|---|---|
| Widget | (0, 0, 809, 572) | Widget | QWidget | |
| label | label | QLabel | 播放窗口 | |
| label_2 | label_2 | QLabel | ||
| voice_control | voice_control | QSlider | 音量滑動(dòng)條 | |
| btn_open | btn_open | QPushButton | 打開文件按鈕 | |
| label_4 | label_4 | QLabel | ||
| label_ct | label_ct | QLabel | ||
| progress_report | progress_report | MySlider | 當(dāng)前播放進(jìn)度標(biāo)簽 | |
| label_all_time | label_all_time | QLabel | 視頻時(shí)長標(biāo)簽 | |
| btn_ht | btn_ht | QPushButton | 后退按鈕 | |
| btn_qj | btn_qj | QPushButton | 前進(jìn)按鈕 | |
| btn_start | btn_start | QPushButton | 播放按鈕 / 暫停按鈕 | |
| btn_fullshow | btn_fullshow | QPushButton | 全屏播放按鈕 | |
| label_5 | label_5 | QLabel | 顯示播放列表文本 | |
| listWidget | listWidget | QListWidget | 播放列表 |
效果圖如下

二、播放器基本實(shí)現(xiàn)
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QMediaPlayer> //播放器
#include <QVideoWidget> //播放窗口
#include <QMediaPlaylist>//播放列表
#include <QString>
#include <QFileDialog>//文件窗口
#include <QDebug>
#include <QResizeEvent>
#include <QMouseEvent>
#include <QKeyEvent>
#include <QListWidgetItem>
#include <QObject>
#include <QAbstractEventDispatcher>
#include "globalkeyfilter.h"
namespace Ui
{
class Widget;
}
class QMediaPlayer;
class QMediaPlaylist;
class QVideoWidget;
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget* parent = 0);
void setget_Alltime(qint64 playtime);//獲取視頻時(shí)長并設(shè)置到標(biāo)簽
void setget_currenttime(qint64 playtime);//獲取當(dāng)時(shí)播放位置并設(shè)置
void settimeslider(qint64 playtime);//設(shè)置進(jìn)度條
void exitFullScreen(); // 退出全屏
void togglePlayback(); // 暫停/播放
~Widget();
private slots:
void on_btn_open_clicked();//打開音視頻
void on_btn_start_clicked();//播放
void on_voice_control_valueChanged(int value);//控制聲音
void on_btn_fullshow_clicked();//全屏顯示
void getduration(qint64 playtime); //獲取時(shí)間改變信號
void getposition(qint64 playtime); //獲取當(dāng)前播放位置
void on_btn_ht_clicked();//上一個(gè)音視頻
void on_btn_qj_clicked();//下一個(gè)音視頻
void on_listWidget_doubleClicked(const QModelIndex& index);
private:
Ui::Widget* ui;
QStringList m_strlist; //文件名列表
QMediaPlayer* m_pMediaPlayer; //播放器
QVideoWidget* m_pVideoWidget; //播放窗口
QMediaPlaylist* m_MediaPlaylist; //播放列表
QMediaPlayer::State m_state; //播放狀態(tài)
int m_hour; //視頻總時(shí)長
int m_munete; //分鐘
int m_second; //秒
bool m_sliderstate; //滑塊是否被選中的狀態(tài)
int m_slider_crtval; //滑塊當(dāng)前值
GlobalKeyFilter* m_globalKeyFilter; // GlobalKeyFilter 類
};
#endif // WIDGET_H將label組件傳入QVideoWidget作為實(shí)例化參數(shù),即可獲得播放窗口,并通過QMediaPlayer調(diào)用setVideoOutput函數(shù),指定為播放器窗口。
三、自定義滑塊控件
#ifndef MYSLIDER_H
#define MYSLIDER_H
#include <QMouseEvent>
#include <QSlider>
class MySlider : public QSlider
{
Q_OBJECT
public:
explicit MySlider(QWidget* parent = nullptr);
protected:
void mousePressEvent(QMouseEvent* ev);
void mouseReleaseEvent(QMouseEvent* ev);
signals:
void mousepress(int value);
void mouserelease(int value);
};
#endif // MYSLIDER_H由于進(jìn)度條數(shù)值和視頻時(shí)長的單位不統(tǒng)一,需要自定義控件MySlider,監(jiān)聽鍵盤事件,發(fā)送計(jì)算得到的視頻時(shí)長數(shù)據(jù)到Widget類的匿名槽函數(shù)中,完成滑動(dòng)條功能。
四、全局鍵盤監(jiān)聽事件
創(chuàng)建一個(gè)GlobalKeyFilter類,對widget類向前聲明,實(shí)現(xiàn)全局的鍵盤監(jiān)聽。
#include "globalkeyfilter.h"
#include "widget.h"
#include <QKeyEvent>
#include <Windows.h>
GlobalKeyFilter::GlobalKeyFilter(Widget* widget) : m_widget(widget)
{
qDebug() << "鍵盤監(jiān)聽事件啟動(dòng)了" << "\n";
}
bool GlobalKeyFilter::nativeEventFilter(const QByteArray& eventType, void* message, long* result)
{
if (eventType == "windows_generic_MSG")
{
MSG* msg = static_cast<MSG*>(message);
if (msg->message == WM_KEYDOWN)
{
int key = msg->wParam;
// 處理 ESC 鍵
if (key == VK_ESCAPE)
{
if (m_widget)
{
m_widget->exitFullScreen();
}
}
// 處理空格鍵
if (key == VK_SPACE)
{
m_widget->togglePlayback();
}
}
}
// 返回 false 以便繼續(xù)傳遞事件
return false;
}到此這篇關(guān)于Qt5開發(fā)視頻播放器的文章就介紹到這了,更多相關(guān)Qt5開發(fā)視頻播放器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VC++?2019?"const?char*"類型的實(shí)參與"LPCTSTR"
這篇文章主要給大家介紹了關(guān)于VC++?2019?"const?char*"類型的實(shí)參與"LPCTSTR"類型的形參不兼容的解決方法,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-03-03
輸入一個(gè)字符串,取出其中的整數(shù)(實(shí)現(xiàn)代碼)
輸入一個(gè)字符串,內(nèi)含所有數(shù)字和非數(shù)字字符。將其中連續(xù)的數(shù)字作為一個(gè)整數(shù),依次存放到一個(gè)數(shù)組中,統(tǒng)計(jì)共有多少個(gè)整數(shù),并輸出這些數(shù)2013-09-09
QT實(shí)現(xiàn)將兩個(gè)時(shí)間相加的算法[hh:?mm?+?hh:?mm]的示例代碼
本文主要介紹了QT實(shí)現(xiàn)將兩個(gè)時(shí)間相加的算法[hh:?mm?+?hh:?mm]的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
C#將Unicode編碼轉(zhuǎn)換為漢字字符串的簡單方法
下面小編就為大家?guī)硪黄狢#將Unicode編碼轉(zhuǎn)換為漢字字符串的簡單方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01
C++?計(jì)算時(shí)間差的五種方法小結(jié)
本文主要介紹了C++?計(jì)算時(shí)間差的五種方法小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04

