多媒体

视频播放器

与音乐播放器一样使用 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 目录
下。再重新运行,就出现视频文件在列表里,如下图,点击播放即可播放视频。

默认列表,未播放前。


开始播放,未全屏状态。

全屏状态。

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

  1. Qt开发笔记(一):Qt+FFmpeg开发环境搭建以及工程模板

    原博主博客地址:https://blog.csdn.net/qq21497936 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/90 ...

  2. Qt开发笔记之Qwt(二):Qwt仪表盘的基本使用

    若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/ ...

  3. 【QT开发笔记-基础篇】| 第二章 常用控件 | 2.12 表格控件 QTableWidget

    本节对应的视频讲解:B_站_链_接 QTableWidget 是 Qt 中的表格控件,可以行列的形式来展示数据 1. 属性和方法 QTableWidget 有很多属性和方法,完整的可查看帮助文档. 在 ...

  4. Matlab+Qt开发笔记(一):matlab搭建Qt开发matlib环境以及Demo测试

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/120979753 长期持续带来更多技术分享,定制咨询QQ ...

  5. Qt开发笔记之Qwt(一):Qwt介绍、编译与Demo

    若该文为原创文章,未经允许不得转载 原博主博客地址:长沙红胖子_长沙红胖子网络科技有限公司_CSDN博客 原博主博客导航:红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术.树莓派.三维.Op ...

  6. QT开发笔记(多媒体)

    多媒体 多媒体(Multimedia)是多种媒体的综合,一般包括文本,声音和图像等多种媒体形式. 在计算机系统中,多媒体指组合两种或两种以上媒体的一种人机交互式信息交流和传播媒体. 使用的媒体包括文字 ...

  7. 【QT开发笔记-基础篇】| 第一章 QT入门 | 1.2 搭建Qt开发环境

    本节对应的视频讲解:B_站_链_接 https://www.bilibili.com/video/BV1Pr4y1x7fh Qt 开发主要有两种开发环境 Qt Creator 它是 Qt 官方提供的开 ...

  8. 【QT开发笔记-基础篇】| 第一章 QT入门 | 1.1 为什么要学习Qt

    本节对应的视频讲解:B_站_链_接 https://www.bilibili.com/video/BV1334y1776z Qt 是一个跨平台的 C++ 图形用户界面应用程序框架 Qt 为应用程序开发 ...

  9. 【QT开发笔记-基础篇】| 第五章 绘图QPainter | 5.1 效果演示、技术点

    本节对应的视频讲解:B_站_视_频 https://www.bilibili.com/video/BV14P4y197pi Qt 中绘图用到的类是 QPainter,可以实现点.线.矩形.圆形.多边形 ...

最新文章

  1. Blend_ControlTemplate(Z)
  2. 关于程序员之间丧心病狂的鄙视链——编程语言篇
  3. web和mysql连接并增删改查_Java Web 使用IDEA对mysql数据库进行简单增删改查操作(附源码下载)...
  4. 【bzoj5427】最长上升子序列(贪心+LIS)
  5. [原译]11个高效的VS调试技巧
  6. hdu 6301 Distinct Values(贪心)题解
  7. [转贴]暴雪的霸王条款是否合理?
  8. SQL Server 索引结构及其使用(三)(转)
  9. YOLOv3使用自己数据集——Kmeans聚类计算anchor boxes
  10. 新松机器人BG总裁高峰_青春,就是用来奋斗的——记沈阳新松机器人自动化股份有限公司创始人兼总裁曲道奎...
  11. VS2012一打开就停止工作的解决方法
  12. Struts2理解--动态方法和method属性及通配符_默认Action
  13. DB2中修改表字段类型或者长度
  14. 计算机电路电子技术试题答案,数字电子技术基础试题及答案
  15. TCP自时钟/拥塞控制/带宽利用之脉络半景解析
  16. 计算机网络验证性实验-棋歌教学网
  17. html中form表单的使用方法和介绍
  18. 使用Google Analytics(分析)进行用户体验研究的5种方法
  19. 42条微信营销小技巧!
  20. python手绘效果图_用Python做个海量小姐姐素描图

热门文章

  1. js + jquery 两栏Tab鼠标移入显示/隐藏的效果(详)
  2. 欠债还钱,天经地义(二)
  3. python转json的函数_python将字符串转换成json的方法小结
  4. ctfshow七夕杯 writeup
  5. ajax localhsot,ajax请求nodejs后台,开启服务器后,localhost:3000/index.html页面既没有报错,也没有文字。。。...
  6. db2怎么恢复误删除的数据_db2数据库被误删后 oracle数据库误删数据恢复
  7. 3-----A Forcast for Bicycle Rental Demand Based on Random Forests and Multiple Linear Regression
  8. luogu P2852 [USACO06DEC]牛奶模式Milk Patterns
  9. phpspreadsheet excel导入导出
  10. c语言怎么取字符串首字母,C语言 字符串首字母转换成大写简单实例