Qt5開發(fā)視頻播放器的項目實踐
一、播放器界面UI設(shè)計
控件對象名 | 位置(坐標點) | 對象名稱 | 組件名稱 | 備注 |
---|---|---|---|---|
Widget | (0, 0, 809, 572) | Widget | QWidget | |
label | label | QLabel | 播放窗口 | |
label_2 | label_2 | QLabel | ||
voice_control | voice_control | QSlider | 音量滑動條 | |
btn_open | btn_open | QPushButton | 打開文件按鈕 | |
label_4 | label_4 | QLabel | ||
label_ct | label_ct | QLabel | ||
progress_report | progress_report | MySlider | 當前播放進度標簽 | |
label_all_time | label_all_time | QLabel | 視頻時長標簽 | |
btn_ht | btn_ht | QPushButton | 后退按鈕 | |
btn_qj | btn_qj | QPushButton | 前進按鈕 | |
btn_start | btn_start | QPushButton | 播放按鈕 / 暫停按鈕 | |
btn_fullshow | btn_fullshow | QPushButton | 全屏播放按鈕 | |
label_5 | label_5 | QLabel | 顯示播放列表文本 | |
listWidget | listWidget | QListWidget | 播放列表 |
效果圖如下
二、播放器基本實現(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è)置到標簽 void setget_currenttime(qint64 playtime);//獲取當時播放位置并設(shè)置 void settimeslider(qint64 playtime);//設(shè)置進度條 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); //獲取時間改變信號 void getposition(qint64 playtime); //獲取當前播放位置 void on_btn_ht_clicked();//上一個音視頻 void on_btn_qj_clicked();//下一個音視頻 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; //視頻總時長 int m_munete; //分鐘 int m_second; //秒 bool m_sliderstate; //滑塊是否被選中的狀態(tài) int m_slider_crtval; //滑塊當前值 GlobalKeyFilter* m_globalKeyFilter; // GlobalKeyFilter 類 }; #endif // WIDGET_H
將label組件傳入QVideoWidget
作為實例化參數(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
由于進度條數(shù)值和視頻時長的單位不統(tǒng)一,需要自定義控件MySlider
,監(jiān)聽鍵盤事件,發(fā)送計算得到的視頻時長數(shù)據(jù)到Widget
類的匿名槽函數(shù)中,完成滑動條功能。
四、全局鍵盤監(jiān)聽事件
創(chuàng)建一個GlobalKeyFilter
類,對widget
類向前聲明,實現(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)聽事件啟動了" << "\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)文章
C++獲得本機所有網(wǎng)卡的IP和MAC地址信息的實現(xiàn)方法
下面小編就為大家?guī)硪黄狢++獲得本機所有網(wǎng)卡的IP和MAC地址信息的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10C語言編程數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)詳解小白篇
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ),非常適合初學(xué)數(shù)據(jù)結(jié)構(gòu)的小白,有需要的朋友可以借鑒參考下,希望可以有所幫助,祝大家多多進步,早日升職加薪2021-09-09C++實現(xiàn)LeetCode(83.移除有序鏈表中的重復(fù)項)
這篇文章主要介紹了C++實現(xiàn)LeetCode(83.移除有序鏈表中的重復(fù)項),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07