- 设计Qt界面
- 实现播放、暂停、停止、下一集、上一集、快进、后退、倍速播放、进度调节,音量调节、视频播放列表等功能
先上演示效果:
ui界面设计
videoplayer.h
#ifndef VIDEOPLAYER_H
#define VIDEOPLAYER_H#pragma execution_character_set("utf-8")
#include <QDialog>#include <QMainWindow>
#include <QMediaPlayer>
#include <QMediaPlaylist>
#include <QVideoWidget>
#include <QGraphicsVideoItem>
#include <QFileDialog>
#include <QGraphicsScene>
#include <QMessageBox>
#include <QListWidgetItem>
#include <QTimer>QT_BEGIN_NAMESPACE
namespace Ui { class VideoPlayer; }
QT_END_NAMESPACEclass VideoPlayer : public QMainWindow
{Q_OBJECT
public:public:VideoPlayer(QWidget *parent = nullptr);~VideoPlayer();private:Ui::VideoPlayer *ui;private:QMediaPlayer *player;QGraphicsVideoItem *videoItem;QString durationtime,positiontime;QTimer * timer;int maxValue = 100;//设置进度条的最大值 qint64 dur;qint64 pos;bool isLoop = false;QMediaPlaylist *mediaPlaylist;QString openFilePath;int curIndex = -1;int OriginWidth;QList<QString> videoList;private slots://初始化窗口void initWidget();//媒体初始化void mediaPlayerInit();//自定义槽函数
// void onStateChanged(QMediaPlayer::State state);// 视频总长度void onDurationChanged(qint64 duration);// 当前位置void onPositionChanged(qint64 position);void on_timeout();void on_TimeSlider_sliderPressed();void on_TimeSlider_sliderMoved(int position);void on_TimeSlider_sliderReleased();//点击进度条触发的槽函数void sliderClicked();void volumeSliderClicked();void MediaPlayClicked();//循环和顺序播放图标的label点击void labelClicked();void MediaFastForwardClicked();void MediaDrawBackClicked();void volumeClicked();void listLabelClicked();void openVideoClicked();void on_volumeSlider_sliderMoved(int position);void seekForward();void seekBackward();void on_comboBox_speed_currentIndexChanged(int index);void setPlaySpeed(double speed); //设置播放速度void getData(QList<QString> videoList,int curIndex);void preLabelClicked();//上一集void nextLabelClicked();//下一集void playVideo(QString openFilePath);//播放视频signals:int sendCurIndex(int);//发送curIndex
};
#endif // VIDEOPLAYER_H
videoplayer.cpp
#include "videoplayer.h"
#include "ui_videoplayer.h"
#include <QTime>
#include <QDebug>#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "Mylabel.h"VideoPlayer::VideoPlayer(QWidget *parent): QMainWindow(parent), ui(new Ui::VideoPlayer)
{ui->setupUi(this);//固定窗口尺寸(以用户设计窗口为准)setFixedSize(width(),height());initWidget(); // 初始化窗口mediaPlayerInit(); // 媒体播放初始化//定时器,用于获取视频当前播放时间,毫秒值this->timer = new QTimer(this);//定时器connect(timer,&QTimer::timeout,this,&VideoPlayer::on_timeout);/* 媒体连接信号槽 */connect(player,SIGNAL(positionChanged(qint64)),this,SLOT(onPositionChanged(qint64)));//connect(player,SIGNAL(stateChanged(QMediaPlayer::State)),this,SLOT(onStateChanged(QMediaPlayer::State)));connect(player, SIGNAL(durationChanged(qint64)), this, SLOT(onDurationChanged(qint64)));//视频持续时间,毫秒值 mediaPlayer->duration()可以直接获取/* 视频进度条和音量调节*///自定义的信号costomSliderClicked()connect(ui->TimeSlider,SIGNAL(costomSliderClicked()),this,SLOT(sliderClicked()));connect(ui->volumeSlider,SIGNAL(costomSliderClicked()),this,SLOT(volumeSliderClicked()));/* 图标连接信号槽 自定义的信号clicked()*/connect(ui->openVideoLabel,SIGNAL(clicked()),this,SLOT(openVideoClicked()));//打开文件 connect(ui->playMode,SIGNAL(clicked()),this,SLOT(labelClicked()));//循环播放connect(ui->preLabel,SIGNAL(clicked()),this,SLOT(preLabelClicked()));//上一集connect(ui->nextLabel,SIGNAL(clicked()),this,SLOT(nextLabelClicked()));//下一集connect(ui->accelerateLabel,SIGNAL(clicked()),this,SLOT(MediaFastForwardClicked())); //快进connect(ui->moderateLabel,SIGNAL(clicked()),this,SLOT(MediaDrawBackClicked()));//后退connect(ui->playVideoLabel,SIGNAL(clicked()),this,SLOT(MediaPlayClicked()));//播放/暂停connect(ui->volumeLabel,SIGNAL(clicked()),this,SLOT(volumeClicked()));//小喇叭设置静音/声音connect(ui->listLabel,SIGNAL(clicked()),this,SLOT(listLabelClicked()));//展开视频列表//视频播放列表widget向主界面发送信号,主界面与其连接,获取数据connect(ui->widget,SIGNAL(sendData(QList<QString>,int)),this,SLOT(getData(QList<QString>,int)));
}VideoPlayer::~VideoPlayer()
{delete player;delete mediaPlaylist;delete ui;
}
//
//初始化窗口
void VideoPlayer::initWidget(){/* 视频窗口 */
// videoWidget = new QVideoWidget();
// videoWidget->setStyleSheet("border-image: none;" "background: transparent;""border:none");
// videoWidget->setMinimumSize(500, 480); // 视频窗口大小OriginWidth = width();setWindowOpacity(0.98);QPalette pal = palette();pal.setColor(QPalette::Background, QColor( 230, 230, 250));setPalette(pal);//this->setStyleSheet("background-color:rgba(240,255,255,0.5)");QGraphicsScene * scene = new QGraphicsScene(this);ui->graphicsView->setScene(scene);ui->graphicsView->setBackgroundBrush(QColor(0, 0, 0)); // 设置黑色背景videoItem = new QGraphicsVideoItem;videoItem->setSize(QSize(ui->graphicsView->width(),ui->graphicsView->height()));videoItem->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsPathItem::ItemIsSelectable|QGraphicsItem::ItemIsFocusable);scene->addItem(videoItem);ui->graphicsView->setStyleSheet("border-image: none;" "background: transparent;""border:none");ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // 隐藏垂直滚动条ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // 隐藏水平滚动条//UI控件的样式设计ui->volumeSlider->setStyleSheet("QSlider::groove:horizontal{""border:1px solid skyblue;""background-color:skyblue;""height:10px;""border-radius:5px;""}""QSlider::handle:horizontal{""background:qradialgradient(spread:pad,cx:0.5,cy:0.5,radius:0.5,fx:0.5,fy:0.5,stop:0.7 white,stop:0.8 rgb(140,212,255));""width:20px;""border-radius:10px;""margin-top:-5px;""margin-bottom:-5px;""}""#volumeSlider:sub-page:horizontal{""background:green;""margin:5px;""border-radius:5px;}");ui->TimeSlider->setStyleSheet("QSlider::groove:horizontal{""border:1px solid skyblue;""background-color:skyblue;""height:10px;""border-radius:5px;""}""QSlider::handle:horizontal{""background:qradialgradient(spread:pad,cx:0.5,cy:0.5,radius:0.5,fx:0.5,fy:0.5,stop:0.7 white,stop:0.8 rgb(140,212,255));""width:20px;""border-radius:10px;""margin-top:-5px;""margin-bottom:-5px;""}""#TimeSlider:sub-page:horizontal{""background:green;""margin:5px;""border-radius:5px;}");//打开视频图标QString openFilePath = ":/images/openFile.png";//图标位置自行调整QIcon openFileLabelIcon = QIcon(openFilePath);QPixmap m_openFilelPic = openFileLabelIcon.pixmap(openFileLabelIcon.actualSize(QSize(ui->openVideoLabel->width(), ui->openVideoLabel->height())));//size自行调整ui->openVideoLabel->setPixmap(m_openFilelPic);//设置循环/顺序播放图标QString filePath = ":/images/seqPlay.png";//图标位置自行调整QIcon icon = QIcon(filePath);QPixmap m_pic = icon.pixmap(icon.actualSize(QSize(ui->playMode->width(), ui->playMode->height())));//size自行调整ui->playMode->setPixmap(m_pic);//快进播放图标QString accFilePath = ":/images/accelerate.png";//图标位置自行调整QIcon accIcon = QIcon(accFilePath);QPixmap m_accPic = accIcon.pixmap(accIcon.actualSize(QSize(ui->accelerateLabel->width(), ui->accelerateLabel->height())));//size自行调整ui->accelerateLabel->setPixmap(m_accPic);//小喇叭图标QString volumeFilePath = ":/images/volume.png";//图标位置自行调整QIcon volumeIcon = QIcon(volumeFilePath);QPixmap m_volumePic = volumeIcon.pixmap(volumeIcon.actualSize(QSize(ui->volumeLabel->width(), ui->volumeLabel->height())));//size自行调整ui->volumeLabel->setPixmap(m_volumePic);//后退播放图标QString modFilePath = ":/images/moderate.png";//图标位置自行调整QIcon modIcon = QIcon(modFilePath);QPixmap m_modPic = modIcon.pixmap(modIcon.actualSize(QSize(ui->moderateLabel->width(), ui->moderateLabel->height())));//size自行调整ui->moderateLabel->setPixmap(m_modPic);//暂停播放图标QString playFilePath = ":/images/pause1.png";//图标位置自行调整QIcon playIcon = QIcon(playFilePath);QPixmap m_playPic = playIcon.pixmap(playIcon.actualSize(QSize(ui->playVideoLabel->width(), ui->playVideoLabel->height())));//size自行调整ui->playVideoLabel->setPixmap(m_playPic);//设置上一集图标QString preImagePath = ":/images/pre.png";//图标位置自行调整QIcon preIcon = QIcon(preImagePath);QPixmap m_prePic = preIcon.pixmap(preIcon.actualSize(QSize(ui->preLabel->width(), ui->preLabel->height())));//size自行调整ui->preLabel->setPixmap(m_prePic);//设置下一集图标QString nextImagePath = ":/images/next.png";//图标位置自行调整QIcon nextIcon = QIcon(nextImagePath);QPixmap m_nextPic = nextIcon.pixmap(preIcon.actualSize(QSize(ui->nextLabel->width(), ui->nextLabel->height())));//size自行调整ui->nextLabel->setPixmap(m_nextPic);//视频列表图标QString listLabelFilePath = ":/images/videoList.png";//图标位置自行调整QIcon listLabelIcon = QIcon(listLabelFilePath);QPixmap m_listLabelPic = listLabelIcon.pixmap(listLabelIcon.actualSize(QSize(ui->listLabel->width(), ui->listLabel->height())));//size自行调整ui->listLabel->setPixmap(m_listLabelPic);//初始化不展示视频列表ui->widget->setVisible(false);setFixedSize(ui->graphicsView->width(),height());//设置状态栏的背景颜色ui->statusbar->setStyleSheet("background-color:#F0F8FF;border: transparent;");//设置倍速播放样式ui->comboBox_speed->setStyleSheet("background-color:#FFFAFA;""border-radius: 7px;""border: 1px solid gray;");}//媒体初始化
void VideoPlayer::mediaPlayerInit()
{//视频播放器初始化参数player = new QMediaPlayer(this);//player->setNotifyInterval(2000);mediaPlaylist = new QMediaPlaylist(this); // 播放列表mediaPlaylist->clear();player->setPlaylist(mediaPlaylist);//player->setVideoOutput(videoWidget); // 设置视频输出窗口player->setVideoOutput(videoItem);//mediaPlaylist->setPlaybackMode(QMediaPlaylist::Loop); // 设置播放模式,Loop 是列循环//player->setVolume(50); // 设置默认软件音量为 50%ui->comboBox_speed->setCurrentIndex(2);int index = ui->comboBox_speed->currentIndex();//获得索引qDebug()<<index<<endl;}
//
void VideoPlayer::MediaPlayClicked(){int state = player->state();//获取播放器的状态if(state == QMediaPlayer::PausedState){//暂停player->play();QIcon playIcon = QIcon(":/images/pause1.png");QPixmap m_playPic = playIcon.pixmap(playIcon.actualSize(QSize(ui->playVideoLabel->width(), ui->playVideoLabel->height())));//size自行调整ui->playVideoLabel->setPixmap(m_playPic);}else if(state == QMediaPlayer::PlayingState){//播放中player->pause();QIcon playIcon = QIcon(":/images/pause.png");QPixmap m_playPic = playIcon.pixmap(playIcon.actualSize(QSize(ui->playVideoLabel->width(), ui->playVideoLabel->height())));//size自行调整ui->playVideoLabel->setPixmap(m_playPic);}
}void VideoPlayer::volumeClicked(){bool mte = player->isMuted();player->setMuted(!mte);if(mte){QIcon volumeIcon = QIcon(":/images/volume.png");QPixmap m_volumePic = volumeIcon.pixmap(volumeIcon.actualSize(QSize(ui->volumeLabel->width(), ui->volumeLabel->height())));//size自行调整ui->volumeLabel->setPixmap(m_volumePic);}else{QIcon volumeIcon = QIcon(":/images/mute.png");QPixmap m_volumePic = volumeIcon.pixmap(volumeIcon.actualSize(QSize(ui->volumeLabel->width(), ui->volumeLabel->height())));//size自行调整ui->volumeLabel->setPixmap(m_volumePic);}
}void VideoPlayer::listLabelClicked(){qDebug()<<"切换展示视频播放列表"<<endl;
// qDebug()<<ui->graphicsView->width();
// qDebug()<<OriginWidth<<endl;if(ui->widget->isVisible()){ui->widget->setVisible(false);setFixedSize(ui->graphicsView->width(),height());}else{ui->widget->setVisible(true);setFixedSize(OriginWidth,height());}}void VideoPlayer::openVideoClicked(){QString strCurrentPath = QDir::homePath();//获取系统当前目录QString strDlgTitle = "请选择视频文件";//打开文件对话框标题QString strFilter = "MP4 Files(*.mp4);;WMV(*.wmv);;AVI(*.avi);;All Files(*.*)";//打开视频文件过滤器QString strAllFiles = QFileDialog::getOpenFileName(this,strDlgTitle,strCurrentPath,strFilter);//QMessageBox::information(this,"提示",strAllFiles,QMessageBox::Yes|QMessageBox::No);if(strAllFiles.isEmpty()){QMessageBox::information(this,"错误","打开视频文件失败,请重新检查",QMessageBox::Yes|QMessageBox::No);//QMessageBox::critical(this,"错误","打开视频文件失败,请重新检查",QMessageBox::Yes);return;}QFileInfo FileInfo(strAllFiles);//获取文件信息playVideo(strAllFiles);//播放视频
}
////循环和顺序播放图标的label点击
void VideoPlayer::labelClicked(){QString filePath;if(!isLoop){filePath = ":/images/loopPlay.png";//图标位置自行调整isLoop = true;//mediaPlaylist->setPlaybackMode(QMediaPlaylist::Loop);// 通过设置 播放列表循环 实现循环播放}else{filePath = ":/images/seqPlay.png";//图标位置自行调整isLoop = false;//mediaPlaylist->setPlaybackMode(QMediaPlaylist::Sequential);// 通过设置 播放列表循环 实现循环播放}QIcon icon = QIcon(filePath);QPixmap m_pic = icon.pixmap(icon.actualSize(QSize(ui->playMode->width(), ui->playMode->height())));//size自行调整ui->playMode->setPixmap(m_pic);
}void VideoPlayer::MediaFastForwardClicked(){seekForward();QTime dieTime = QTime::currentTime().addMSecs(1000);while( QTime::currentTime() < dieTime )QCoreApplication::processEvents(QEventLoop::AllEvents, 100);player->play();
}void VideoPlayer::MediaDrawBackClicked(){seekBackward();QTime dieTime = QTime::currentTime().addMSecs(1000);while( QTime::currentTime() < dieTime )QCoreApplication::processEvents(QEventLoop::AllEvents, 100);player->play();
}void VideoPlayer::seekForward()
{qDebug()<<"设置每次点击快进的距离";player->pause();ui->TimeSlider->setValue(ui->TimeSlider->value() + ui->TimeSlider->width()*0.1);qDebug()<<ui->TimeSlider->value();player->setPosition(ui->TimeSlider->value());}
void VideoPlayer::seekBackward()
{qDebug()<<"设置每次点击后退的距离";player->pause();ui->TimeSlider->setValue(ui->TimeSlider->value() - ui->TimeSlider->width()*0.1);player->setPosition(ui->TimeSlider->value());
}//播放器进度条范围
void VideoPlayer::onDurationChanged(qint64 duration){if(duration > 0){ ui->TimeSlider->setEnabled(true);//设置进度条范围ui->TimeSlider->setRange(0,duration);}
}//播放器进度条位置
void VideoPlayer::onPositionChanged(qint64 position){ui->TimeSlider->setValue(position);
}////slider点击事件发生后,改变视频的进度
void VideoPlayer::sliderClicked(){player->setPosition(ui->TimeSlider->value());int state = player->state();//获取播放器的状态if(state == QMediaPlayer::StoppedState){player->play();QString playFilePath = ":/images/pause1.png";QIcon playIcon = QIcon(playFilePath);QPixmap m_playPic = playIcon.pixmap(playIcon.actualSize(QSize(ui->playVideoLabel->width(), ui->playVideoLabel->height())));//size自行调整ui->playVideoLabel->setPixmap(m_playPic);}
}//更新播放时间轴和时间戳
void VideoPlayer::on_timeout()
{ dur = player->duration();//获取到总时长2pos = player->position();//获取当前的播放位置ui->showTime->setText(QTime::fromMSecsSinceStartOfDay(pos).toString("hh:mm:ss")+"/"+QTime::fromMSecsSinceStartOfDay(dur).toString("hh:mm:ss"));/* 播放结束 根据设置的播放模式:循环播放 和 顺序播放 来实现循环/顺序模式的播放 */if(pos == dur && dur!=0){//qDebug()<<"dur"<<dur;if(isLoop){qDebug()<<"结束了...";player->setPosition(0);player->play();QString playFilePath = ":/images/pause1.png";QIcon playIcon = QIcon(playFilePath);QPixmap m_playPic = playIcon.pixmap(playIcon.actualSize(QSize(ui->playVideoLabel->width(), ui->playVideoLabel->height())));//size自行调整ui->playVideoLabel->setPixmap(m_playPic);} else{QString playFilePath = ":/images/pause.png";//图标位置自行调整QIcon playIcon = QIcon(playFilePath);QPixmap m_playPic = playIcon.pixmap(playIcon.actualSize(QSize(ui->playVideoLabel->width(), ui->playVideoLabel->height())));//size自行调整ui->playVideoLabel->setPixmap(m_playPic);}}
}//时间轴: 按下鼠标左键
void VideoPlayer::on_TimeSlider_sliderPressed()
{
// timer->stop();
// qDebug()<<ui->TimeSlider->sliderPosition();
// player->pause();
// player->setPosition(ui->TimeSlider->sliderPosition());//player->setPosition(position*player->duration()/maxValue);qDebug()<<"on_TimeSlider_sliderPressed";int currentValue=ui->TimeSlider->value();qDebug()<<"currentValue"<<currentValue;
}// 时间轴:鼠标移动
void VideoPlayer::on_TimeSlider_sliderMoved(int position)
{ player->pause();//根据滑块的位置设置播放视频的位置player->setPosition(position); //跳转到position 时间点位置//timer->stop();//player->setPosition(ui->TimeSlider->value()*player->duration()/maxValue);
}//时间轴: 鼠标离开
void VideoPlayer::on_TimeSlider_sliderReleased()
{ player->play();
// timer->start();
}//设置volumeSlider
void VideoPlayer::on_volumeSlider_sliderMoved(int position)
{
// qDebug()<<"position:"<<position;player->setVolume(position);
}//slider点击事件发生后,改变视频的进度
void VideoPlayer::volumeSliderClicked(){player->setVolume(ui->volumeSlider->value());qDebug()<<"ui->volumeSlider->value():"<<ui->volumeSlider->value();
// player->setVolume(ui->volumeSlider->value());
// ui->volumeSlider->setValue(ui->volumeSlider->value());
}void VideoPlayer::setPlaySpeed(double speed)
{player->setPlaybackRate(speed); //设置播放速度
}void VideoPlayer::on_comboBox_speed_currentIndexChanged(int index)
{player->pause();if(index == 0) this->setPlaySpeed(0.5);else if(index == 1) this->setPlaySpeed(0.75);else if(index == 2) this->setPlaySpeed(1.0);else if(index == 3) this->setPlaySpeed(1.25);else if(index == 4) this->setPlaySpeed(1.5);else if(index == 5) this->setPlaySpeed(2.0);player->play();
}void VideoPlayer::playVideo(QString openFilePath){player->setMedia(QUrl::fromLocalFile(openFilePath));qDebug()<<"播放视频"<<endl;QString playFilePath = ":/images/pause1.png";QIcon playIcon = QIcon(playFilePath);QPixmap m_playPic = playIcon.pixmap(playIcon.actualSize(QSize(ui->playVideoLabel->width(), ui->playVideoLabel->height())));//size自行调整ui->playVideoLabel->setPixmap(m_playPic);player->play();//启用volumeSlider并设置范围//ui->volumeSlider->setRange(0,maxValue);ui->volumeSlider->setValue(player->volume()/2);player->setVolume(player->volume()/2);//启用slider并设置范围ui->TimeSlider->setEnabled(true);//ui->TimeSlider->setRange(0,maxValue);timer = new QTimer();timer->setInterval(100);//如果想看起来流畅些,可以把时间间隔调小,如100mstimer->start();//将timer连接至onTimerOut槽函数connect(timer, SIGNAL(timeout()), this, SLOT(on_timeout()));
}void VideoPlayer::getData(QList<QString> videoList,int curIndex)
{this->videoList = videoList;this->curIndex = curIndex;this->openFilePath = videoList[curIndex];playVideo(this->openFilePath);
}//上一集
void VideoPlayer::preLabelClicked(){if(this->curIndex>0){this->openFilePath = this->videoList[this->curIndex-1];this->curIndex-=1;qDebug()<<"执行 上一集 操作" << "第" <<this->curIndex <<"集"<<endl;playVideo(this->openFilePath);//播放视频connect(this,SIGNAL(sendCurIndex(int)),ui->widget,SLOT(getCurIndex(int)));//主界面向视频列表发送信号,与其建立连接emit sendCurIndex(this->curIndex);}
}//下一集
void VideoPlayer::nextLabelClicked(){if(this->curIndex<this->videoList.length()-1){this->openFilePath = this->videoList[this->curIndex+1];this->curIndex+=1;qDebug()<<"执行 下一集 操作"<< "第" <<this->curIndex <<"集"<<endl;playVideo(this->openFilePath);//播放视频connect(this,SIGNAL(sendCurIndex(int)),ui->widget,SLOT(getCurIndex(int)));//主界面向视频列表发送信号,与其建立连接emit sendCurIndex(this->curIndex);}
}
videolist.h
#ifndef VIDEOLIST_H
#define VIDEOLIST_H#include <QWidget>
#include <QButtonGroup>
#include <QListWidgetItem>
#include <QDir>
#include <QFileDialog>
#include <QMessageBox>
#include <QDebug>
#include <QtCore>namespace Ui {
class videoList;
}class videoList : public QWidget
{Q_OBJECTpublic:explicit videoList(QWidget *parent = nullptr);~videoList();private:void onRadioButtonClicked(); void onItemClicked(QListWidgetItem* item);void onItemDoubleClicked(QListWidgetItem* item);private slots:void onBtnAddClicked();void onBtnDeleteClicked();void on_videoListWidget_itemDoubleClicked(QListWidgetItem *item);void getCurIndex(int curIndex);
signals:void sendData(QList<QString>,int);private:Ui::videoList *ui;QButtonGroup* mBtnGroup;QList<QString> fileAllList;QList<QString> fileNameAllList;QString openFilePath;bool strOmit = false;
};#endif // VIDEOLIST_H
videolist.cpp
#include "videolist.h"
#include "ui_videolist.h"#include <QRandomGenerator>
QStringList iconStringList = {":/images/apple.png", ":/images/banana.png", ":/images/orange.png", ":/images/peach.png", ":/images/strawberry.png",
};videoList::videoList(QWidget *parent) :QWidget(parent),ui(new Ui::videoList)
{ui->setupUi(this);
// ui->videoListWidget->setFrameShape(QListWidget::NoFrame);//设置显示模式mBtnGroup = new QButtonGroup(this);mBtnGroup->addButton(ui->rb_ListMode,0);mBtnGroup->addButton(ui->rb_IconMode,1);connect(ui->rb_ListMode,&QRadioButton::clicked,this,&videoList::onRadioButtonClicked);connect(ui->rb_IconMode,&QRadioButton::clicked,this,&videoList::onRadioButtonClicked);ui->rb_ListMode->setChecked(true);ui->videoListWidget->setViewMode(QListView::ListMode);//设置按钮的样式ui->btn_Add->setDefault(1);//显示默认选中状态ui->btn_Add->setStyleSheet("background-color:#FFDAB9;border-radius: 4px;border:1px solid gray");ui->btn_Delete->setStyleSheet("background-color:#FFFACD;border-radius: 4px;border:1px solid gray");//设置radioBtn样式ui->rb_ListMode->setStyleSheet("QRadioButton::indicator{width: 20px;height: 20px;image: url(:/images/select.png);}""QRadioButton::indicator::checked{image: url(:/images/select.png);}""QRadioButton::indicator::unchecked{image: url(:/images/noSelect.png);}");ui->rb_IconMode->setStyleSheet("QRadioButton::indicator{width: 20px;height: 20px;image: url(:/images/radioCircleLight.png);}""QRadioButton::indicator::checked{image: url(:/images/radioCircleLight.png);}""QRadioButton::indicator::unchecked{image: url(:/images/radioCircleClose.png);}");//单击和双击信号槽connect(ui->videoListWidget,&QListWidget::itemClicked,this,&videoList::onItemClicked);connect(ui->videoListWidget,&QListWidget::itemDoubleClicked,this,&videoList::onItemDoubleClicked);//add/deleteconnect(ui->btn_Add,&QPushButton::clicked,this,&videoList::onBtnAddClicked);connect(ui->btn_Delete,&QPushButton::clicked,this,&videoList::onBtnDeleteClicked);//不显示行向滚动条,子项文本过长自动显示...ui->videoListWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);ui->videoListWidget->setStyleSheet("QScrollBar{width:10px;background:#0A1626;}");QPalette pal = palette(); pal.setColor(QPalette::Background, QColor(248, 248, 255));this->setPalette(pal);this->show();this->setAutoFillBackground(true);//设置背景颜色ui->videoListWidget->setStyleSheet("background-color:#FFFFFA;""border-radius: 7px;""border:1px solid gray;"); //transparent}videoList::~videoList()
{delete ui;
}void videoList::onRadioButtonClicked()
{int checkedId = mBtnGroup->checkedId();if(checkedId == 0){//列表模式ui->videoListWidget->setViewMode(QListView::ListMode);}else if(checkedId == 1){//图标模式ui->videoListWidget->setViewMode(QListView::IconMode); //设置为自适应ui->videoListWidget->setResizeMode(QListView::Adjust); //设置为自适应ui->videoListWidget->setMovement(QListView::Static); //设置为不可拖动ui->videoListWidget->setUniformItemSizes(true);//ui->videoListWidget->setGridSize(QSize(40, 40));ui->videoListWidget->setWordWrap(true);//超出文本不显示省略号
// ui->videoListWidget->setTextElideMode(Qt::ElideNone);}
}//单击信号槽的时候获取文本
void videoList::onItemClicked(QListWidgetItem *item)
{//ui->selectVideoFile->setText(item->text());QString mStr = item->text(); ui->SelectVideoFile->setText(mStr);QFontMetrics fontMetrics(ui->SelectVideoFile->font());int fontSize = fontMetrics.width(mStr);if (fontSize > ui->SelectVideoFile->width()) {//省略左边的内容(Qt::ElideLeft) 省略中间的内容(Qt::ElideMiddle) 省略中间的内容(Qt::ElideRight)ui->SelectVideoFile->setText(fontMetrics.elidedText(mStr, Qt::ElideMiddle, ui->SelectVideoFile->width()));ui->SelectVideoFile->setToolTip(mStr);} else {ui->SelectVideoFile->setText(mStr);ui->SelectVideoFile->setToolTip("");}
}//双击信号槽的时候变成可编辑的状态
void videoList::onItemDoubleClicked(QListWidgetItem *item)
{item->setFlags(Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsEnabled);
}//添加VideoItem
void videoList::onBtnAddClicked()
{int iconIndex = QRandomGenerator::global()->generate()%5;//获取0-4的随机数QIcon icon(iconStringList[iconIndex]);QString strCurrentPath = QDir::homePath();//获取系统当前目录QString strDlgTitle = "请选择视频文件";//打开文件对话框标题QString strFilter = "MP4 Files(*.mp4);;WMV(*.wmv);;AVI(*.avi);;All Files(*.*)";//打开视频文件过滤器QList<QString> fileList = QFileDialog::getOpenFileNames(this, strDlgTitle, strCurrentPath, strFilter);for (int i= 0;i<fileList.length();i++) {if(fileAllList.indexOf(fileList[i]) == -1){fileAllList.append(fileList[i]);QList<QString> fileNameList = fileList[i].split(".mp4")[0].split("/");qDebug()<<fileNameList[fileNameList.length()-1];QString text = fileNameList[fileNameList.length()-1] + ".mp4";//显示文件名字QListWidgetItem* item = new QListWidgetItem(icon,text);//ui->videoListWidget->addItem(item);/************************ Qt QListWidget项文本过长显示处理 ************************///根据长度判断是否设置ToolTip QFontMetrics fontMetrics(item->font());if (ui->videoListWidget->width() < fontMetrics.width(text)){item->setToolTip(text);text =fontMetrics.elidedText(text, Qt::ElideMiddle, ui->SelectVideoFile->width());}item->setText(text);item->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled);ui->videoListWidget->setIconSize(QSize(30, 30));ui->videoListWidget->addItem(item);
// int currentRow = fileAllList.length() - ui->videoListWidget->currentRow();
// qDebug()<<ui->videoListWidget->currentRow();
// qDebug()<<currentRow;
// ui->videoListWidget->insertItem(currentRow,item);}}qDebug()<<"fileList:"<<fileList;//打印视频文件列表qDebug()<<"fileAllList:"<<fileAllList;//打印视频文件列表
}//删除VideoItem
void videoList::onBtnDeleteClicked()
{int row = ui->videoListWidget->currentRow();qDebug()<<"删除第几行:"<<row;QListWidgetItem *item = ui->videoListWidget->takeItem(row);delete item;ui->SelectVideoFile->setText("");fileAllList.removeAt(row);qDebug()<<"fileAllList:"<<fileAllList;//打印视频文件列表
}void videoList::on_videoListWidget_itemDoubleClicked(QListWidgetItem *item)
{//qDebug()<<"heheda"; int row = ui->videoListWidget->currentRow();//qDebug()<<"选中第几行:"<<row;//openFilePath = fileAllList[row];//qDebug()<<openFilePath<<endl;emit sendData(fileAllList,row);
}void videoList::getCurIndex(int curIndex)
{ui->videoListWidget->setCurrentRow(curIndex);
}
自定义:
customerlabel.h
#ifndef CUSTOMSLIDER_H
#define CUSTOMSLIDER_H#include <QSlider>
#include <QMouseEvent>
#include <QCoreApplication>class CustomSlider : public QSlider
{Q_OBJECT
public:CustomSlider(QWidget *parent = 0) : QSlider(parent){}
protected:void mousePressEvent(QMouseEvent *ev);//重写QSlider的mousePressEvent事件
signals:void costomSliderClicked();//自定义的鼠标单击信号,用于捕获并处理
};#endif // CUSTOMSLIDER_H
customerlabel.cpp
#include "customslider.h"void CustomSlider::mousePressEvent(QMouseEvent *ev)
{//注意应先调用父类的鼠标点击处理事件,这样可以不影响拖动的情况QSlider::mousePressEvent(ev);//获取鼠标的位置,这里并不能直接从ev中取值(因为如果是拖动的话,鼠标开始点击的位置没有意义了)double pos = ev->pos().x() / (double)width();//让进度条直接蹦过来setValue(pos * (maximum() - minimum()) + minimum()); //发送自定义的鼠标单击信号emit costomSliderClicked();
}
mylabel.h
#ifndef MYLABEL_H
#define MYLABEL_H
#include<QLabel>
#include<QString>
#include<QWidget>
#include<QMainWindow>
#include"QMessageBox"class Mylabel:public QLabel
{Q_OBJECT
public:
// Mylabel(const QString &text,QWidget *parent=0);
// ~Mylabel(){}Mylabel(QWidget *parent = 0) : QLabel(parent){}
signals:void clicked();
//public slots:
// void slotClicked();
protected:void mousePressEvent(QMouseEvent* event);};#endif // MYLABEL_H
mylabel.cpp
#include<QLabel>
#include"mylabel.h"
#include"videoplayer.h"//Mylabel::Mylabel(const QString & text,QWidget* parent)
// :QLabel(parent)
//{
// this->setText(text);
// connect(this, SIGNAL(clicked()), this, SLOT(slotClicked()));
//}//void Mylabel::slotClicked()
//{
// QMessageBox::information(NULL, QString::fromLocal8Bit("单击"),
// QString::fromLocal8Bit("马衍硕是不是很帅?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);//}
void Mylabel::mousePressEvent(QMouseEvent* event)
{emit clicked();
}
main.cpp
#include "videoplayer.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);VideoPlayer w;w.show();return a.exec();
}