123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363 |
- /**
- * 叶海辉
- * QQ群121376426
- * http://blog.yundiantech.com/
- */
- #include "MainWindow.h"
- #include "ui_MainWindow.h"
- #include <QPainter>
- #include <QPaintEvent>
- #include <QFileDialog>
- #include <QDebug>
- #include <QDesktopWidget>
- #include <QFontDatabase>
- #include <QMouseEvent>
- #include <QMessageBox>
- #include "AppConfig.h"
- #include "Base/FunctionTransfer.h"
- Q_DECLARE_METATYPE(VideoPlayerState)
- MainWindow::MainWindow(QWidget *parent) :
- DragAbleWidget(parent),
- ui(new Ui::MainWindow)
- {
- ui->setupUi(this->getContainWidget());
- FunctionTransfer::init(QThread::currentThreadId());
- ///初始化播放器
- VideoPlayer::initPlayer();
- setWindowFlags(Qt::FramelessWindowHint);//|Qt::WindowStaysOnTopHint); //使窗口的标题栏隐藏
- setAttribute(Qt::WA_TranslucentBackground);
- //因为VideoPlayer::PlayerState是自定义的类型 要跨线程传递需要先注册一下
- qRegisterMetaType<VideoPlayerState>();
- connect(ui->pushButton_open, &QPushButton::clicked, this, &MainWindow::slotBtnClick);
- connect(ui->toolButton_open, &QPushButton::clicked, this, &MainWindow::slotBtnClick);
- connect(ui->pushButton_play, &QPushButton::clicked, this, &MainWindow::slotBtnClick);
- connect(ui->pushButton_pause,&QPushButton::clicked, this, &MainWindow::slotBtnClick);
- connect(ui->pushButton_stop, &QPushButton::clicked, this, &MainWindow::slotBtnClick);
- connect(ui->pushButton_volume, &QPushButton::clicked, this, &MainWindow::slotBtnClick);
- connect(ui->horizontalSlider, SIGNAL(sig_valueChanged(int)), this, SLOT(slotSliderMoved(int)));
- connect(ui->horizontalSlider_volume, SIGNAL(valueChanged(int)), this, SLOT(slotSliderMoved(int)));
- ui->page_video->setMouseTracking(true);
- ui->page_video->installEventFilter(this);
- ui->widget_container->installEventFilter(this);
- mPlayer = new VideoPlayer();
- mPlayer->setVideoPlayerCallBack(this);
- mTimer = new QTimer; //定时器-获取当前视频时间
- connect(mTimer, &QTimer::timeout, this, &MainWindow::slotTimerTimeOut);
- mTimer->setInterval(500);
- mTimer_CheckControlWidget = new QTimer; //用于控制控制界面的出现和隐藏
- connect(mTimer_CheckControlWidget, &QTimer::timeout, this, &MainWindow::slotTimerTimeOut);
- mTimer_CheckControlWidget->setInterval(1500);
- mAnimation_ControlWidget = new QPropertyAnimation(ui->widget_controller, "geometry");
- ui->stackedWidget->setCurrentWidget(ui->page_open);
- ui->pushButton_pause->hide();
- resize(1024,768);
- setTitle(QStringLiteral("我的播放器-V%1").arg(AppConfig::VERSION_NAME));
- mVolume = mPlayer->getVolume();
- }
- MainWindow::~MainWindow()
- {
- AppConfig::saveConfigInfoToFile();
- AppConfig::removeDirectory(AppConfig::AppDataPath_Tmp);
- delete ui;
- }
- void MainWindow::showOutControlWidget()
- {
- mAnimation_ControlWidget->setDuration(800);
- int w = ui->widget_controller->width();
- int h = ui->widget_controller->height();
- int x = 0;
- int y = ui->widget_container->height() - ui->widget_controller->height();
- if (ui->widget_controller->isHidden())
- {
- ui->widget_controller->show();
- mAnimation_ControlWidget->setStartValue(ui->widget_controller->geometry());
- }
- else
- {
- mAnimation_ControlWidget->setStartValue(ui->widget_controller->geometry());
- }
- // mAnimation_ControlWidget->setKeyValueAt(0, QRect(0, 0, 00, 00));
- // mAnimation_ControlWidget->setKeyValueAt(0.4, QRect(20, 250, 20, 30));
- // mAnimation_ControlWidget->setKeyValueAt(0.8, QRect(100, 250, 20, 30));
- // mAnimation_ControlWidget->setKeyValueAt(1, QRect(250, 250, 100, 30));
- mAnimation_ControlWidget->setEndValue(QRect(x, y, w, h));
- mAnimation_ControlWidget->setEasingCurve(QEasingCurve::Linear); //设置动画效果
- mAnimation_ControlWidget->start();
- }
- void MainWindow::hideControlWidget()
- {
- mAnimation_ControlWidget->setTargetObject(ui->widget_controller);
- mAnimation_ControlWidget->setDuration(300);
- int w = ui->widget_controller->width();
- int h = ui->widget_controller->height();
- int x = 0;
- int y = ui->widget_container->height() + h;
- mAnimation_ControlWidget->setStartValue(ui->widget_controller->geometry());
- mAnimation_ControlWidget->setEndValue(QRect(x, y, w, h));
- mAnimation_ControlWidget->setEasingCurve(QEasingCurve::Linear); //设置动画效果
- mAnimation_ControlWidget->start();
- }
- void MainWindow::slotSliderMoved(int value)
- {
- if (QObject::sender() == ui->horizontalSlider)
- {
- mPlayer->seek((qint64)value * 1000000);
- }
- else if (QObject::sender() == ui->horizontalSlider_volume)
- {
- mPlayer->setVolume(value / 100.0);
- ui->label_volume->setText(QString("%1").arg(value));
- }
- }
- void MainWindow::slotTimerTimeOut()
- {
- if (QObject::sender() == mTimer)
- {
- qint64 Sec = mPlayer->getCurrentTime();
- ui->horizontalSlider->setValue(Sec);
- // QString hStr = QString("00%1").arg(Sec/3600);
- QString mStr = QString("00%1").arg(Sec/60);
- QString sStr = QString("00%1").arg(Sec%60);
- QString str = QString("%1:%2").arg(mStr.right(2)).arg(sStr.right(2));
- ui->label_currenttime->setText(str);
- }
- else if (QObject::sender() == mTimer_CheckControlWidget)
- {
- mTimer_CheckControlWidget->stop();
- hideControlWidget();
- }
- }
- void MainWindow::slotBtnClick(bool isChecked)
- {
- if (QObject::sender() == ui->pushButton_play)
- {
- mPlayer->play();
- }
- else if (QObject::sender() == ui->pushButton_pause)
- {
- mPlayer->pause();
- }
- else if (QObject::sender() == ui->pushButton_stop)
- {
- mPlayer->stop(true);
- }
- else if (QObject::sender() == ui->pushButton_open || QObject::sender() == ui->toolButton_open)
- {
- QString s = QFileDialog::getOpenFileName(
- this, QStringLiteral("选择要播放的文件"),
- AppConfig::gVideoFilePath,//初始目录
- QStringLiteral("视频文件 (*.flv *.rmvb *.avi *.MP4 *.mkv);;")
- +QStringLiteral("音频文件 (*.mp3 *.wma *.wav);;")
- +QStringLiteral("所有文件 (*.*)"));
- if (!s.isEmpty())
- {
- // s.replace("/","\\");
- mPlayer->stop(true); //如果在播放则先停止
- mPlayer->startPlay(s.toStdString());
- AppConfig::gVideoFilePath = s;
- AppConfig::saveConfigInfoToFile();
- }
- }
- else if (QObject::sender() == ui->pushButton_volume)
- {
- qDebug()<<isChecked;
- bool isMute = isChecked;
- mPlayer->setMute(isMute);
- if (isMute)
- {
- mVolume = mPlayer->getVolume();
- ui->horizontalSlider_volume->setValue(0);
- ui->horizontalSlider_volume->setEnabled(false);
- ui->label_volume->setText(QString("%1").arg(0));
- }
- else
- {
- int volume = mVolume * 100.0;
- ui->horizontalSlider_volume->setValue(volume);
- ui->horizontalSlider_volume->setEnabled(true);
- ui->label_volume->setText(QString("%1").arg(volume));
- }
- }
- }
- ///打开文件失败
- void MainWindow::onOpenVideoFileFailed(const int &code)
- {
- FunctionTransfer::runInMainThread([=]()
- {
- QMessageBox::critical(NULL, "tips", QString("open file failed %1").arg(code));
- });
- }
- ///打开SDL失败的时候回调此函数
- void MainWindow::onOpenSdlFailed(const int &code)
- {
- FunctionTransfer::runInMainThread([=]()
- {
- QMessageBox::critical(NULL, "tips", QString("open Sdl failed %1").arg(code));
- });
- }
- ///获取到视频时长的时候调用此函数
- void MainWindow::onTotalTimeChanged(const int64_t &uSec)
- {
- FunctionTransfer::runInMainThread([=]()
- {
- qint64 Sec = uSec/1000000;
- ui->horizontalSlider->setRange(0,Sec);
- // QString hStr = QString("00%1").arg(Sec/3600);
- QString mStr = QString("00%1").arg(Sec/60);
- QString sStr = QString("00%1").arg(Sec%60);
- QString str = QString("%1:%2").arg(mStr.right(2)).arg(sStr.right(2));
- ui->label_totaltime->setText(str);
- });
- }
- ///播放器状态改变的时候回调此函数
- void MainWindow::onPlayerStateChanged(const VideoPlayerState &state, const bool &hasVideo, const bool &hasAudio)
- {
- FunctionTransfer::runInMainThread([=]()
- {
- if (state == VideoPlayer_Stop)
- {
- ui->stackedWidget->setCurrentWidget(ui->page_open);
- ui->pushButton_pause->hide();
- ui->widget_videoPlayer->clear();
- ui->horizontalSlider->setValue(0);
- ui->label_currenttime->setText("00:00");
- ui->label_totaltime->setText("00:00");
- mTimer->stop();
- }
- else if (state == VideoPlayer_Playing)
- {
- if (hasVideo)
- {
- ui->stackedWidget->setCurrentWidget(ui->page_video);
- }
- else
- {
- ui->stackedWidget->setCurrentWidget(ui->page_audio);
- }
- ui->pushButton_play->hide();
- ui->pushButton_pause->show();
- mTimer->start();
- }
- else if (state == VideoPlayer_Pause)
- {
- ui->pushButton_pause->hide();
- ui->pushButton_play->show();
- }
- });
- }
- ///显示视频数据,此函数不宜做耗时操作,否则会影响播放的流畅性。
- void MainWindow::onDisplayVideo(std::shared_ptr<VideoFrame> videoFrame)
- {
- ui->widget_videoPlayer->inputOneFrame(videoFrame);
- }
- //图片显示部件时间过滤器处理
- bool MainWindow::eventFilter(QObject *target, QEvent *event)
- {
- if(target == ui->widget_container)
- {
- if(event->type() == QEvent::Resize)
- {
- ///停止动画,防止此时刚好开始动画,导致位置出错
- mAnimation_ControlWidget->stop();
- QResizeEvent * e = (QResizeEvent*)event;
- int w = e->size().width();
- int h = e->size().height();
- ui->stackedWidget->move(0, 0);
- ui->stackedWidget->resize(w, h);
- int x = 0;
- int y = h - ui->widget_controller->height();
- ui->widget_controller->move(x, y);
- ui->widget_controller->resize(w, ui->widget_controller->height());
- }
- }
- else if(target == ui->page_video)
- {
- if(event->type() == QEvent::MouseMove)
- {
- if (!mTimer_CheckControlWidget->isActive())
- {
- showOutControlWidget();
- }
- mTimer_CheckControlWidget->stop();
- mTimer_CheckControlWidget->start();
- }
- else if(event->type() == QEvent::Enter)
- {
- ui->widget_controller->show();
- }
- else if(event->type() == QEvent::Leave)
- {
- mTimer_CheckControlWidget->stop();
- mTimer_CheckControlWidget->start();
- }
- }
- //其它部件产生的事件则交给基类处理
- return DragAbleWidget::eventFilter(target, event);
- }
|