linux系统中利用QT实现音乐播放器的功能

news2024/11/23 12:07:58

      大家好,今天主要和大家聊一聊,如何使用QT中的音乐播放器的功能与方法。

目录

第一:音乐播放器基本简介

第二:应用具体代码实现

第三:在源代码mainwindow.cpp中的实现

第四:程序运行效果


第一:音乐播放器基本简介

      QMediaPlayer类是一个高级媒体播放类。它可以用来播放歌曲、电影和网络广播等内容。一般用于播放 mp3 mp4 等等媒体文件。QMediaPlayer 类常常与 QMediaPlaylist 类一起使用。可以很轻松的设计一个自己喜欢的音乐播放器与视频播放器。QMediaPlayer 提供了很多信号,我们可以使用这些信号来完成音乐播放器的一系列操作,比如媒体状态改变的信号 stateChanged(QMediaPlayer::State state),判断这个 state 的状态就可以知道什么时候媒体暂停、播放、停止了。Qt 在媒体播放类已经提供了很多功能函数给我们使用,像直接使用 play()函数就可以实现音乐文件的播放,前提我们需要知道媒体文件的路径。pause() 函数可以直接暂停媒体播放等等,这些都可以在 Qt 帮助文档里查看 QMediaPlayer 类的使用方法就可以知道。

第二:应用具体代码实现

      接下来设计一个音乐播放器的界面,利用QT实现网上一个好看的音乐播放器的界面。其中有些功能没有完善。例如播放模式,没有音量控制等。

      在实现音乐播放器的时候需要在.pro文件的第一行添加部分代码如下:

 QT += core gui multimedia

       在头文件“mainwindow.h”中的具体代码实现

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 <QDebug>
15
16 /* 媒体信息结构体 */
17 struct MediaObjectInfo {
18 /* 用于保存歌曲文件名 */
19 QString fileName;
20 /* 用于保存歌曲文件路径 */
21 QString filePath;
22 };
23
24 class MainWindow : public QMainWindow
25 {
26 Q_OBJECT
27
28 public:
29 MainWindow(QWidget *parent = nullptr);
30 ~MainWindow();
31
32 private:
33 /* 媒体播放器,用于播放音乐 */
34 QMediaPlayer *musicPlayer;
35
36 /* 媒体列表 */
37 QMediaPlaylist *mediaPlaylist;
38
39 /* 音乐列表 */
40 QListWidget *listWidget;
41
42 /* 播放进度条 */
43 QSlider *durationSlider;

45 /* 音乐播放器按钮 */
46 QPushButton *pushButton[7];
47
48 /* 垂直布局 */
49 QVBoxLayout *vBoxLayout[3];
50
51 /* 水平布局 */
52 QHBoxLayout *hBoxLayout[4];
53
54 /* 垂直容器 */
55 QWidget *vWidget[3];
56
57 /* 水平容器 */
58 QWidget *hWidget[4];
59
60 /* 标签文本 */
61 QLabel *label[4];
62
63 /* 用于遮罩 */
64 QWidget *listMask;
65
66 /* 音乐布局函数 */
67 void musicLayout();
68
69 /* 主窗体大小重设大小函数重写 */
70 void resizeEvent(QResizeEvent *event);
71
72 /* 媒体信息存储 */
73 QVector<MediaObjectInfo> mediaObjectInfo;
74
75 /* 扫描歌曲 */
76 void scanSongs();
77
78 /* 媒体播放器类初始化 */
79 void mediaPlayerInit();
80
81 private slots:
82 /* 播放按钮点击 */
83 void btn_play_clicked();
84
85 /* 下一曲按钮点击*/
86 void btn_next_clicked();
87
88 /* 上一曲按钮点击 */
89 void btn_previous_clicked();
90
91 /* 媒体状态改变 */
92 void mediaPlayerStateChanged(QMediaPlayer::State);
93
94 /* 列表单击 */
95 void listWidgetCliked(QListWidgetItem*);
96
97 /* 媒体列表项改变 */
98 void mediaPlaylistCurrentIndexChanged(int);
99
100 /* 媒体总长度改变 */
101 void musicPlayerDurationChanged(qint64);
102
103 /* 媒体播放位置改变 */
104 void mediaPlayerPositionChanged(qint64);
105
106 /* 播放进度条松开 */
107 void durationSliderReleased();
108 };
109 #endif // MAINWINDOW_H

第三:在源代码mainwindow.cpp中的实现

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 musicLayout();
11
12 /* 媒体播放器初始化 */
13 mediaPlayerInit();
14
15 /* 扫描歌曲 */
16 scanSongs();
17
18 /* 按钮信号槽连接 */
19 connect(pushButton[0], SIGNAL(clicked()),
20 this, SLOT(btn_previous_clicked()));
21 connect(pushButton[1], SIGNAL(clicked()),
22 this, SLOT(btn_play_clicked()));
23 connect(pushButton[2], SIGNAL(clicked()),
24 this, SLOT(btn_next_clicked()));
25
26 /* 媒体信号槽连接 */
27 connect(musicPlayer,
28 SIGNAL(stateChanged(QMediaPlayer::State)),
29 this,
30 SLOT(mediaPlayerStateChanged(QMediaPlayer::State)));
31 connect(mediaPlaylist,
32 SIGNAL(currentIndexChanged(int)),
33 this,
34 SLOT(mediaPlaylistCurrentIndexChanged(int)));
35 connect(musicPlayer, SIGNAL(durationChanged(qint64)),
36 this,
37 SLOT(musicPlayerDurationChanged(qint64)));
38 connect(musicPlayer,
39 SIGNAL(positionChanged(qint64)),
40 this,
41 SLOT(mediaPlayerPositionChanged(qint64)));
42
43 /* 列表信号槽连接 */
44 connect(listWidget, SIGNAL(itemClicked(QListWidgetItem*)),
45 this, SLOT(listWidgetCliked(QListWidgetItem*)));
46
47 /* slider 信号槽连接 */
48 connect(durationSlider, SIGNAL(sliderReleased()),
49 this, SLOT(durationSliderReleased()));
50/* 失去焦点 */
52 this->setFocus();
53 }

      由于代码较长,放置部分代码。

      分析:先建立好界面,确定好布局再实现功能,一般流程都这样布局 msuicLayout()的内容比较多,也不难,但是比较复杂,看这种布局是没有难度的,这里就不多解释了。没有好看的布局也能完成本例。如果您喜欢这种布局方法,您需要多花点时间去研究如何布局才好看,这些没有固定的方法,完全是一个人的审美感。

第四:程序运行效果

      先点击构建项目,项目构建完成后,再将本例的 myMusic 歌曲文件夹拷贝到可执行程序的文件夹同一级目录下,也就是 build-14_musicplayer-Desktop_Qt_5_12_9_GCC_64bit-Debug 目录 下(windows 需要进入到 debug 目录)。再点击运行,就出现歌曲在列表里,如下图,点击播放 即可播放歌曲,上一曲,下一曲也可以用。注意右下角的某些按钮功能,在本例没有继续去实 现,比如音量控制,可以直接加一个垂直方向的滑条,然后控制媒体的软件音量即可。留给读 者自由发挥,可以基于本例去开发,就当读者练习吧。本例的界面开发笔者还是比较满意的,前面的界面都比较普通,笔者个人 Qt 开发重要的是界面与稳定性,功能是次要的!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/157822.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1.1计算机工作过程(超详细)

文章目录一、计算机组成框图二、思维导图三、部件剖析&#xff08;1&#xff09;存储器&#xff08;2&#xff09;运算器&#xff08;3&#xff09;控制器四、案例剖析&#xff08;重点&#xff09;&#xff08;1&#xff09;a2&#xff08;2&#xff09;a*b&#xff08;3&…

关于 国产麒麟系统上长时间运行Qt程序.xsession-erros文件占满磁盘导致无法写入 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/128660728 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

[强网杯 2019]随便注

目录 信息收集 方法一&#xff1a;堆叠注入 方法二&#xff1a;MySQL预处理 语法 payload 方法三&#xff1a;handler 知识点 语法 payload 信息收集 1 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version f…

开发中常用的Spring注解

一.IOC容器 Configuration ConpoentScan CompoentScans Bean Import DependsOn Lazy Compoent Repository Service Controller Autowired Qualifier 二.AOP切面 Aspect Pointcut Before After AfterReturning AfterThrowing Around 三.事务声明 Transac…

nacos一:服务注册

为什么用nacos: Eureka需要自己搭建项目&#xff0c;nacos下载后&#xff0c;就可以直接访问web界面,自带负载均衡 Nacos可以 1替代eureka做服务注册中心 2替代Config做服务配置中心 使用 一&#xff1a; 1 下载nacos,在bin目录下打开cmd窗口&#xff0c;输入startup.cmd -m s…

100 亿美元!微软豪赌 AI,OpenAI 渗透 GitHub、Office、Bing

OpenAI 这把 ChatGPT 的火还在持续地燃烧&#xff01;作者 | 唐小引出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;今天&#xff0c;据路透社援引 Semafor 消息报道&#xff0c;微软正在计划向 OpenAI 再次投资 100 亿美元&#xff0c;如果合作达成&#xff0c;微…

【STM32学习】SysTick定时器(嘀嗒定时器)

SysTick定时器一、参考资料二、时钟源选择与定时时间计算1、时钟源选择2、定时时间计算三、SysTick_Handler中断服务函数一、参考资料 嘀嗒定时器&#xff1a;时钟源、寄存器 二、时钟源选择与定时时间计算 结合正点原子的代码进行说明&#xff1a; 1、时钟源选择 从上图可以发…

通讯录的实现(详解)(后附完整源代码)

通讯录的实现一.所需要的功能二.大致菜单三.创建通讯录四.增加联系人五.显示联系人六.查找联系人七.删除联系人八.修改联系人一.所需要的功能 对于通讯录来说&#xff0c;我们需要它实现以下几个功能。 1.人的信息&#xff1a;姓名年龄性别电话地址。 2.可以存放100个人的信息…

VMware Workstation Pro 16安装Windows 11

1&#xff1a;首先在机器中安装VMware Workstation Pro。 2&#xff1a;准备Windows 11的安装镜像。 3&#xff1a;安装Windows 11的系统要求&#xff0c;这个很关键不满足条件无法安装&#xff0c;其中我们只需要注意系统固件和TPM这两项就行。 4&#xff1a;运行VMware Wor…

使用SQL4Automation让CodeSYS连接数据库

使用SQL4Automation让CodeSYS连接数据库 摘要&#xff1a;本文旨在说明面向CodeSYS的数据库连接方案SQL4Automation的使用方法。 1.SQL4Automation简介 1.1.什么是SQL4Automation SQL4Automation是一套工业用途的软件解决方案&#xff0c;它主要的功能就是为PLC和机器人控制提…

王道操作系统笔记(一)———— 计算机系统概述

文章目录一、操作系统基本概念1.1 基本概念1.2 四大特征1.3 目标和功能二、操作系统的分类与发展三、操作系统的运行环境3.1 运行机制3.2 中断和异常3.3 系统调用四、操作系统的体系结构4.1 宏内核与微内核4.2 分层结构4.3 模块化4.4 外核五、操作系统引导六、虚拟机一、操作系…

nacos2.x集群版搭建

1. 预备环境准备 请确保是在环境中安装使用: 64 bit OS Linux/Unix/Mac&#xff0c;推荐使用Linux系统。--这里使用linux系统64 bit JDK 1.8&#xff1b;下载. 配置。Maven 3.2.x&#xff1b;下载. 配置。3个或3个以上Nacos节点才能构成集群。官网地址:集群部署说明 2、服务器…

Android 深入系统完全讲解(12)

11 跟踪一个服务&#xff0c;直接找到驱动实现 如果说我自己学习整个系统&#xff0c;直到底层驱动的方法&#xff0c;我想说的就是我常用的就是跟踪震动这个模块&#xff0c;而为什么是这个&#xff0c;主要是简单&#xff0c;但是又是从上到下都具备&#xff0c;对于学习系统…

【OpenCV】拾遗

前言 本篇博客主要是总结OpenCV使用过程中遇到的一些问题&#xff0c;便于以后参考。 以下所有内容均基于VS2015 OpenCV_v4.5.1 及 VS Code MinGW_v4.3.5 CMake_v3.20.0 OpenCV_v4.5.1&#xff0c;前者的配置教程可以参考这个链接&#xff0c;后者的配置教程可以参考这个链…

2022年衣物清洁行业市场报告:洗衣液等四大高增长类目分析

随着人们经济水平的提高以及消费观念的升级&#xff0c;当前个护家清用品逐渐朝品质化、精细化、个性化的方向发展&#xff0c;类目衍生更替更频繁、迭代速度更快。 得益于庞大的人口规模&#xff0c;个护家清产品规模巨大&#xff0c;衣物清洁行业虽增速放缓但仍在个护家清行…

OpenFoam收缩扩张喷管(拉瓦尔喷管)边界条件的设置

简介 收缩扩张喷管&#xff08;也成拉瓦尔喷管&#xff09;广泛应用于火箭推进。将其流动特性定性描述如下&#xff1a; &#xff08;1&#xff09;当入口流量较小时&#xff0c;不出现雍塞&#xff0c;流速先增大后减小&#xff0c;全程为亚声速。出口压力即为大气压&#x…

金融数学建模——2022年大湾区杯金融数学建模B题(解题思路及部分python代码)

目录 一、概述 二、赛题及解读 1.赛题详情 2.赛题解读 三、解题方法 1.第一问 第一问部分代码 2.第二问 第二问部分代码 3.第三问&#xff1a; 第三问部分代码 4.第四问 三、总结 一、概述 这次比赛是我们队伍第一次参加金融数学建模&#xff0c;尽管在比赛前用2020年…

数据结构与算法4—队列

队列 队列的定义 队列(Queue)也是一种运算受限的线性表。它只允许在表的一端进行插入&#xff0c;而在另一端进行删除。允许删除的一端称为队头(front)&#xff0c;允许插入的一端称为队尾(rear)。队列的修改是依先进先出的原则进行的。队列的基本操作 1&#xff0e;初始化队…

Vue前后端页面下载功能实现演示,Python+flask提供后台下载服务

Vue前后端页面下载功能实现效果图后台下载服务实现前台简单实现[ 文章推荐 ] Python 地图篇 - 使用 pyecharts 绘制世界地图、中国地图、省级地图、市级地图实例详解 效果图 首先看下演示效果。 点文档的话是 html 文档&#xff0c;跳转的预览&#xff0c;点下载的话是压缩包…

pycharm python 程序打包相关

前言 终于入门了python打包这个大话题&#xff0c;将目前学到的技能分享一下。 pycharm启动虚拟环境pipenv 缩小打包 和很多博客说的一样&#xff0c;打包那么大是因为打包了多余的库&#xff0c;因此想要缩小就需要一个干净的&#xff0c;没有多余的库的环境进行打包。也就是…