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

目录
相关文章
|
2月前
|
存储 缓存 监控
Linux缓存管理:如何安全地清理系统缓存
在Linux系统中,内存管理至关重要。本文详细介绍了如何安全地清理系统缓存,特别是通过使用`/proc/sys/vm/drop_caches`接口。内容包括清理缓存的原因、步骤、注意事项和最佳实践,帮助你在必要时优化系统性能。
208 78
|
18天前
|
缓存 安全 Linux
Linux系统查看操作系统版本信息、CPU信息、模块信息
在Linux系统中,常用命令可帮助用户查看操作系统版本、CPU信息和模块信息
73 23
|
2月前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
79 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
3月前
|
缓存 Java Linux
如何解决 Linux 系统中内存使用量耗尽的问题?
如何解决 Linux 系统中内存使用量耗尽的问题?
244 48
|
2月前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
110 13
|
2月前
|
监控 安全 Linux
启用Linux防火墙日志记录和分析功能
为iptables启用日志记录对于监控进出流量至关重要
|
3月前
|
Ubuntu Linux 网络安全
linux系统ubuntu中在命令行中打开图形界面的文件夹
在Ubuntu系统中,通过命令行打开图形界面的文件夹是一个高效且实用的操作。无论是使用Nautilus、Dolphin还是Thunar,都可以根据具体桌面环境选择合适的文件管理器。通过上述命令和方法,可以简化日常工作,提高效率。同时,解决权限问题和图形界面问题也能确保操作的顺利进行。掌握这些技巧,可以使Linux操作更加便捷和灵活。
77 3
|
2月前
|
Ubuntu Linux C++
Win10系统上直接使用linux子系统教程(仅需五步!超简单,快速上手)
本文介绍了如何在Windows 10上安装并使用Linux子系统。首先,通过应用商店安装Windows Terminal和Linux系统(如Ubuntu)。接着,在控制面板中启用“适用于Linux的Windows子系统”并重启电脑。最后,在Windows Terminal中选择安装的Linux系统即可开始使用。文中还提供了注意事项和进一步配置的链接。
50 0
|
3月前
|
Linux
在 Linux 系统中,`find` 命令
在 Linux 系统中,`find` 命令
53 1
|
3月前
|
网络协议 Linux 虚拟化
如何在 Linux 系统中查看进程的详细信息?
如何在 Linux 系统中查看进程的详细信息?
311 1