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

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

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

     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 开发重要的是界面与稳定性,功能是次要的!

目录
相关文章
|
3月前
|
Ubuntu Linux Anolis
Linux系统禁用swap
本文介绍了在新版本Linux系统(如Ubuntu 20.04+、CentOS Stream、openEuler等)中禁用swap的两种方法。传统通过注释/etc/fstab中swap行的方式已失效,现需使用systemd管理swap.target服务或在/etc/fstab中添加noauto参数实现禁用。方法1通过屏蔽swap.target适用于新版系统,方法2通过修改fstab挂载选项更通用,兼容所有系统。
301 3
Linux系统禁用swap
|
3月前
|
Linux
Linux系统修改网卡名为eth0、eth1
在Linux系统中,可通过修改GRUB配置和创建Udev规则或使用systemd链接文件,将网卡名改为`eth0`、`eth1`等传统命名方式,适用于多种发行版并支持多网卡配置。
474 3
|
2月前
|
XML Linux 数据格式
Qt对Word网页的读写功能实现
Qt对Word网页的读写功能实现
234 9
|
Ubuntu Linux 网络安全
Linux系统初始化脚本
一款支持Rocky、CentOS、Ubuntu、Debian、openEuler等主流Linux发行版的系统初始化Shell脚本,涵盖网络配置、主机名设置、镜像源更换、安全加固等多项功能,适配单/双网卡环境,支持UEFI引导,提供多版本下载与持续更新。
416 0
Linux系统初始化脚本
|
4月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
295 18
|
3月前
|
安全 Linux Shell
Linux系统提权方式全面总结:从基础到高级攻防技术
本文全面总结Linux系统提权技术,涵盖权限体系、配置错误、漏洞利用、密码攻击等方法,帮助安全研究人员掌握攻防技术,提升系统防护能力。
344 1
|
3月前
|
监控 安全 Linux
Linux系统提权之计划任务(Cron Jobs)提权
在Linux系统中,计划任务(Cron Jobs)常用于定时执行脚本或命令。若配置不当,攻击者可利用其提权至root权限。常见漏洞包括可写的Cron脚本、目录、通配符注入及PATH变量劫持。攻击者通过修改脚本、创建恶意任务或注入命令实现提权。系统管理员应遵循最小权限原则、使用绝对路径、避免通配符、设置安全PATH并定期审计,以防范此类攻击。
1065 1
|
4月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
1660 10
|
4月前
|
安全 Linux 数据安全/隐私保护
为Linux系统的普通账户授予sudo访问权限的过程
完成上述步骤后,你提升的用户就能够使用 `sudo`命令来执行管理员级别的操作,而无需切换到root用户。这是一种更加安全和便捷的权限管理方式,因为它能够留下完整的权限使用记录,并以最小权限的方式工作。需要注意的是,随意授予sudo权限可能会使系统暴露在风险之中,尤其是在用户不了解其所执行命令可能带来的后果的情况下。所以在配置sudo权限时,必须谨慎行事。
678 0
|
4月前
|
Ubuntu Linux 开发者
国产 Linux 发行版再添新成员,CutefishOS 系统简单体验
当然,系统生态构建过程并不简单,不过为了帮助国产操作系统优化生态圈,部分企业也开始用国产操作系统替代 Windows,我们相信肯定会有越来越多的精品软件登录 Linux 平台。
367 0