【QT】音乐播放器demo

news2024/12/26 21:06:24

1、使用设计师模式绘制ui界面

添加QPushButton并设置大小,ctrl+鼠标拖动复制相同的组件。

添加icon                //ps:icon下载网站

设置按钮无边框并设置鼠标悬停颜色:

修改QWidget样式表,添加:

*{
border:none;
}
QPushButton:hover
{
	background-color: rgb(125, 238, 255);
}

2、widget源码设计

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QtWidgets/QtWidgets>
#include<QMediaPlayer>
#include<QAudioOutput>
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_4_clicked();

    void on_pushButton_3_clicked();

    void on_pushButton_5_clicked();

    void on_listWidget_currentRowChanged(int currentRow);

    void on_listWidget_doubleClicked(const QModelIndex &index);

private:
    Ui::Widget *ui;
    QList<QUrl> _playList;
    QAudioOutput *_audioOutput;
    QMediaPlayer *_mediaPlayer;
    int _curIndex=0;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QtWidgets/QtWidgets>
#include<QMediaPlayer>
#include<QAudioOutput>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    _audioOutput=new QAudioOutput(this);
    _mediaPlayer=new QMediaPlayer(this);
    _mediaPlayer->setAudioOutput(_audioOutput);

    QObject::connect(_mediaPlayer,&QMediaPlayer::durationChanged,[&](qint64 duration){
        ui->totalLabel->setText(QString("%1:%2").arg(duration/1000/60,2,10,QChar('0')).arg(duration/1000%60));
        ui->playCourseSlider->setRange(0,duration);
    });

    QObject::connect(_mediaPlayer,&QMediaPlayer::positionChanged,[&](qint64 pos){
        ui->curLabel->setText(QString("%1:%2").arg(pos/1000/60,2,10,QChar('0')).arg(pos/1000%60,2,10,QChar('0')));
        ui->playCourseSlider->setValue(pos);
    });

    connect(ui->playCourseSlider,&QSlider::sliderMoved,_mediaPlayer,&QMediaPlayer::setPosition);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_clicked()
{
    auto path=QFileDialog::getExistingDirectory(this,"请选择音乐所在的目录","C:/Users/31468/Desktop/");
    QDir dir(path);
    auto musicList=dir.entryList(QStringList()<<"*.mp3"<<"*.wav");
    ui->listWidget->addItems(musicList);
    ui->listWidget->setCurrentRow(0);

    for(auto &elem:musicList)
    {
        _playList.push_back(QUrl::fromLocalFile(path+"/"+elem));
    }
    qDebug()<<_playList;

}


void Widget::on_pushButton_4_clicked()
{
    if(_playList.size()==0) return;

    if(_mediaPlayer->playbackState()==QMediaPlayer::PlaybackState::StoppedState)
    {
        // QPushButton *button = new QPushButton(this);
        // // 设置按钮的背景图片,使用border-image属性
        // button->setStyleSheet("QPushButton { border-image: url(:/path/to/your/image.png); }");
        //:/icon/pause (2).png ://icon/stop.png
        ui->pushButton_4->setStyleSheet("QPushButton { border-image: url(:/icon/stop.png); }");
        _curIndex=ui->listWidget->currentRow();
        _mediaPlayer->setSource(_playList[_curIndex]);
        _mediaPlayer->play();
    }
    else if(_mediaPlayer->playbackState()==QMediaPlayer::PlaybackState::PlayingState)
    {
        ui->pushButton_4->setStyleSheet("QPushButton { border-image: url(:/icon/pause (2).png); }");
        _mediaPlayer->pause();
    }
    else if(_mediaPlayer->playbackState()==QMediaPlayer::PlaybackState::PausedState)
    {
        ui->pushButton_4->setStyleSheet("QPushButton { border-image: url(:/icon/stop.png); }");
        _mediaPlayer->play();
    }
}


void Widget::on_pushButton_3_clicked()//上一曲
{
    if(_playList.size()==0) return;
    --_curIndex;
    if(_curIndex==-1)
    {
        _curIndex=_playList.size()-1;
    }
    ui->listWidget->setCurrentRow(_curIndex);
    _mediaPlayer->setSource(_playList[_curIndex]);
    _mediaPlayer->play();
}


void Widget::on_pushButton_5_clicked()//下一曲
{
    if(_playList.size()==0) return;
    ++_curIndex;
    if(_curIndex==_playList.size())
    {
        _curIndex=0;
    }
    ui->listWidget->setCurrentRow(_curIndex);
    _mediaPlayer->setSource(_playList[_curIndex]);
    _mediaPlayer->play();

}
void Widget::on_listWidget_doubleClicked(const QModelIndex &index)
{
    _curIndex=index.row();
    //ui->listWidget->setCurrentRow(_curIndex);
    _mediaPlayer->setSource(_playList[_curIndex]);
    _mediaPlayer->play();
}


void Widget::on_listWidget_currentRowChanged(int currentRow)
{

}

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

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

相关文章

「Mac畅玩鸿蒙与硬件34」UI互动应用篇11 - 颜色选择器

本篇将带你实现一个颜色选择器应用。用户可以从预设颜色中选择&#xff0c;或者通过输入颜色代码自定义颜色来动态更改界面背景。该应用展示了如何结合用户输入、状态管理和界面动态更新的功能。 关键词 UI互动应用颜色选择器状态管理用户输入界面动态更新 一、功能说明 颜色…

T620存储安全方案SoC芯片技术手册

系统资源 集成32位国产CPU CK803S&#xff1b;最高工作频率260Mhz CK803S内置16KB I/D Cache&#xff0c;内置32KB DTCM 32KB ROM&#xff1b;256KB SRAM&#xff1b;8KB SRAM&#xff08;系统专用&#xff09; 512KB/1MB 片内Flash 安全算法 支持SM4数据加密&#xff0c;加密性…

计算机光电成像理论基础

一、透过散射介质成像 1.1 光在散射介质中传输 光子携带物体信息并进行成像的过程是一个涉及光与物质相互作用的物理现象。这个过程可以分为几个步骤来理解&#xff1a; 1. **光的发射或反射**&#xff1a; - 自然界中的物体可以发射光&#xff08;如太阳&#xff09;&am…

C语言——自我介绍_Gitee的基本使用

自我介绍 一名信息安全技术应用专业的大学生&#xff0c;来到CSDN博客论坛已有两年。写博客的目的&#xff1a;第一点是为了学习到更多的知识&#xff0c;以便以后所需&#xff1b;第二点是为了读者&#xff0c;俺是一个初学者&#xff0c;希望可以和读者朋友共同进步&#xf…

Redis高阶集群搭建+集群读写

问题 容量不够&#xff0c;redis 如何进行扩容&#xff1f;并发写操作&#xff0c; redis 如何分摊&#xff1f;另外&#xff0c;主从模式&#xff0c;薪火相传模式&#xff0c;主机宕机&#xff0c;导致 ip 地址发生变化&#xff0c;应用程序中配置需要修改对应的主机地址、端…

windows下kafka初体验简易demo

这里提供了windows下的java1.8和kafka3.9.0版本汇总&#xff0c;可直接免费下载 【免费】java1.8kafka2.13版本汇总资源-CSDN文库 解压后可以得到一个文件夹 资料汇总内有一个kafka文件资料包.tgz&#xff0c;解压后可得到下述文件夹kafka_2.13-3.9.0&#xff0c;资料汇总内还…

深入理解 TCP 标志位(TCP Flags)

深入理解 TCP 标志位&#xff08;TCP Flags&#xff09; 1. 简介 在网络安全和网络分析领域&#xff0c;TCP标志位&#xff08;TCP Flags&#xff09;是理解网络行为和流量模式的关键概念。特别是在使用工具如Nmap进行端口扫描时&#xff0c;理解这些标志位的意义和用法至关重…

【智商检测——DP】

题目 代码 #include <bits/stdc.h> using namespace std; const int N 1e510, M 110; int f[N][M]; int main() {int n, k;cin >> n >> k;for(int i 1; i < n; i){int x;cin >> x;f[i][0] __gcd(f[i-1][0], x);for(int j 1; j < min(i, k)…

游戏引擎学习第31天

仓库:https://gitee.com/mrxiao_com/2d_game 回顾 回顾了他们的游戏开发进度&#xff0c;并强调了编写整个游戏的价值。他们提到&#xff0c;这个过程的目的是让每个参与者从零开始编程一个完整的游戏&#xff0c;了解整个游戏的工作原理。这样做的一个关键好处是&#xff0c…

南昌大学(NCU)羽毛球场地预约脚本

在冬天进行羽毛球运动是一个很好的选择&#xff0c;它能帮助你保持身体活力&#xff0c;增强心肺功能&#xff0c;并促进血液循环。但是室友和师弟师妹反应&#xff0c;学校的羽毛球场地有限&#xff0c;手速慢的根本预约不到场地。 中午12&#xff1a;00准时开放预约&#xff…

debian 11 虚拟机环境搭建过坑记录

目录 安装过程系统配置修改 sudoers 文件网络配置换源安装桌面mount nfs 挂载安装复制功能tab 无法补全其他安装 软件配置eclipse 配置git 配置老虚拟机硬盘挂载 参考 原来去 debian 官网下载了一个最新的 debian 12&#xff0c;安装后出现包依赖问题&#xff0c;搞了半天&…

leecode96.不同的二叉搜索树

在画的过程中发现规律&#xff0c;每次选择不同的节点作为根节点&#xff0c;左右两边的节点再排列组合一下就能求出总数 class Solution { public:int numTrees(int n) {vector<int> dp(n1,0);dp[0]1;for(int i1;i<n;i)for(int j0;j<i;j)dp[i]dp[i-j-1]*dp[j];ret…

Vue前端开发-路由的基本配置

在传统的 Web 页面开发过程中&#xff0c;可以借助超级链接标签实现站内多个页面间的相互跳转&#xff0c;而在现代的工程化、模块化下开发的Web页面只有一个&#xff0c;在一个页面中需要实现站内各功能页面渲染&#xff0c;相互跳转&#xff0c;这时些功能的实现&#xff0c;…

Creating Server TCP listening socket *:6379: bind: No error

启动redis报错&#xff1a;Creating Server TCP listening socket *:6379: bind: No error 解决方案&#xff1a; 1、直接在命令行中输入 redis-cli.exe 2、输入shutdown&#xff0c;关闭 3、输exit&#xff0c;退出 4、重新输入 redis-server.exe redis.windows.conf&…

详解登录MySQL时出现SSL connection error: unknown error number错误

目录 登录MySQL时出错SSL connection error: unknown error number 出错原因 使用MySQL自带的工具登录MySQL 登陆之后&#xff0c;使用如下命令进行查看 解决方法 找到MySQL8安装目录下的my.ini配置文件 记事本打开my.ini文件&#xff0c;然后按下图所示添加配置 此时再…

AI在SEO中的应用与关键词优化探讨

内容概要 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术为搜索引擎优化&#xff08;SEO&#xff09;带来了革命性的改变。传统的SEO主要依赖于人为的经验和判断&#xff0c;而AI则通过算法分析海量数据&#xff0c;提供更加精准和高效的方式优化关键词…

NLP任务四大范式的进阶历程:从传统TF-IDF到Prompt-Tuning(提示词微调)

引言&#xff1a;从TF-IDF到Prompt-Tuning&#xff08;提示词微调&#xff09;&#xff0c;NLP的四次变革 自然语言处理&#xff08;NLP&#xff09;技术从最早的手工特征设计到如今的Prompt-Tuning&#xff0c;经历了四个重要阶段。随着技术的不断发展&#xff0c;我们的目标…

十四(AJAX)、AJAX、axios、常用请求方法(GET POST...)、HTTP协议、接口文档、form-serialize

1. AJAX介绍及axios基本使用 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content&q…

Javaweb梳理21——Servlet

Javaweb梳理21——Servlet 21 Servlet21.1 简介21.3 执行流程21.4 生命周期4.5 方法介绍21.6 体系结构21.7 urlPattern配置21.8 XML配置 21 Servlet 21.1 简介 Servlet是JavaWeb最为核心的内容&#xff0c;它是Java提供的一门动态web资源开发技术。使用Servlet就可以实现&…

如何在MySQL中计算两个日期的间隔天数

目录 1. DATEDIFF函数2. TIMESTAMPDIFF函数3. PERIOD_DIFF函数4. 函数对比 在MySQL 5.7中&#xff0c;计算两个日期之间的间隔天数是一项常见的任务。 1. DATEDIFF函数 DATEDIFF函数可以直接计算两个日期之间的天数差异。 -- 计算2024年1月1日和2024年1月10日之间的天数差异 …