Qt简单离线音乐播放器

embedded/2024/10/18 8:38:11/

有上传本地音乐文件,播放,暂停,拖拉进度条等功能的播放器。

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMediaPlayer>
#include <QFileDialog>
#include <QTime>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);player = new QMediaPlayer(this);// 当播放状态改变时,更新按钮的状态connect(player,&QMediaPlayer::stateChanged,this,&MainWindow::onStateChanged);// 当音乐文件的总时间改变时,更新滑块的范围connect(player, &QMediaPlayer::durationChanged, ui->slider, &QSlider::setMaximum);// 当播放位置改变时,更新滑块的值connect(player, &QMediaPlayer::positionChanged, ui->slider, &QSlider::setValue);// 当滑块的值改变时,设置播放位置connect(ui->slider, &QSlider::valueChanged, player, &QMediaPlayer::setPosition);connect(ui->slider, &QSlider::valueChanged, [this](int value) {// 将滑块的值转换为时间格式,并更新 timelabelQTime time(0, value / 60, value % 60);ui->timelabel->setText(time.toString("mm:ss"));});}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_playButton_clicked()
{//if(player->state() == QMediaPlayer::PlayingState)//{//player->pause();//}else{//player->play();//}player->play();
}void MainWindow::onStateChanged(QMediaPlayer::State state)
{//if(state == QMediaPlayer::PlayingState)//{//ui->playButton->setText("Pause");//}//else//{//ui->playButton->setText("Play");//}
}void MainWindow::on_openAction_triggered()
{QString filename = QFileDialog::getOpenFileName(this, "Open a File", "", "Audio File(*.mp3)");player->setMedia(QUrl::fromLocalFile(filename));player->play();
}void MainWindow::on_pauseButton_clicked()
{player->pause();
}void MainWindow::on_OpenFileButton_clicked()
{on_openAction_triggered();
}void MainWindow::on_slider_actionTriggered(int action)
{}void MainWindow::on_timelabel_linkActivated(const QString &link)
{}

.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QMediaPlayer>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_timelabel_linkActivated(const QString &link);void on_playButton_clicked();void on_slider_actionTriggered(int action);void on_pauseButton_clicked();void onStateChanged(QMediaPlayer::State state);void on_openAction_triggered();void on_OpenFileButton_clicked();private:Ui::MainWindow *ui;QMediaPlayer *player;
};
#endif // MAINWINDOW_H

.pro:

QT       += core gui
QT       += multimediagreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \mainwindow.cppHEADERS += \mainwindow.hFORMS += \mainwindow.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/embedded/38192.html

相关文章

Java中ArrayList、LinkedList和Vector的底层原理

ArrayList Java中的ArrayList底层原理主要涉及其数据结构、扩容机制、线程安全性以及元素存储和访问方式。以下是对ArrayList底层原理的总结&#xff1a; 数据结构 ArrayList的底层数据结构是一个动态数组。这意味着ArrayList可以根据需要自动增长其容量&#xff0c;从而存储…

VitePress快速上手

完整教程&#xff1a;https://blog.share888.top/note/front-end/vitePress/01-vitePress%E5%AE%89%E8%A3%85.html https://blog.share888.top/ VitePress快速上手 官方文档&#xff1a;https://vitepress.dev/zh/guide/markdown VitePress中文网&#xff1a;https://vitejs…

SparkSql介绍

概述 SparkSQL&#xff0c;顾名思义&#xff0c;就是Spark生态体系中的构建在SparkCore基础之上的一个基于SQL的计算模块。SparkSQL的前身不叫SparkSQL&#xff0c;而叫Shark&#xff0c;最开始的时候底层代码优化&#xff0c;sql的解析、执行引擎等等完全基于Hive&#xff0c…

Leetcode—706. 设计哈希映射【简单】(constexpr)

2024每日刷题&#xff08;127&#xff09; Leetcode—706. 设计哈希映射 数组实现代码 class MyHashMap { public:MyHashMap() {memset(arr, -1, sizeof(arr));}void put(int key, int value) {arr[key] value;}int get(int key) {if(arr[key] -1) {return -1;} return arr…

【3dmax笔记】026:挤出和壳修改器的使用

文章目录 一、修改器二、挤出三、壳 一、修改器 3ds Max中的修改器是一种强大的工具&#xff0c;用于创建和修改复杂的几何形状。这些修改器可以改变对象的形状、大小、方向和位置&#xff0c;以生成所需的效果。以下是一些常见的3ds Max修改器及其功能&#xff1a; 挤出修改…

CTF-reverse二维四向迷宫路径求解

二维四向迷宫是一个re中的常考点&#xff0c;说不上难&#xff0c;但也不简单&#xff0c;本篇记录了常规的二维四向迷宫解题套路以及帮助快速解题的脚本 可能你看我的教程会觉得十分繁琐&#xff0c;但实际只要你用了一次熟练之后&#xff0c;基本都是拿到迷宫就一题一分钟解决…

【智能楼宇秘籍】一网关多协议无缝对接BACnet+OPC+MQTT

在繁华的都市中心&#xff0c;一座崭新的大型商业综合体拔地而起&#xff0c;集购物、餐饮、娱乐、办公于一体&#xff0c;是现代城市生活的缩影。然而&#xff0c;这座综合体的幕后英雄——一套高度集成的楼宇自动化系统&#xff0c;正是依靠多功能协议网关&#xff0c;实现了…

深入了解 NumPy:深度学习中的数学运算利器

文章目录 1. 导入NumPy2. 创建NumPy数组3. 数组的算术运算4. N维数组4.1 创建和操作多维数组4.2 高维数组 5. NumPy的广播功能5.1 基本广播示例5.2 更复杂的广播示例 6. 访问数组元素6.1 基于索引的访问6.2 遍历数组6.3 基于条件的访问6.4 高级索引6.5 性能考虑 在深度学习和数…