OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2933|回复: 0

《I.MX6U 嵌入式Qt开发指南》第十二章 多媒体 (中)

[复制链接]

1130

主题

1141

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4746
金钱
4746
注册时间
2019-5-8
在线时间
1237 小时
发表于 2022-8-10 17:57:44 | 显示全部楼层 |阅读模式
本帖最后由 正点原子运营 于 2022-8-10 17:57 编辑

1)实验平台:正点原子阿尔法Linux开发板
2)  章节摘自【正点原子】《I.MX6U 嵌入式Qt开发指南》

3)购买链接:https://detail.tmall.com/item.htm?id=609033604451
4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/arm-linux/zdyz-i.mx6ull.html
5)正点原子官方B站:https://space.bilibili.com/394620890
6)正点原子阿尔法Linux交流群:1027879335







第十二章 多媒体
第九章12.4 视频播放器
与音乐播放器一样使用QMediaPlayer类,不同的是需要使用setVideoOutput(QVideoWidget*)设置一个视频输出窗口,好让视频在此窗口显示,其他步骤基本都一样。

第十章12.4.1 应用实例
本例设计一个比较好看且简洁的视频播放器,界面是编者原创界面。
本例目的:视频播放器的设计与使用。
例15_videoplayer,视频播放器(难度:中等)。项目路径为Qt/2/15_videoplayer。注意本例有用到qss样式文件,关于如何添加资源文件与qss文件请参考7.1.3小节。音乐播放器的功能这些都为大家所熟知,不用编者介绍了。
项目文件15_videoplayer.pro文件第一行添加的代码部分如下。
  1. 15_videoplayer.pro编程后的代码
  2. 1   QT       += core gui multimedia multimediawidgets
  3. 2
  4. 3   greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
  5. 4
  6. 5   CONFIG += c++11
  7. 6
  8. 7   # The following define makes your compiler emit warnings if you use
  9. 8   # any Qt feature that has been marked deprecated (the exact warnings
  10. 9   # depend on your compiler). Please consult the documentation of the
  11. 10  # deprecated API in order to know how to port your code away from it.
  12. 11  DEFINES += QT_DEPRECATED_WARNINGS
  13. 12
  14. 13  # You can also make your code fail to compile if it uses deprecated APIs.
  15. 14  # In order to do so, uncomment the following line.
  16. 15  # You can also select to disable deprecated APIs only up to a certain version of Qt.
  17. 16  #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
  18. 17
  19. 18  SOURCES += \
  20. 19      main.cpp \
  21. 20      mainwindow.cpp
  22. 21
  23. 22  HEADERS += \
  24. 23      mainwindow.h
  25. 24
  26. 25  # Default rules for deployment.
  27. 26  qnx: target.path = /tmp/${TARGET}/bin
  28. 27  else: unix:!android: target.path = /opt/${TARGET}/bin
  29. 28  !isEmpty(target.path): INSTALLS += target
  30. 29
  31. 30  RESOURCES += \
  32. 31      res.qrc
复制代码
在头文件“mainwindow.h”具体代码如下
  1. mainwindow.h编程后的代码
  2.     /******************************************************************
  3.     Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.
  4.     * @projectName   15_videoplayer
  5.     * @brief         mainwindow.h
  6.     * [url=home.php?mod=space&uid=90321]@Author[/url]        Deng Zhimao
  7.     * [url=home.php?mod=space&uid=55957]@EMAIL[/url]         1252699831@qq.com
  8.     * [url=home.php?mod=space&uid=28414]@net[/url]            www.openedv.com
  9.     * @date           2021-04-27
  10.     *******************************************************************/
  11. 1   #ifndef MAINWINDOW_H
  12. 2   #define MAINWINDOW_H
  13. 3  
  14. 4   #include <QMainWindow>
  15. 5   #include <QMediaPlayer>
  16. 6   #include <QMediaPlaylist>
  17. 7   #include <QPushButton>
  18. 8   #include <QSlider>
  19. 9   #include <QVBoxLayout>
  20. 10  #include <QHBoxLayout>
  21. 11  #include <QListWidget>
  22. 12  #include <QLabel>
  23. 13  #include <QSpacerItem>
  24. 14  #include <QVideoWidget>
  25. 15  #include <QDebug>
  26. 16
  27. 17  /* 媒体信息结构体 */
  28. 18  struct MediaObjectInfo {
  29. 19      /* 用于保存视频文件名 */
  30. 20      QString fileName;
  31. 21      /* 用于保存视频文件路径 */
  32. 22      QString filePath;
  33. 23  };
  34. 24
  35. 25  class MainWindow : public QMainWindow
  36. 26  {
  37. 27      Q_OBJECT
  38. 28
  39. 29  public:
  40. 30      MainWindow(QWidget *parent = nullptr);
  41. 31      ~MainWindow();
  42. 32
  43. 33  private:
  44. 34      /* 媒体播放器,用于播放视频 */
  45. 35      QMediaPlayer *videoPlayer;
  46. 36
  47. 37      /* 媒体列表 */
  48. 38      QMediaPlaylist *mediaPlaylist;
  49. 39
  50. 40      /* 视频显示窗口 */
  51. 41      QVideoWidget *videoWidget;
  52. 42
  53. 43      /* 视频列表 */
  54. 44      QListWidget *listWidget;
  55. 45
  56. 46      /* 播放进度条 */
  57. 47      QSlider *durationSlider;
  58. 48
  59. 49      /* 音量条 */
  60. 50      QSlider *volumeSlider;
  61. 51
  62. 52      /* 视频播放器按钮 */
  63. 53      QPushButton *pushButton[5];
  64. 54
  65. 55      /* 水平布局 */
  66. 56      QHBoxLayout *hBoxLayout[3];
  67. 57
  68. 58      /* 水平容器 */
  69. 59      QWidget *hWidget[3];
  70. 60
  71. 61      /* 标签文本 */
  72. 62      QLabel *label[2];
  73. 63
  74. 64      /* 垂直容器 */
  75. 65      QWidget *vWidget[2];
  76. 66
  77. 67      /* 垂直界面 */
  78. 68      QVBoxLayout *vBoxLayout[2];
  79. 69
  80. 70      /* 视频布局函数 */
  81. 71      void videoLayout();
  82. 72
  83. 73      /* 主窗体大小重设大小函数重写 */
  84. 74      void resizeEvent(QResizeEvent *event);
  85. 75
  86. 76      /* 媒体信息存储 */
  87. 77      QVector<MediaObjectInfo> mediaObjectInfo;
  88. 78
  89. 79      /* 扫描本地视频文件 */
  90. 80      void scanVideoFiles();
  91. 81
  92. 82      /* 媒体初始化 */
  93. 83      void mediaPlayerInit();
  94. 84  private slots:
  95. 85      /* 播放按钮点击 */
  96. 86      void btn_play_clicked();
  97. 87
  98. 88      /* 下一个视频按钮点击 */
  99. 89      void btn_next_clicked();
  100. 90
  101. 91      /* 音量加 */
  102. 92      void btn_volmeup_clicked();
  103. 93
  104. 94      /* 音量减 */
  105. 95      void btn_volmedown_clicked();
  106. 96
  107. 97      /* 全屏 */
  108. 98      void btn_fullscreen_clicked();
  109. 99
  110. 100     /* 媒体状态改变 */
  111. 101     void mediaPlayerStateChanged(QMediaPlayer::State);
  112. 102
  113. 103     /* 列表单击 */
  114. 104     void listWidgetCliked(QListWidgetItem*);
  115. 105
  116. 106     /* 媒体列表项改变 */
  117. 107     void mediaPlaylistCurrentIndexChanged(int);
  118. 108
  119. 109     /* 媒体总长度改变 */
  120. 110     void musicPlayerDurationChanged(qint64);
  121. 111
  122. 112     /* 媒体播放位置改变 */
  123. 113     void mediaPlayerPositionChanged(qint64);
  124. 114
  125. 115     /* 播放进度条松开 */
  126. 116     void durationSliderReleased();
  127. 117
  128. 118     /* 音量条松开 */
  129. 119     void volumeSliderReleased();
  130. 120 };
  131. 121 #endif // MAINWINDOW_H
复制代码
头文件里主要是声明界面所使用的元素及一些槽函数。
在源文件“mainwindow.cpp”具体代码如下。
  1. mainwindow.cpp编程后的代码
  2.     /******************************************************************
  3.     Copyright &#169; Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.
  4.     * @projectName   15_videoplayer
  5.     * @brief         mainwindow.cpp
  6.     * @author        Deng Zhimao
  7.     * @email         1252699831@qq.com
  8.     * @net            www.openedv.com
  9.     * @date           2021-04-27
  10.     *******************************************************************/
  11. 1   #include "mainwindow.h"
  12. 2   #include <QCoreApplication>
  13. 3   #include <QFileInfoList>
  14. 4   #include <QDir>
  15. 5  
  16. 6   MainWindow::MainWindow(QWidget *parent)
  17. 7       : QMainWindow(parent)
  18. 8   {
  19. 9       /* 视频播放器布局初始化 */
  20. 10      videoLayout();
  21. 11
  22. 12      /* 媒体初始化 */
  23. 13      mediaPlayerInit();
  24. 14
  25. 15      /* 扫描本地视频 */
  26. 16      scanVideoFiles();
  27. 17
  28. 18      /* 设置按钮的属性 */
  29. 19      pushButton[0]->setCheckable(true);
  30. 20      pushButton[4]->setCheckable(true);
  31. 21
  32. 22      /* 按钮连接信号槽 */
  33. 23      connect(pushButton[0], SIGNAL(clicked()),
  34. 24              this, SLOT(btn_play_clicked()));
  35. 25      connect(pushButton[1], SIGNAL(clicked()),
  36. 26              this, SLOT(btn_next_clicked()));
  37. 27      connect(pushButton[2], SIGNAL(clicked()),
  38. 28              this, SLOT(btn_volmedown_clicked()));
  39. 29      connect(pushButton[3], SIGNAL(clicked()),
  40. 30              this, SLOT(btn_volmeup_clicked()));
  41. 31      connect(pushButton[4], SIGNAL(clicked()),
  42. 32              this, SLOT(btn_fullscreen_clicked()));
  43. 33
  44. 34      /* 列表连接信号槽 */
  45. 35      connect(listWidget, SIGNAL(itemClicked(QListWidgetItem*)),
  46. 36              this, SLOT(listWidgetCliked(QListWidgetItem*)));
  47. 37
  48. 38      /* 媒体连接信号槽 */
  49. 39      connect(videoPlayer,
  50. 40              SIGNAL(stateChanged(QMediaPlayer::State)),
  51. 41              this,
  52. 42              SLOT(mediaPlayerStateChanged(QMediaPlayer::State)));
  53. 43      connect(mediaPlaylist,
  54. 44              SIGNAL(currentIndexChanged(int)),
  55. 45              this,
  56. 46              SLOT(mediaPlaylistCurrentIndexChanged(int)));
  57. 47      connect(videoPlayer, SIGNAL(durationChanged(qint64)),
  58. 48              this,
  59. 49              SLOT(musicPlayerDurationChanged(qint64)));
  60. 50      connect(videoPlayer,
  61. 51              SIGNAL(positionChanged(qint64)),
  62. 52              this,
  63. 53              SLOT(mediaPlayerPositionChanged(qint64)));
  64. 54
  65. 55      /* slider信号槽连接 */
  66. 56      connect(durationSlider, SIGNAL(sliderReleased()),
  67. 57              this, SLOT(durationSliderReleased()));
  68. 58      connect(volumeSlider, SIGNAL(sliderReleased()),
  69. 59              this, SLOT(volumeSliderReleased()));
  70. 60  }
  71. 61
  72. 62  MainWindow::~MainWindow()
  73. 63  {
  74. 64  }
  75. 65
  76. 66  void MainWindow::videoLayout()
  77. 67  {
  78. 68      /* 设置位置与大小,这里固定为800, 480 */
  79. 69      this->setGeometry(0, 0, 800, 480);
  80. 70      //    this->setMinimumSize(800, 480);
  81. 71      //    this->setMaximumSize(800, 480);
  82. 72      QPalette pal;
  83. 73      pal.setColor(QPalette::WindowText, Qt::white);
  84. 74
  85. 75      for (int i = 0; i < 3; i++) {
  86. 76          /* 水平容器 */
  87. 77          hWidget[i] = new QWidget();
  88. 78          hWidget[i]->setAutoFillBackground(true);
  89. 79          /* 水平布局 */
  90. 80          hBoxLayout[i] = new QHBoxLayout();
  91. 81      }
  92. 82
  93. 83      for (int i = 0; i < 2; i++) {
  94. 84          /* 垂直容器 */
  95. 85          vWidget[i] = new QWidget();
  96. 86          vWidget[i]->setAutoFillBackground(true);
  97. 87          /* 垂直布局 */
  98. 88          vBoxLayout[i] = new QVBoxLayout();
  99. 89      }
  100. 90
  101. 91      for (int i = 0; i < 2; i++) {
  102. 92          label[i] = new QLabel();
  103. 93      }
  104. 94
  105. 95      for (int i = 0; i < 5; i++) {
  106. 96          pushButton[i] = new QPushButton();
  107. 97          pushButton[i]->setMaximumSize(44, 44);
  108. 98          pushButton[i]->setMinimumSize(44, 44);
  109. 99      }
  110. 100
  111. 101     /* 设置 */
  112. 102     vWidget[0]->setObjectName("vWidget0");
  113. 103     vWidget[1]->setObjectName("vWidget1");
  114. 104     hWidget[1]->setObjectName("hWidget1");
  115. 105     hWidget[2]->setObjectName("hWidget2");
  116. 106     pushButton[0]->setObjectName("btn_play");
  117. 107     pushButton[1]->setObjectName("btn_next");
  118. 108     pushButton[2]->setObjectName("btn_volumedown");
  119. 109     pushButton[3]->setObjectName("btn_volumeup");
  120. 110     pushButton[4]->setObjectName("btn_screen");
  121. 111
  122. 112     QFont font;
  123. 113
  124. 114     font.setPixelSize(18);
  125. 115     label[0]->setFont(font);
  126. 116     label[1]->setFont(font);
  127. 117
  128. 118     pal.setColor(QPalette::WindowText, Qt::white);
  129. 119     label[0]->setPalette(pal);
  130. 120     label[1]->setPalette(pal);
  131. 121
  132. 122     label[0]->setText("00:00");
  133. 123     label[1]->setText("/00:00");
  134. 124
  135. 125     durationSlider = new QSlider(Qt::Horizontal);
  136. 126     durationSlider->setMaximumHeight(15);
  137. 127     durationSlider->setObjectName("durationSlider");
  138. 128
  139. 129     volumeSlider = new QSlider(Qt::Horizontal);
  140. 130     volumeSlider->setRange(0, 100);
  141. 131     volumeSlider->setMaximumWidth(80);
  142. 132     volumeSlider->setObjectName("volumeSlider");
  143. 133     volumeSlider->setValue(50);
  144. 134
  145. 135     listWidget = new QListWidget();
  146. 136     listWidget->setObjectName("listWidget");
  147. 137     listWidget->setVerticalScrollBarPolicy(
  148. 138                 Qt::ScrollBarAlwaysOff);
  149. 139     listWidget->setHorizontalScrollBarPolicy(
  150. 140                 Qt::ScrollBarAlwaysOff);
  151. 141     //listWidget->setFocusPolicy(Qt::NoFocus);
  152. 142     videoWidget = new QVideoWidget();
  153. 143     videoWidget->setStyleSheet("border-image: none;"
  154. 144                                "background: transparent;"
  155. 145                                "border:none");
  156. 146
  157. 147     /* H0布局 */
  158. 148     vWidget[0]->setMinimumSize(300, 480);
  159. 149     vWidget[0]->setMaximumWidth(300);
  160. 150     videoWidget->setMinimumSize(500, 480);
  161. 151
  162. 152     hBoxLayout[0]->addWidget(videoWidget);
  163. 153     hBoxLayout[0]->addWidget(vWidget[0]);
  164. 154
  165. 155     hWidget[0]->setLayout(hBoxLayout[0]);
  166. 156     hBoxLayout[0]->setContentsMargins(0, 0, 0, 0);
  167. 157
  168. 158     setCentralWidget(hWidget[0]);
  169. 159
  170. 160     /* V0布局 */
  171. 161     QSpacerItem *vSpacer0 = new
  172. 162             QSpacerItem(0, 80,
  173. 163                         QSizePolicy::Minimum,
  174. 164                         QSizePolicy::Maximum);
  175. 165     vBoxLayout[0]->addWidget(listWidget);
  176. 166     vBoxLayout[0]->addSpacerItem(vSpacer0);
  177. 167     vBoxLayout[0]->setContentsMargins(0, 0, 0, 0);
  178. 168
  179. 169     vWidget[0]->setLayout(vBoxLayout[0]);
  180. 170
  181. 171     /* V1布局 */
  182. 172     /* 底板部件布局 */
  183. 173     hWidget[1]->setMaximumHeight(15);
  184. 174     hWidget[2]->setMinimumHeight(65);
  185. 175     vBoxLayout[1]->addWidget(hWidget[1]);
  186. 176     vBoxLayout[1]->addWidget(hWidget[2]);
  187. 177     vBoxLayout[1]->setAlignment(Qt::AlignCenter);
  188. 178
  189. 179     vWidget[1]->setLayout(vBoxLayout[1]);
  190. 180     vWidget[1]->setParent(this);
  191. 181     vWidget[1]->setGeometry(0, this->height() - 80, this->width(), 80);
  192. 182     vBoxLayout[1]->setContentsMargins(0, 0, 0, 0);
  193. 183     /* 位于最上层 */
  194. 184     vWidget[1]->raise();
  195. 185
  196. 186     /* H1布局 */
  197. 187     hBoxLayout[1]->addWidget(durationSlider);
  198. 188     hBoxLayout[1]->setContentsMargins(0, 0, 0, 0);
  199. 189     hWidget[1]->setLayout(hBoxLayout[1]);
  200. 190
  201. 191     /* H2布局 */
  202. 192     QSpacerItem *hSpacer0 = new
  203. 193             QSpacerItem(300, 80,
  204. 194                         QSizePolicy::Expanding,
  205. 195                         QSizePolicy::Maximum);
  206. 196
  207. 197     hBoxLayout[2]->addSpacing(20);
  208. 198     hBoxLayout[2]->addWidget(pushButton[0]);
  209. 199     hBoxLayout[2]->addSpacing(10);
  210. 200     hBoxLayout[2]->addWidget(pushButton[1]);
  211. 201     hBoxLayout[2]->addSpacing(10);
  212. 202     hBoxLayout[2]->addWidget(pushButton[2]);
  213. 203     hBoxLayout[2]->addWidget(volumeSlider);
  214. 204     hBoxLayout[2]->addWidget(pushButton[3]);
  215. 205     hBoxLayout[2]->addWidget(label[0]);
  216. 206     hBoxLayout[2]->addWidget(label[1]);
  217. 207     hBoxLayout[2]->addSpacerItem(hSpacer0);
  218. 208     hBoxLayout[2]->addWidget(pushButton[4]);
  219. 209     hBoxLayout[2]->addSpacing(20);
  220. 210     hBoxLayout[2]->setContentsMargins(0, 0, 0, 0);
  221. 211     hBoxLayout[2]->setAlignment(Qt::AlignLeft | Qt::AlignTop);
  222. 212
  223. 213     hWidget[2]->setLayout(hBoxLayout[2]);
  224. 214 }
  225. 215
  226. 216 void MainWindow::mediaPlayerInit()
  227. 217 {
  228. 218     videoPlayer = new QMediaPlayer(this);
  229. 219     mediaPlaylist = new QMediaPlaylist(this);
  230. 220     /* 确保列表是空的 */
  231. 221     mediaPlaylist->clear();
  232. 222     /* 设置视频播放器的列表为mediaPlaylist */
  233. 223     videoPlayer->setPlaylist(mediaPlaylist);
  234. 224     /* 设置视频输出窗口 */
  235. 225     videoPlayer->setVideoOutput(videoWidget);
  236. 226     /* 设置播放模式,Loop是列循环 */
  237. 227     mediaPlaylist->setPlaybackMode(QMediaPlaylist::Loop);
  238. 228     /* 设置默认软件音量为50% */
  239. 229     videoPlayer->setVolume(50);
  240. 230 }
  241. 231
  242. 232 void MainWindow::resizeEvent(QResizeEvent *event)
  243. 233 {
  244. 234     Q_UNUSED(event);
  245. 235     vWidget[1]->setGeometry(0, this->height() - 80, this->width(), 80);
  246. 236 }
  247. 237
  248. 238 void MainWindow::btn_play_clicked()
  249. 239 {
  250. 240     int state = videoPlayer->state();
  251. 241     switch (state) {
  252. 242     case QMediaPlayer::StoppedState:
  253. 243         /* 媒体播放 */
  254. 244         videoPlayer->play();
  255. 245         break;
  256. 246
  257. 247     case QMediaPlayer::PlayingState:
  258. 248         /* 媒体暂停 */
  259. 249         videoPlayer->pause();
  260. 250         break;
  261. 251
  262. 252     case QMediaPlayer::PausedState:
  263. 253         /* 设置视频输出窗口 */
  264. 254         videoPlayer->play();
  265. 255         break;
  266. 256     }
  267. 257 }
  268. 258
  269. 259 void MainWindow::btn_next_clicked()
  270. 260 {
  271. 261     videoPlayer->stop();
  272. 262     int count = mediaPlaylist->mediaCount();
  273. 263     if (0 == count)
  274. 264         return;
  275. 265
  276. 266     /* 列表下一个 */
  277. 267     mediaPlaylist->next();
  278. 268     videoPlayer->play();
  279. 269 }
  280. 270
  281. 271 void MainWindow::btn_volmeup_clicked()
  282. 272 {
  283. 273     /* 点击每次音量+5 */
  284. 274     volumeSlider->setValue(volumeSlider->value() + 5);
  285. 275     videoPlayer->setVolume(volumeSlider->value());
  286. 276 }
  287. 277
  288. 278 void MainWindow::btn_fullscreen_clicked()
  289. 279 {
  290. 280     /* 全屏/非全屏操作 */
  291. 281     vWidget[0]->setVisible(!pushButton[4]->isChecked());
  292. 282 }
  293. 283
  294. 284 void MainWindow::btn_volmedown_clicked()
  295. 285 {
  296. 286     /* 点击每次音量-5 */
  297. 287     volumeSlider->setValue(volumeSlider->value() - 5);
  298. 288     videoPlayer->setVolume(volumeSlider->value());
  299. 289 }
  300. 290
  301. 291 void MainWindow::mediaPlayerStateChanged(
  302. 292         QMediaPlayer::State
  303. 293         state)
  304. 294 {
  305. 295     switch (state) {
  306. 296     case QMediaPlayer::StoppedState:
  307. 297         pushButton[0]->setChecked(false);
  308. 298         break;
  309. 299
  310. 300     case QMediaPlayer::PlayingState:
  311. 301         pushButton[0]->setChecked(true);
  312. 302         break;
  313. 303
  314. 304     case QMediaPlayer::PausedState:
  315. 305         pushButton[0]->setChecked(false);
  316. 306         break;
  317. 307     }
  318. 308 }
  319. 309
  320. 310 void MainWindow::listWidgetCliked(QListWidgetItem *item)
  321. 311 {
  322. 312     videoPlayer->stop();
  323. 313     mediaPlaylist->setCurrentIndex(listWidget->row(item));
  324. 314     videoPlayer->play();
  325. 315 }
  326. 316
  327. 317 void MainWindow::mediaPlaylistCurrentIndexChanged(
  328. 318         int index)
  329. 319 {
  330. 320     if (-1 == index)
  331. 321         return;
  332. 322
  333. 323     /* 设置列表正在播放的项 */
  334. 324     listWidget->setCurrentRow(index);
  335. 325 }
  336. 326
  337. 327 void MainWindow::musicPlayerDurationChanged(
  338. 328         qint64 duration)
  339. 329 {
  340. 330     durationSlider->setRange(0, duration / 1000);
  341. 331     int second  = duration / 1000;
  342. 332     int minute = second / 60;
  343. 333     second %= 60;
  344. 334
  345. 335     QString mediaDuration;
  346. 336     mediaDuration.clear();
  347. 337
  348. 338     if (minute >= 10)
  349. 339         mediaDuration = QString::number(minute, 10);
  350. 340     else
  351. 341         mediaDuration = "0" + QString::number(minute, 10);
  352. 342
  353. 343     if (second >= 10)
  354. 344         mediaDuration = mediaDuration
  355. 345                 + ":" + QString::number(second, 10);
  356. 346     else
  357. 347         mediaDuration = mediaDuration
  358. 348                 + ":0" + QString::number(second, 10);
  359. 349
  360. 350     /* 显示媒体总长度时间 */
  361. 351     label[1]->setText("/" + mediaDuration);
  362. 352 }
  363. 353
  364. 354 void MainWindow::mediaPlayerPositionChanged(
  365. 355         qint64 position)
  366. 356 {
  367. 357     if (!durationSlider->isSliderDown())
  368. 358         durationSlider->setValue(position / 1000);
  369. 359
  370. 360     int second  = position / 1000;
  371. 361     int minute = second / 60;
  372. 362     second %= 60;
  373. 363
  374. 364     QString mediaPosition;
  375. 365     mediaPosition.clear();
  376. 366
  377. 367     if (minute >= 10)
  378. 368         mediaPosition = QString::number(minute, 10);
  379. 369     else
  380. 370         mediaPosition = "0" + QString::number(minute, 10);
  381. 371
  382. 372     if (second >= 10)
  383. 373         mediaPosition = mediaPosition
  384. 374                 + ":" + QString::number(second, 10);
  385. 375     else
  386. 376         mediaPosition = mediaPosition
  387. 377                 + ":0" + QString::number(second, 10);
  388. 378
  389. 379     /* 显示现在播放的时间 */
  390. 380     label[0]->setText(mediaPosition);
  391. 381 }
  392. 382
  393. 383 void MainWindow::durationSliderReleased()
  394. 384 {
  395. 385     /* 设置媒体播放的位置 */
  396. 386     videoPlayer->setPosition(durationSlider->value() * 1000);
  397. 387 }
  398. 388
  399. 389 void MainWindow::volumeSliderReleased()
  400. 390 {
  401. 391     /* 设置音量 */
  402. 392     videoPlayer->setVolume(volumeSlider->value());
  403. 393 }
  404. 394
  405. 395 void MainWindow::scanVideoFiles()
  406. 396 {
  407. 397     QDir dir(QCoreApplication::applicationDirPath()
  408. 398              + "/myVideo");
  409. 399     QDir dirbsolutePath(dir.absolutePath());
  410. 400     /* 如果目录存在 */
  411. 401     if (dirbsolutePath.exists()) {
  412. 402         /* 定义过滤器 */
  413. 403         QStringList filter;
  414. 404         /* 包含所有xx后缀的文件 */
  415. 405         filter << "*.mp4" << "*.mkv" << "*.wmv" << "*.avi";
  416. 406         /* 获取该目录下的所有文件 */
  417. 407         QFileInfoList files =
  418. 408                 dirbsolutePath.entryInfoList(filter, QDir::Files);
  419. 409         /* 遍历 */
  420. 410         for (int i = 0; i < files.count(); i++) {
  421. 411             MediaObjectInfo info;
  422. 412             /* 使用utf-8编码 */
  423. 413             info.fileName = QString::fromUtf8(files.at(i)
  424. 414                                               .fileName()
  425. 415                                               .toUtf8()
  426. 416                                               .data());
  427. 417             info.filePath = QString::fromUtf8(files.at(i)
  428. 418                                               .filePath()
  429. 419                                               .toUtf8()
  430. 420                                               .data());
  431. 421             /* 媒体列表添加视频 */
  432. 422             if (mediaPlaylist->addMedia(
  433. 423                         QUrl::fromLocalFile(info.filePath))) {
  434. 424                 /* 添加到容器数组里储存 */         
  435. 425                 mediaObjectInfo.append(info);
  436. 426                 /* 添加视频名字至列表 */
  437. 427                 listWidget->addItem(info.fileName);
  438. 428             } else {
  439. 429                 qDebug()<<
  440. 430                            mediaPlaylist->errorString()
  441. 431                            .toUtf8().data()
  442. 432                         << endl;
  443. 433                 qDebug()<< "  Error number:"
  444. 434                         << mediaPlaylist->error()
  445. 435                         << endl;
  446. 436             }
  447. 437         }
  448. 438     }
  449. 439 }
复制代码
       与上一小节音乐播放器的一样,在构造函数里布局初始化,然后执行扫描本地视频文件。之后就是一些信号槽的连接,基本上就是这么一个流程了。
       第395~439行,扫本地目录的视频文件,通过过滤文件名的后缀,将视频文件名添加至媒体列表里,就可以点击播放了,需要更多的格式的视频文件,可以自己尝试修改需要过滤的文件名。
       main       .cpp内容如下,主要是加载qss样式文件。没有什么可讲解。
  1. 1   #include "mainwindow.h"
  2. 2
  3. 3   #include <QApplication>
  4. 4   #include <QFile>
  5. 5
  6. 6   int main(int argc, char *argv[])
  7. 7   {
  8. 8       QApplication a(argc, argv);
  9. 9       /* 指定文件 */
  10. 10      QFile file(":/style.qss");
  11. 11
  12. 12      /* 判断文件是否存在 */
  13. 13      if (file.exists() ) {
  14. 14          /* 以只读的方式打开 */
  15. 15          file.open(QFile::ReadOnly);
  16. 16          /* 以字符串的方式保存读出的结果 */
  17. 17          QString styleSheet = QLatin1String(file.readAll());
  18. 18          /* 设置全局样式 */
  19. 19          qApp->setStyleSheet(styleSheet);
  20. 20          /* 关闭文件 */
  21. 21          file.close();
  22. 22      }
  23. 23
  24. 24      MainWindow w;
  25. 25      w.show();
  26. 26      return a.exec();
  27. 27  }
复制代码
style.qss样式文件如下。素材已经在源码处提供。注意下面的style.qss不能有注释!
  1. 1   QWidget {
  2. 2   border-image:url(:/images/bg.png);
  3. 3   }
  4. 4  
  5. 5   QLabel {
  6. 6   border-image:none;
  7. 7   }
  8. 8  
  9. 9   QWidget#hWidget1 {
  10. 10  border-image:none;
  11. 11  background:transparent;
  12. 12  }
  13. 13
  14. 14  QWidget#hWidget2 {
  15. 15  border-image:none;
  16. 16  background:transparent;
  17. 17  }
  18. 18
  19. 19  QWidget#vWidget1 {
  20. 20  border-image:url(:/images/mask.png);
  21. 21  background:#24252a;
  22. 22  }
  23. 23
  24. 24  QWidget#vWidget0 {
  25. 25  border-image:none;
  26. 26  }
  27. 27
  28. 28  QListWidget#listWidget {
  29. 29  color:white;
  30. 30  font-size: 15px;
  31. 31  border:none;
  32. 32  background: "#20ffffff";
  33. 33  border-image:none;
  34. 34  }
  35. 35
  36. 36  QListWidgetlistWidget:item:active {
  37. 37  background: transparent;
  38. 38  }
  39. 39
  40. 40  QListWidget#listWidget:item {
  41. 41  background: transparent;
  42. 42  height:60;
  43. 43  }
  44. 44
  45. 45  QListWidget#listWidget:item:selected {
  46. 46  color:#5edcf3;
  47. 47  background: transparent;
  48. 48  }
  49. 49
  50. 50  QListWidget#listWidget:item:hover {
  51. 51  background: transparent;
  52. 52  color:#5edcf3;
  53. 53  border:none;
  54. 54  }
  55. 55
  56. 56
  57. 57  QPushButton#btn_play {
  58. 58  border-image:url(:/icons/btn_play1.png);
  59. 59  }
  60. 60
  61. 61  QPushButton#btn_play:hover {
  62. 62  border-image:url(:/icons/btn_play2.png);
  63. 63  }
  64. 64
  65. 65  QPushButton#btn_play:checked {
  66. 66  border-image:url(:/icons/btn_pause1.png);
  67. 67  }
  68. 68
  69. 69  QPushButton#btn_play:checked:hover {
  70. 70  border-image:url(:/icons/btn_pause2.png);
  71. 71  }
  72. 72
  73. 73  QPushButton#btn_next {
  74. 74  border-image:url(:/icons/btn_next1.png);
  75. 75  }
  76. 76
  77. 77  QPushButton#btn_next:hover {
  78. 78  border-image:url(:/icons/btn_next2.png);
  79. 79  }
  80. 80
  81. 81  QPushButton#btn_volumedown {
  82. 82  border-image:url(:/icons/btn_volumedown1.png);
  83. 83  }
  84. 84
  85. 85  QPushButton#btn_volumedown:hover {
  86. 86  border-image:url(:/icons/btn_volumedown2.png);
  87. 87  }
  88. 88
  89. 89  QPushButton#btn_volumeup {
  90. 90  border-image:url(:/icons/btn_volumeup1.png);
  91. 91  }
  92. 92
  93. 93  QPushButton#btn_volumeup:hover {
  94. 94  border-image:url(:/icons/btn_volumeup2.png);
  95. 95  }
  96. 96
  97. 97  QSlider#durationSlider:handle:horizontal {
  98. 98  border-image:url(:/icons/handle.png);
  99. 99  }
  100. 100
  101. 101 QSlider#durationSlider {
  102. 102 border-image:none;
  103. 103 }
  104. 104
  105. 105 QSlider#durationSlider:add-page:horizontal {
  106. 106 border-image:url(:/images/add_page.png);
  107. 107 }
  108. 108
  109. 109 QSlider#volumeSlider {
  110. 110 border-image:none;
  111. 111 }
  112. 112 QSlider#volumeSlider:handle:horizontal {
  113. 113 border-image:url(:/icons/handle.png);
  114. 114 }
  115. 115
  116. 116 QSlider#volumeSlider:handle:horizontal {
  117. 117 background:transparent;
  118. 118 }
  119. 119
  120. 120 QSlider#volumeSlider:add-page:horizontal {
  121. 121 border-image:url(:/images/add_page.png);
  122. 122 }
  123. 123
  124. 124 QPushButton#btn_screen {
  125. 125 border-image:url(:/icons/btn_fullscreen1.png);
  126. 126 }
  127. 127
  128. 128 QPushButton#btn_screen:hover {
  129. 129 border-image:url(:/icons/btn_fullscreen2.png);
  130. 130 }
  131. 131
  132. 132 QPushButton#btn_screen:checked {
  133. 133 border-image:url(:/icons/btn_screen1.png);
  134. 134 }
  135. 135
  136. 136 QPushButton#btn_screen:checked:hover {
  137. 137 border-image:url(:/icons/btn_screen2.png);
  138. 138 }
复制代码
第十一章12.4.2 程序运行效果
先点击构建项目,项目构建完成后,再将本例的myVideo视频文件夹拷贝到可执行程序的文件夹同一级目录下,也就是build-15_videoplayer-Desktop_Qt_5_12_9_GCC_64bit-Debug目录下。再重新运行,就出现视频文件在列表里,如下图,点击播放即可播放视频。
默认列表,未播放前。
image006.jpg
    开始播放,未全屏状态
image008.jpg
   全屏状态。
image010.jpg

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-1-19 08:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表