QT开发笔记(多媒体实例之视频播放器)

多媒体

视频播放器

与音乐播放器一样使用 QMediaPlayer 类,不同的是需要使用 setVideoOutput(QVideoWidget*)

设置一个视频输出窗口,好让视频在此窗口显示,其他步骤基本都一样。

应用实例

本例设计一个比较好看且简洁的视频播放器,界面是笔者原创界面。

本例目的:视频播放器的设计与使用。

例 15_videoplayer,视频播放器(难度:中等)。项目路径为 Qt/2/15_videoplayer。注意本例
有用到 qss 样式文件,关于如何添加资源文件与 qss 文件请参考 7.1.3 小节。音乐播放器的功能
这些都为大家所熟知,不用笔者介绍了。

项目文件 15_videoplayer.pro 文件第一行添加的代码部分如下。

15_videoplayer.pro 编程后的代码

1 QT += core gui multimedia multimediawidgets 

2 

3 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 

4 

5 CONFIG += c++11 

6 

7 # The following define makes your compiler emit warnings if you use 

8 # any Qt feature that has been marked deprecated (the exact warnings 

9 # depend on your compiler). Please consult the documentation of the 

10 # deprecated API in order to know how to port your code away from it. 

11 DEFINES += QT_DEPRECATED_WARNINGS 

12 

13 # You can also make your code fail to compile if it uses deprecated APIs. 

14 # In order to do so, uncomment the following line. 

15 # You can also select to disable deprecated APIs only up to a certain 
version of Qt. 

16 #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the 
APIs deprecated before Qt 6.0.0 

17 

18 SOURCES += \ 

19 main.cpp \ 

20 mainwindow.cpp 

21 

22 HEADERS += \ 

23 mainwindow.h 

24 

25 # Default rules for deployment. 

26 qnx: target.path = /tmp/$${TARGET}/bin 

27 else: unix:!android: target.path = /opt/$${TARGET}/bin 

28 !isEmpty(target.path): INSTALLS += target 

29 

30 RESOURCES += \ 

31 res.qrc 

在头文件“mainwindow.h”具体代码如下。

mainwindow.h 编程后的代码

 /****************************************************************** 
 Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved. 
 * @projectName 15_videoplayer 
 * * @brief mainwindow.h 
 * @author Deng Zhimao 
 * @email 1252699831@qq.com 
 * @net www.openedv.com 
 * @date 2021-04-27 
 *******************************************************************/ 

1 #ifndef MAINWINDOW_H 

2 #define MAINWINDOW_H 

3 

4 #include <QMainWindow> 

5 #include <QMediaPlayer> 

6 #include <QMediaPlaylist> 

7 #include <QPushButton> 

8 #include <QSlider> 

9 #include <QVBoxLayout> 

10 #include <QHBoxLayout> 

11 #include <QListWidget> 

12 #include <QLabel> 

13 #include <QSpacerItem> 

14 #include <QVideoWidget> 

15 #include <QDebug> 

16 

17 /* 媒体信息结构体 */ 

18 struct MediaObjectInfo { 

19 /* 用于保存视频文件名 */ 

20 QString fileName; 

21 /* 用于保存视频文件路径 */ 

22 QString filePath; 

23 }; 

24 

25 class MainWindow : public QMainWindow 

26 { 

27 Q_OBJECT 

28 

29 public: 

30 MainWindow(QWidget *parent = nullptr); 

31 ~MainWindow(); 

32 

33 private: 

34 /* 媒体播放器,用于播放视频 */ 

35 QMediaPlayer *videoPlayer; 

36 

37 /* 媒体列表 */ 

38 QMediaPlaylist *mediaPlaylist; 

39 

40 /* 视频显示窗口 */ 

41 QVideoWidget *videoWidget; 

42 

43 /* 视频列表 */ 

44 QListWidget *listWidget; 

45 

46 /* 播放进度条 */ 

47 QSlider *durationSlider; 

48 

49 /* 音量条 */ 

50 QSlider *volumeSlider; 

51 

52 /* 视频播放器按钮 */ 

53 QPushButton *pushButton[5]; 

54 

55 /* 水平布局 */ 

56 QHBoxLayout *hBoxLayout[3]; 

57 

58 /* 水平容器 */ 

59 QWidget *hWidget[3]; 

60 

61 /* 标签文本 */ 

62 QLabel *label[2]; 

63 

64 /* 垂直容器 */ 

65 QWidget *vWidget[2]; 

66 

67 /* 垂直界面 */ 

68 QVBoxLayout *vBoxLayout[2]; 

69 

70 /* 视频布局函数 */ 

71 void videoLayout(); 

72 

73 /* 主窗体大小重设大小函数重写 */ 

74 void resizeEvent(QResizeEvent *event); 

75 

76 /* 媒体信息存储 */ 

77 QVector<MediaObjectInfo> mediaObjectInfo; 

78 

79 /* 扫描本地视频文件 */ 

80 void scanVideoFiles(); 

81 

82 /* 媒体初始化 */ 

83 void mediaPlayerInit(); 

84 private slots: 

85 /* 播放按钮点击 */ 

86 void btn_play_clicked(); 

87 

88 /* 下一个视频按钮点击 */ 

89 void btn_next_clicked(); 

90 

91 /* 音量加 */ 

92 void btn_volmeup_clicked(); 

93 

94 /* 音量减 */ 

95 void btn_volmedown_clicked(); 

96 

97 /* 全屏 */ 

98 void btn_fullscreen_clicked(); 

99 

100 /* 媒体状态改变 */ 

101 void mediaPlayerStateChanged(QMediaPlayer::State); 

102 

103 /* 列表单击 */ 

104 void listWidgetCliked(QListWidgetItem*); 

105 

106 /* 媒体列表项改变 */ 

107 void mediaPlaylistCurrentIndexChanged(int); 

108 

109 /* 媒体总长度改变 */ 

110 void musicPlayerDurationChanged(qint64); 

111 

112 /* 媒体播放位置改变 */ 

113 void mediaPlayerPositionChanged(qint64); 

114 

115 /* 播放进度条松开 */ 

116 void durationSliderReleased(); 

117 

118 /* 音量条松开 */ 

119 void volumeSliderReleased(); 

120 }; 

121 #endif // MAINWINDOW_H 

头文件里主要是声明界面所使用的元素及一些槽函数。

在源文件“mainwindow.cpp”具体代码如下。

mainwindow.cpp 编程后的代码

 /****************************************************************** 
 Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved. 
 * @projectName 15_videoplayer 
 * @brief mainwindow.cpp 
 * @author Deng Zhimao 
 * @email 1252699831@qq.com 
 * @net www.openedv.com 
 * @date 2021-04-27 
 *******************************************************************/ 

1 #include "mainwindow.h" 

2 #include <QCoreApplication> 

3 #include <QFileInfoList> 

4 #include <QDir> 

5 

6 MainWindow::MainWindow(QWidget *parent) 

7 : QMainWindow(parent) 

8 { 

9 /* 视频播放器布局初始化 */ 

10 videoLayout(); 

11 

12 /* 媒体初始化 */ 

13 mediaPlayerInit(); 

14 

15 /* 扫描本地视频 */ 

16 scanVideoFiles(); 

17 

18 /* 设置按钮的属性 */ 

19 pushButton[0]->setCheckable(true); 

20 pushButton[4]->setCheckable(true); 

21 

22 /* 按钮连接信号槽 */ 

23 connect(pushButton[0], SIGNAL(clicked()), 

24 this, SLOT(btn_play_clicked())); 

25 connect(pushButton[1], SIGNAL(clicked()), 

26 this, SLOT(btn_next_clicked())); 

27 connect(pushButton[2], SIGNAL(clicked()), 

28 this, SLOT(btn_volmedown_clicked())); 

29 connect(pushButton[3], SIGNAL(clicked()), 

30 this, SLOT(btn_volmeup_clicked())); 

31 connect(pushButton[4], SIGNAL(clicked()), 

32 this, SLOT(btn_fullscreen_clicked())); 

33 

34 /* 列表连接信号槽 */ 

35 connect(listWidget, SIGNAL(itemClicked(QListWidgetItem*)), 

36 this, SLOT(listWidgetCliked(QListWidgetItem*))); 

37 

38 /* 媒体连接信号槽 */ 

39 connect(videoPlayer, 

40 SIGNAL(stateChanged(QMediaPlayer::State)), 

41 this, 

42 SLOT(mediaPlayerStateChanged(QMediaPlayer::State))); 

43 connect(mediaPlaylist, 

44 SIGNAL(currentIndexChanged(int)), 

45 this, 

46 SLOT(mediaPlaylistCurrentIndexChanged(int))); 

47 connect(videoPlayer, SIGNAL(durationChanged(qint64)), 

48 this, 

49 SLOT(musicPlayerDurationChanged(qint64))); 

50 connect(videoPlayer, 

51 SIGNAL(positionChanged(qint64)), 

52 this, 

53 SLOT(mediaPlayerPositionChanged(qint64))); 

54 

55 /* slider 信号槽连接 */ 

56 connect(durationSlider, SIGNAL(sliderReleased()), 

57 this, SLOT(durationSliderReleased())); 

58 connect(volumeSlider, SIGNAL(sliderReleased()), 

59 this, SLOT(volumeSliderReleased())); 

60 } 

61 

62 MainWindow::~MainWindow() 

63 { 

64 } 

65 

66 void MainWindow::videoLayout() 

67 { 

68 /* 设置位置与大小,这里固定为 800, 480 */ 

69 this->setGeometry(0, 0, 800, 480); 

70 // this->setMinimumSize(800, 480); 

71 // this->setMaximumSize(800, 480); 

72 QPalette pal; 

73 pal.setColor(QPalette::WindowText, Qt::white); 

74 

75 for (int i = 0; i < 3; i++) {

76 /* 水平容器 */ 

77 hWidget[i] = new QWidget(); 

78 hWidget[i]->setAutoFillBackground(true); 

79 /* 水平布局 */ 

80 hBoxLayout[i] = new QHBoxLayout(); 

81 } 

82 

83 for (int i = 0; i < 2; i++) { 

84 /* 垂直容器 */ 

85 vWidget[i] = new QWidget(); 

86 vWidget[i]->setAutoFillBackground(true); 

87 /* 垂直布局 */ 

88 vBoxLayout[i] = new QVBoxLayout(); 

89 } 

90 

91 for (int i = 0; i < 2; i++) { 

92 label[i] = new QLabel(); 

93 } 

94 

95 for (int i = 0; i < 5; i++) { 

96 pushButton[i] = new QPushButton(); 

97 pushButton[i]->setMaximumSize(44, 44); 

98 pushButton[i]->setMinimumSize(44, 44); 

99 } 

100 

101 /* 设置 */ 

102 vWidget[0]->setObjectName("vWidget0"); 

103 vWidget[1]->setObjectName("vWidget1"); 

104 hWidget[1]->setObjectName("hWidget1"); 

105 hWidget[2]->setObjectName("hWidget2"); 

106 pushButton[0]->setObjectName("btn_play"); 

107 pushButton[1]->setObjectName("btn_next"); 

108 pushButton[2]->setObjectName("btn_volumedown"); 

109 pushButton[3]->setObjectName("btn_volumeup"); 

110 pushButton[4]->setObjectName("btn_screen"); 

111 

112 QFont font; 

113 

114 font.setPixelSize(18); 

115 label[0]->setFont(font); 

116 label[1]->setFont(font); 

117 

118 pal.setColor(QPalette::WindowText, Qt::white); 

119 label[0]->setPalette(pal); 

120 label[1]->setPalette(pal); 

121 

122 label[0]->setText("00:00"); 

123 label[1]->setText("/00:00"); 

124 

125 durationSlider = new QSlider(Qt::Horizontal); 

126 durationSlider->setMaximumHeight(15); 

127 durationSlider->setObjectName("durationSlider"); 

128 

129 volumeSlider = new QSlider(Qt::Horizontal); 

130 volumeSlider->setRange(0, 100); 

131 volumeSlider->setMaximumWidth(80); 

132 volumeSlider->setObjectName("volumeSlider"); 

133 volumeSlider->setValue(50); 

134 

135 listWidget = new QListWidget(); 

136 listWidget->setObjectName("listWidget"); 

137 listWidget->setVerticalScrollBarPolicy( 

138 Qt::ScrollBarAlwaysOff); 

139 listWidget->setHorizontalScrollBarPolicy( 

140 Qt::ScrollBarAlwaysOff); 

141 //listWidget->setFocusPolicy(Qt::NoFocus); 

142 videoWidget = new QVideoWidget(); 

143 videoWidget->setStyleSheet("border-image: none;" 

144 "background: transparent;" 

145 "border:none"); 

146 

147 /* H0 布局 */ 

148 vWidget[0]->setMinimumSize(300, 480); 

149 vWidget[0]->setMaximumWidth(300); 

150 videoWidget->setMinimumSize(500, 480); 

151 

152 hBoxLayout[0]->addWidget(videoWidget); 

153 hBoxLayout[0]->addWidget(vWidget[0]); 

154 

155 hWidget[0]->setLayout(hBoxLayout[0]); 

156 hBoxLayout[0]->setContentsMargins(0, 0, 0, 0); 

157 

158 setCentralWidget(hWidget[0]); 

159 

160 /* V0 布局 */ 

161 QSpacerItem *vSpacer0 = new 

162 QSpacerItem(0, 80, 
163 QSizePolicy::Minimum, 

164 QSizePolicy::Maximum); 

165 vBoxLayout[0]->addWidget(listWidget); 

166 vBoxLayout[0]->addSpacerItem(vSpacer0); 

167 vBoxLayout[0]->setContentsMargins(0, 0, 0, 0); 

168 

169 vWidget[0]->setLayout(vBoxLayout[0]); 

170 

171 /* V1 布局 */ 

172 /* 底板部件布局 */ 

173 hWidget[1]->setMaximumHeight(15); 

174 hWidget[2]->setMinimumHeight(65); 

175 vBoxLayout[1]->addWidget(hWidget[1]); 

176 vBoxLayout[1]->addWidget(hWidget[2]); 

177 vBoxLayout[1]->setAlignment(Qt::AlignCenter); 

178 

179 vWidget[1]->setLayout(vBoxLayout[1]); 

180 vWidget[1]->setParent(this); 

181 vWidget[1]->setGeometry(0, this->height() - 80, this->width(), 80); 

182 vBoxLayout[1]->setContentsMargins(0, 0, 0, 0); 

183 /* 位于最上层 */ 

184 vWidget[1]->raise(); 

185 

186 /* H1 布局 */ 

187 hBoxLayout[1]->addWidget(durationSlider); 

188 hBoxLayout[1]->setContentsMargins(0, 0, 0, 0); 

189 hWidget[1]->setLayout(hBoxLayout[1]); 

190 

191 /* H2 布局 */ 

192 QSpacerItem *hSpacer0 = new 

193 QSpacerItem(300, 80, 

194 QSizePolicy::Expanding, 

195 QSizePolicy::Maximum); 

196 

197 hBoxLayout[2]->addSpacing(20); 

198 hBoxLayout[2]->addWidget(pushButton[0]); 

199 hBoxLayout[2]->addSpacing(10); 

200 hBoxLayout[2]->addWidget(pushButton[1]); 

201 hBoxLayout[2]->addSpacing(10); 

202 hBoxLayout[2]->addWidget(pushButton[2]); 

203 hBoxLayout[2]->addWidget(volumeSlider); 

204 hBoxLayout[2]->addWidget(pushButton[3]); 

205 hBoxLayout[2]->addWidget(label[0]); 

206 hBoxLayout[2]->addWidget(label[1]); 

207 hBoxLayout[2]->addSpacerItem(hSpacer0); 

208 hBoxLayout[2]->addWidget(pushButton[4]); 

209 hBoxLayout[2]->addSpacing(20); 

210 hBoxLayout[2]->setContentsMargins(0, 0, 0, 0); 

211 hBoxLayout[2]->setAlignment(Qt::AlignLeft | Qt::AlignTop); 

212 

213 hWidget[2]->setLayout(hBoxLayout[2]); 

214 } 

215 

216 void MainWindow::mediaPlayerInit() 

217 { 

218 videoPlayer = new QMediaPlayer(this); 

219 mediaPlaylist = new QMediaPlaylist(this); 

220 /* 确保列表是空的 */ 

221 mediaPlaylist->clear(); 

222 /* 设置视频播放器的列表为 mediaPlaylist */ 

223 videoPlayer->setPlaylist(mediaPlaylist); 

224 /* 设置视频输出窗口 */ 

225 videoPlayer->setVideoOutput(videoWidget); 

226 /* 设置播放模式,Loop 是列循环 */ 

227 mediaPlaylist->setPlaybackMode(QMediaPlaylist::Loop); 

228 /* 设置默认软件音量为 50% */ 

229 videoPlayer->setVolume(50); 

230 } 

231 

232 void MainWindow::resizeEvent(QResizeEvent *event) 

233 { 

234 Q_UNUSED(event); 

235 vWidget[1]->setGeometry(0, this->height() - 80, this->width(), 80); 

236 } 

237 

238 void MainWindow::btn_play_clicked() 

239 { 

240 int state = videoPlayer->state(); 

241 switch (state) { 

242 case QMediaPlayer::StoppedState: 

243 /* 媒体播放 */ 

244 videoPlayer->play(); 

245 break; 

246 

247 case QMediaPlayer::PlayingState: 

248 /* 媒体暂停 */ 

249 videoPlayer->pause(); 

250 break; 

251 

252 case QMediaPlayer::PausedState: 

253 /* 设置视频输出窗口 */ 

254 videoPlayer->play(); 

255 break; 

256 } 

257 } 

258 

259 void MainWindow::btn_next_clicked() 

260 { 

261 videoPlayer->stop(); 

262 int count = mediaPlaylist->mediaCount(); 

263 if (0 == count) 

264 return; 

265 

266 /* 列表下一个 */ 

267 mediaPlaylist->next(); 

268 videoPlayer->play(); 

269 } 

270 

271 void MainWindow::btn_volmeup_clicked() 

272 { 

273 /* 点击每次音量+5 */ 

274 volumeSlider->setValue(volumeSlider->value() + 5); 

275 videoPlayer->setVolume(volumeSlider->value()); 

276 } 

277 

278 void MainWindow::btn_fullscreen_clicked() 

279 { 

280 /* 全屏/非全屏操作 */ 

281 vWidget[0]->setVisible(!pushButton[4]->isChecked()); 

282 } 

283 

284 void MainWindow::btn_volmedown_clicked() 

285 { 

286 /* 点击每次音量-5 */ 

287 volumeSlider->setValue(volumeSlider->value() - 5); 

288 videoPlayer->setVolume(volumeSlider->value()); 

289 } 

290 

291 void MainWindow::mediaPlayerStateChanged( 

292 QMediaPlayer::State 

293 state) 

294 { 

295 switch (state) { 

296 case QMediaPlayer::StoppedState: 

297 pushButton[0]->setChecked(false); 

298 break; 

299 

300 case QMediaPlayer::PlayingState: 

301 pushButton[0]->setChecked(true); 

302 break; 

303 

304 case QMediaPlayer::PausedState: 

305 pushButton[0]->setChecked(false); 

306 break; 

307 } 

308 } 

309 

310 void MainWindow::listWidgetCliked(QListWidgetItem *item) 

311 { 

312 videoPlayer->stop(); 

313 mediaPlaylist->setCurrentIndex(listWidget->row(item)); 

314 videoPlayer->play(); 

315 } 

316 

317 void MainWindow::mediaPlaylistCurrentIndexChanged( 

318 int index) 

319 { 

320 if (-1 == index) 

321 return; 

322 

323 /* 设置列表正在播放的项 */ 

324 listWidget->setCurrentRow(index); 

325 } 

326 

327 void MainWindow::musicPlayerDurationChanged( 

328 qint64 duration) 

329 { 

330 durationSlider->setRange(0, duration / 1000); 

331 int second = duration / 1000; 

332 int minute = second / 60; 

333 second %= 60; 

334 

335 QString mediaDuration; 

336 mediaDuration.clear(); 

337 

338 if (minute >= 10) 

339 mediaDuration = QString::number(minute, 10); 

340 else 

341 mediaDuration = "0" + QString::number(minute, 10); 

342 

343 if (second >= 10) 

344 mediaDuration = mediaDuration 

345 + ":" + QString::number(second, 10); 

346 else 

347 mediaDuration = mediaDuration 

348 + ":0" + QString::number(second, 10); 

349 

350 /* 显示媒体总长度时间 */ 

351 label[1]->setText("/" + mediaDuration); 

352 } 

353 

354 void MainWindow::mediaPlayerPositionChanged( 

355 qint64 position) 

356 { 

357 if (!durationSlider->isSliderDown()) 

358 durationSlider->setValue(position / 1000); 

359 

360 int second = position / 1000; 

361 int minute = second / 60; 

362 second %= 60; 

363 

364 QString mediaPosition; 

365 mediaPosition.clear(); 

366 

367 if (minute >= 10) 

368 mediaPosition = QString::number(minute, 10); 

369 else 

370 mediaPosition = "0" + QString::number(minute, 10); 

371 

372 if (second >= 10) 

373 mediaPosition = mediaPosition 

374 + ":" + QString::number(second, 10); 

375 else 

376 mediaPosition = mediaPosition 

377 + ":0" + QString::number(second, 10); 

378 

379 /* 显示现在播放的时间 */ 

380 label[0]->setText(mediaPosition); 

381 } 

382 

383 void MainWindow::durationSliderReleased() 

384 { 

385 /* 设置媒体播放的位置 */ 

386 videoPlayer->setPosition(durationSlider->value() * 1000); 

387 } 

388 

389 void MainWindow::volumeSliderReleased() 

390 { 

391 /* 设置音量 */ 

392 videoPlayer->setVolume(volumeSlider->value()); 

393 } 

394 

395 void MainWindow::scanVideoFiles() 

396 { 

397 QDir dir(QCoreApplication::applicationDirPath() 

398 + "/myVideo"); 

399 QDir dirbsolutePath(dir.absolutePath()); 

400 /* 如果目录存在 */ 

401 if (dirbsolutePath.exists()) { 

402 /* 定义过滤器 */ 

403 QStringList filter; 

404 /* 包含所有 xx 后缀的文件 */ 

405 filter << "*.mp4" << "*.mkv" << "*.wmv" << "*.avi"; 

406 /* 获取该目录下的所有文件 */ 

407 QFileInfoList files = 

408 dirbsolutePath.entryInfoList(filter, QDir::Files); 

409 /* 遍历 */ 

410 for (int i = 0; i < files.count(); i++) { 

411 MediaObjectInfo info; 

412 /* 使用 utf-8 编码 */ 

413 info.fileName = QString::fromUtf8(files.at(i) 

414 .fileName() 

415 .toUtf8() 

416 .data()); 

417 info.filePath = QString::fromUtf8(files.at(i) 

418 .filePath() 

419 .toUtf8() 

420 .data()); 

421 /* 媒体列表添加视频 */ 

422 if (mediaPlaylist->addMedia( 

423 QUrl::fromLocalFile(info.filePath))) { 

424 /* 添加到容器数组里储存 */ 

425 mediaObjectInfo.append(info); 

426 /* 添加视频名字至列表 */ 

427 listWidget->addItem(info.fileName); 

428 } else { 

429 qDebug()<< 

430 mediaPlaylist->errorString() 

431 .toUtf8().data() 

432 << endl; 

433 qDebug()<< " Error number:" 

434 << mediaPlaylist->error() 

435 << endl; 

436 } 

437 } 

438 } 

439 } 

与上一小节音乐播放器的一样,在构造函数里布局初始化,然后执行扫描本地视频文件。
之后就是一些信号槽的连接,基本上就是这么一个流程了。
第 395~439 行,扫本地目录的视频文件,通过过滤文件名的后缀,将视频文件名添加至媒
体列表里,就可以点击播放了,需要更多的格式的视频文件,可以自己尝试修改需要过滤的文
件名。
main.cpp 内容如下,主要是加载 qss 样式文件。没有什么可讲解。

1 #include "mainwindow.h" 

2 

3 #include <QApplication> 

4 #include <QFile> 

5 

6 int main(int argc, char *argv[]) 

7 { 

8 QApplication a(argc, argv); 

9 /* 指定文件 */ 

10 QFile file(":/style.qss"); 

11 

12 /* 判断文件是否存在 */ 

13 if (file.exists() ) { 

14 /* 以只读的方式打开 */ 

15 file.open(QFile::ReadOnly); 

16 /* 以字符串的方式保存读出的结果 */ 

17 QString styleSheet = QLatin1String(file.readAll()); 

18 /* 设置全局样式 */ 

19 qApp->setStyleSheet(styleSheet); 

20 /* 关闭文件 */ 

21 file.close(); 

22 } 

23 

24 MainWindow w; 

25 w.show(); 

26 return a.exec(); 

27 } 

style.qss 样式文件如下。素材已经在源码处提供。注意下面的 style.qss 不能有注释!

1 QWidget { 

2 border-image:url(:/images/bg.png); 

3 } 

4 

5 QLabel { 

6 border-image:none; 

7 } 

8 

9 QWidget#hWidget1 { 

10 border-image:none; 

11 background:transparent; 

12 } 

13 

14 QWidget#hWidget2 { 

15 border-image:none; 

16 background:transparent; 

17 } 

18 

19 QWidget#vWidget1 { 

20 border-image:url(:/images/mask.png); 

21 background:#24252a; 

22 } 

23 

24 QWidget#vWidget0 { 

25 border-image:none; 

26 } 

27 

28 QListWidget#listWidget { 

29 color:white; 

30 font-size: 15px; 

31 border:none; 

32 background: "#20ffffff"; 

33 border-image:none; 

34 } 

35 

36 QListWidgetlistWidget:item:active { 

37 background: transparent; 

38 } 

39 

40 QListWidget#listWidget:item { 

41 background: transparent; 

42 height:60; 

43 } 

44 

45 QListWidget#listWidget:item:selected { 

46 color:#5edcf3; 

47 background: transparent; 

48 } 

49 

50 QListWidget#listWidget:item:hover { 

51 background: transparent; 

52 color:#5edcf3; 

53 border:none; 

54 } 

55 

56 

57 QPushButton#btn_play { 

58 border-image:url(:/icons/btn_play1.png); 

59 } 

60 

61 QPushButton#btn_play:hover { 

62 border-image:url(:/icons/btn_play2.png); 

63 } 

64 

65 QPushButton#btn_play:checked { 

66 border-image:url(:/icons/btn_pause1.png); 

67 } 

68 

69 QPushButton#btn_play:checked:hover { 

70 border-image:url(:/icons/btn_pause2.png); 

71 } 

72 

73 QPushButton#btn_next { 

74 border-image:url(:/icons/btn_next1.png); 

75 } 

76 

77 QPushButton#btn_next:hover { 

78 border-image:url(:/icons/btn_next2.png); 

79 }

80 

81 QPushButton#btn_volumedown { 

82 border-image:url(:/icons/btn_volumedown1.png); 

83 } 

84 

85 QPushButton#btn_volumedown:hover { 

86 border-image:url(:/icons/btn_volumedown2.png); 

87 } 

88 

89 QPushButton#btn_volumeup { 

90 border-image:url(:/icons/btn_volumeup1.png); 

91 } 

92 

93 QPushButton#btn_volumeup:hover { 

94 border-image:url(:/icons/btn_volumeup2.png); 

95 } 

96 

97 QSlider#durationSlider:handle:horizontal { 

98 border-image:url(:/icons/handle.png); 

99 } 

100 

101 QSlider#durationSlider { 

102 border-image:none; 

103 } 

104 

105 QSlider#durationSlider:add-page:horizontal { 

106 border-image:url(:/images/add_page.png); 

107 } 

108 

109 QSlider#volumeSlider { 

110 border-image:none; 

111 } 

112 QSlider#volumeSlider:handle:horizontal { 

113 border-image:url(:/icons/handle.png); 

114 } 

115 

116 QSlider#volumeSlider:handle:horizontal { 

117 background:transparent; 

118 } 

119 

120 QSlider#volumeSlider:add-page:horizontal { 

121 border-image:url(:/images/add_page.png); 

122 } 

123 
124 QPushButton#btn_screen { 

125 border-image:url(:/icons/btn_fullscreen1.png); 

126 } 

127 

128 QPushButton#btn_screen:hover { 

129 border-image:url(:/icons/btn_fullscreen2.png); 

130 } 

131 

132 QPushButton#btn_screen:checked { 

133 border-image:url(:/icons/btn_screen1.png); 

134 } 

135 

136 QPushButton#btn_screen:checked:hover { 

137 border-image:url(:/icons/btn_screen2.png); 

138 }

程序运行效果

先点击构建项目,项目构建完成后,再将本例的 myVideo 视频文件夹拷贝到可执行程序的
文件夹同一级目录下,也就是 build-15_videoplayer-Desktop_Qt_5_12_9_GCC_64bit-Debug 目录
下。再重新运行,就出现视频文件在列表里,如下图,点击播放即可播放视频。

默认列表,未播放前。

在这里插入图片描述
开始播放,未全屏状态。
在这里插入图片描述
全屏状态。
在这里插入图片描述

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Qt是一个跨平台的图形用户界面(GUI)开发工具集,可以用来开发各种应用程序,包括音视频播放器。 QMediaPlayerQt中的一个多媒体播放类,可以用来播放音频和视频文件。基于QMediaPlayer,我们可以开发一个功能完善的音视频播放器。 首先,我们可以使用QMediaPlayer提供的功能来实现基本的音视频播放控制,包括播放、暂停、停止、快进、快退等。我们可以通过按钮、菜单或者快捷键来触发相应的操作,或者可以根据用户的输入来实现自动播放和暂停。 其次,我们可以通过QMediaPlayer的信号和槽机制来实现一些附加功能。例如,当播放器播放完一个文件时,我们可以发出一个信号来通知用户,或者自动切换到下一个文件。我们还可以监听播放器的状态变化,例如播放、暂停、停止等,以便更新界面和提供相应的反馈信息。 此外,我们还可以使用QMediaPlayer的媒体查询功能来获取音视频文件的元数据,例如时长、作者、标题等信息,以及获取当前播放位置和进度。我们可以将这些信息显示在界面上,让用户获得更好的使用体验。 除了以上功能,我们还可以使用Qt提供的其他模块来增加更多的特性。例如,我们可以使用Qt Multimedia模块的QAudioProbe来实现音频波形显示,使用Qt MultimediaWidgets模块的QVideoWidget来实现视频播放区域,使用Qt Widgets模块的QSlider来实现音视频进度条等。 总之,基于QMediaPlayer开发,我们可以轻松实现一个功能完善的音视频播放器,满足用户对于音视频播放的基本需求,并且具备一定的扩展性,可以根据实际需求进行功能扩展和自定义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ManGo CHEN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值