MainWindow.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. /**
  2. * 叶海辉
  3. * QQ群121376426
  4. * http://blog.yundiantech.com/
  5. */
  6. #include "MainWindow.h"
  7. #include "ui_MainWindow.h"
  8. #include <QPainter>
  9. #include <QPaintEvent>
  10. #include <QFileDialog>
  11. #include <QDebug>
  12. #include <QDesktopWidget>
  13. #include <QFontDatabase>
  14. #include <QMouseEvent>
  15. #include <QMessageBox>
  16. #include "AppConfig.h"
  17. #include "Base/FunctionTransfer.h"
  18. Q_DECLARE_METATYPE(VideoPlayerState)
  19. MainWindow::MainWindow(QWidget *parent) :
  20. DragAbleWidget(parent),
  21. ui(new Ui::MainWindow)
  22. {
  23. ui->setupUi(this->getContainWidget());
  24. FunctionTransfer::init(QThread::currentThreadId());
  25. ///初始化播放器
  26. VideoPlayer::initPlayer();
  27. setWindowFlags(Qt::FramelessWindowHint);//|Qt::WindowStaysOnTopHint); //使窗口的标题栏隐藏
  28. setAttribute(Qt::WA_TranslucentBackground);
  29. //因为VideoPlayer::PlayerState是自定义的类型 要跨线程传递需要先注册一下
  30. qRegisterMetaType<VideoPlayerState>();
  31. connect(ui->pushButton_open, &QPushButton::clicked, this, &MainWindow::slotBtnClick);
  32. connect(ui->toolButton_open, &QPushButton::clicked, this, &MainWindow::slotBtnClick);
  33. connect(ui->pushButton_play, &QPushButton::clicked, this, &MainWindow::slotBtnClick);
  34. connect(ui->pushButton_pause,&QPushButton::clicked, this, &MainWindow::slotBtnClick);
  35. connect(ui->pushButton_stop, &QPushButton::clicked, this, &MainWindow::slotBtnClick);
  36. connect(ui->pushButton_volume, &QPushButton::clicked, this, &MainWindow::slotBtnClick);
  37. connect(ui->horizontalSlider, SIGNAL(sig_valueChanged(int)), this, SLOT(slotSliderMoved(int)));
  38. connect(ui->horizontalSlider_volume, SIGNAL(valueChanged(int)), this, SLOT(slotSliderMoved(int)));
  39. ui->page_video->setMouseTracking(true);
  40. ui->page_video->installEventFilter(this);
  41. ui->widget_container->installEventFilter(this);
  42. mPlayer = new VideoPlayer();
  43. mPlayer->setVideoPlayerCallBack(this);
  44. mTimer = new QTimer; //定时器-获取当前视频时间
  45. connect(mTimer, &QTimer::timeout, this, &MainWindow::slotTimerTimeOut);
  46. mTimer->setInterval(500);
  47. mTimer_CheckControlWidget = new QTimer; //用于控制控制界面的出现和隐藏
  48. connect(mTimer_CheckControlWidget, &QTimer::timeout, this, &MainWindow::slotTimerTimeOut);
  49. mTimer_CheckControlWidget->setInterval(1500);
  50. mAnimation_ControlWidget = new QPropertyAnimation(ui->widget_controller, "geometry");
  51. ui->stackedWidget->setCurrentWidget(ui->page_open);
  52. ui->pushButton_pause->hide();
  53. resize(1024,768);
  54. setTitle(QStringLiteral("我的播放器-V%1").arg(AppConfig::VERSION_NAME));
  55. mVolume = mPlayer->getVolume();
  56. }
  57. MainWindow::~MainWindow()
  58. {
  59. AppConfig::saveConfigInfoToFile();
  60. AppConfig::removeDirectory(AppConfig::AppDataPath_Tmp);
  61. delete ui;
  62. }
  63. void MainWindow::showOutControlWidget()
  64. {
  65. mAnimation_ControlWidget->setDuration(800);
  66. int w = ui->widget_controller->width();
  67. int h = ui->widget_controller->height();
  68. int x = 0;
  69. int y = ui->widget_container->height() - ui->widget_controller->height();
  70. if (ui->widget_controller->isHidden())
  71. {
  72. ui->widget_controller->show();
  73. mAnimation_ControlWidget->setStartValue(ui->widget_controller->geometry());
  74. }
  75. else
  76. {
  77. mAnimation_ControlWidget->setStartValue(ui->widget_controller->geometry());
  78. }
  79. // mAnimation_ControlWidget->setKeyValueAt(0, QRect(0, 0, 00, 00));
  80. // mAnimation_ControlWidget->setKeyValueAt(0.4, QRect(20, 250, 20, 30));
  81. // mAnimation_ControlWidget->setKeyValueAt(0.8, QRect(100, 250, 20, 30));
  82. // mAnimation_ControlWidget->setKeyValueAt(1, QRect(250, 250, 100, 30));
  83. mAnimation_ControlWidget->setEndValue(QRect(x, y, w, h));
  84. mAnimation_ControlWidget->setEasingCurve(QEasingCurve::Linear); //设置动画效果
  85. mAnimation_ControlWidget->start();
  86. }
  87. void MainWindow::hideControlWidget()
  88. {
  89. mAnimation_ControlWidget->setTargetObject(ui->widget_controller);
  90. mAnimation_ControlWidget->setDuration(300);
  91. int w = ui->widget_controller->width();
  92. int h = ui->widget_controller->height();
  93. int x = 0;
  94. int y = ui->widget_container->height() + h;
  95. mAnimation_ControlWidget->setStartValue(ui->widget_controller->geometry());
  96. mAnimation_ControlWidget->setEndValue(QRect(x, y, w, h));
  97. mAnimation_ControlWidget->setEasingCurve(QEasingCurve::Linear); //设置动画效果
  98. mAnimation_ControlWidget->start();
  99. }
  100. void MainWindow::slotSliderMoved(int value)
  101. {
  102. if (QObject::sender() == ui->horizontalSlider)
  103. {
  104. mPlayer->seek((qint64)value * 1000000);
  105. }
  106. else if (QObject::sender() == ui->horizontalSlider_volume)
  107. {
  108. mPlayer->setVolume(value / 100.0);
  109. ui->label_volume->setText(QString("%1").arg(value));
  110. }
  111. }
  112. void MainWindow::slotTimerTimeOut()
  113. {
  114. if (QObject::sender() == mTimer)
  115. {
  116. qint64 Sec = mPlayer->getCurrentTime();
  117. ui->horizontalSlider->setValue(Sec);
  118. // QString hStr = QString("00%1").arg(Sec/3600);
  119. QString mStr = QString("00%1").arg(Sec/60);
  120. QString sStr = QString("00%1").arg(Sec%60);
  121. QString str = QString("%1:%2").arg(mStr.right(2)).arg(sStr.right(2));
  122. ui->label_currenttime->setText(str);
  123. }
  124. else if (QObject::sender() == mTimer_CheckControlWidget)
  125. {
  126. mTimer_CheckControlWidget->stop();
  127. hideControlWidget();
  128. }
  129. }
  130. void MainWindow::slotBtnClick(bool isChecked)
  131. {
  132. if (QObject::sender() == ui->pushButton_play)
  133. {
  134. mPlayer->play();
  135. }
  136. else if (QObject::sender() == ui->pushButton_pause)
  137. {
  138. mPlayer->pause();
  139. }
  140. else if (QObject::sender() == ui->pushButton_stop)
  141. {
  142. mPlayer->stop(true);
  143. }
  144. else if (QObject::sender() == ui->pushButton_open || QObject::sender() == ui->toolButton_open)
  145. {
  146. QString s = QFileDialog::getOpenFileName(
  147. this, QStringLiteral("选择要播放的文件"),
  148. AppConfig::gVideoFilePath,//初始目录
  149. QStringLiteral("视频文件 (*.flv *.rmvb *.avi *.MP4 *.mkv);;")
  150. +QStringLiteral("音频文件 (*.mp3 *.wma *.wav);;")
  151. +QStringLiteral("所有文件 (*.*)"));
  152. if (!s.isEmpty())
  153. {
  154. // s.replace("/","\\");
  155. mPlayer->stop(true); //如果在播放则先停止
  156. mPlayer->startPlay(s.toStdString());
  157. AppConfig::gVideoFilePath = s;
  158. AppConfig::saveConfigInfoToFile();
  159. }
  160. }
  161. else if (QObject::sender() == ui->pushButton_volume)
  162. {
  163. qDebug()<<isChecked;
  164. bool isMute = isChecked;
  165. mPlayer->setMute(isMute);
  166. if (isMute)
  167. {
  168. mVolume = mPlayer->getVolume();
  169. ui->horizontalSlider_volume->setValue(0);
  170. ui->horizontalSlider_volume->setEnabled(false);
  171. ui->label_volume->setText(QString("%1").arg(0));
  172. }
  173. else
  174. {
  175. int volume = mVolume * 100.0;
  176. ui->horizontalSlider_volume->setValue(volume);
  177. ui->horizontalSlider_volume->setEnabled(true);
  178. ui->label_volume->setText(QString("%1").arg(volume));
  179. }
  180. }
  181. }
  182. ///打开文件失败
  183. void MainWindow::onOpenVideoFileFailed(const int &code)
  184. {
  185. FunctionTransfer::runInMainThread([=]()
  186. {
  187. QMessageBox::critical(NULL, "tips", QString("open file failed %1").arg(code));
  188. });
  189. }
  190. ///打开SDL失败的时候回调此函数
  191. void MainWindow::onOpenSdlFailed(const int &code)
  192. {
  193. FunctionTransfer::runInMainThread([=]()
  194. {
  195. QMessageBox::critical(NULL, "tips", QString("open Sdl failed %1").arg(code));
  196. });
  197. }
  198. ///获取到视频时长的时候调用此函数
  199. void MainWindow::onTotalTimeChanged(const int64_t &uSec)
  200. {
  201. FunctionTransfer::runInMainThread([=]()
  202. {
  203. qint64 Sec = uSec/1000000;
  204. ui->horizontalSlider->setRange(0,Sec);
  205. // QString hStr = QString("00%1").arg(Sec/3600);
  206. QString mStr = QString("00%1").arg(Sec/60);
  207. QString sStr = QString("00%1").arg(Sec%60);
  208. QString str = QString("%1:%2").arg(mStr.right(2)).arg(sStr.right(2));
  209. ui->label_totaltime->setText(str);
  210. });
  211. }
  212. ///播放器状态改变的时候回调此函数
  213. void MainWindow::onPlayerStateChanged(const VideoPlayerState &state, const bool &hasVideo, const bool &hasAudio)
  214. {
  215. FunctionTransfer::runInMainThread([=]()
  216. {
  217. if (state == VideoPlayer_Stop)
  218. {
  219. ui->stackedWidget->setCurrentWidget(ui->page_open);
  220. ui->pushButton_pause->hide();
  221. ui->widget_videoPlayer->clear();
  222. ui->horizontalSlider->setValue(0);
  223. ui->label_currenttime->setText("00:00");
  224. ui->label_totaltime->setText("00:00");
  225. mTimer->stop();
  226. }
  227. else if (state == VideoPlayer_Playing)
  228. {
  229. if (hasVideo)
  230. {
  231. ui->stackedWidget->setCurrentWidget(ui->page_video);
  232. }
  233. else
  234. {
  235. ui->stackedWidget->setCurrentWidget(ui->page_audio);
  236. }
  237. ui->pushButton_play->hide();
  238. ui->pushButton_pause->show();
  239. mTimer->start();
  240. }
  241. else if (state == VideoPlayer_Pause)
  242. {
  243. ui->pushButton_pause->hide();
  244. ui->pushButton_play->show();
  245. }
  246. });
  247. }
  248. ///显示视频数据,此函数不宜做耗时操作,否则会影响播放的流畅性。
  249. void MainWindow::onDisplayVideo(std::shared_ptr<VideoFrame> videoFrame)
  250. {
  251. ui->widget_videoPlayer->inputOneFrame(videoFrame);
  252. }
  253. //图片显示部件时间过滤器处理
  254. bool MainWindow::eventFilter(QObject *target, QEvent *event)
  255. {
  256. if(target == ui->widget_container)
  257. {
  258. if(event->type() == QEvent::Resize)
  259. {
  260. ///停止动画,防止此时刚好开始动画,导致位置出错
  261. mAnimation_ControlWidget->stop();
  262. QResizeEvent * e = (QResizeEvent*)event;
  263. int w = e->size().width();
  264. int h = e->size().height();
  265. ui->stackedWidget->move(0, 0);
  266. ui->stackedWidget->resize(w, h);
  267. int x = 0;
  268. int y = h - ui->widget_controller->height();
  269. ui->widget_controller->move(x, y);
  270. ui->widget_controller->resize(w, ui->widget_controller->height());
  271. }
  272. }
  273. else if(target == ui->page_video)
  274. {
  275. if(event->type() == QEvent::MouseMove)
  276. {
  277. if (!mTimer_CheckControlWidget->isActive())
  278. {
  279. showOutControlWidget();
  280. }
  281. mTimer_CheckControlWidget->stop();
  282. mTimer_CheckControlWidget->start();
  283. }
  284. else if(event->type() == QEvent::Enter)
  285. {
  286. ui->widget_controller->show();
  287. }
  288. else if(event->type() == QEvent::Leave)
  289. {
  290. mTimer_CheckControlWidget->stop();
  291. mTimer_CheckControlWidget->start();
  292. }
  293. }
  294. //其它部件产生的事件则交给基类处理
  295. return DragAbleWidget::eventFilter(target, event);
  296. }