qt音频实战

一、Qt音频基础知识

1、QT += multimedia

2、QMediaPlayer类:媒体播放器,主要用于播放歌曲、网络收音机等功能。

3、QMediaPlaylist类:专用于播放媒体内容的列表。

二、界面设计

三、代码

复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"

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

    m_player = new QMediaPlayer;
    m_playlist = new QMediaPlaylist;

    //设置播放模式
    m_playlist->setPlaybackMode(QMediaPlaylist::Loop);
    m_player->setPlaylist(m_playlist);

    connect(m_player, SIGNAL(statechanged(QMediaPlayer::State)), this, SLOT(onstatechg(QMediaPlayer::State)));
    connect(m_player, SIGNAL(positionChanged(qint64)), this, SLOT(onpstChg(qint64)));
    connect(m_player, SIGNAL(durationChanged(qint64)), this, SLOT(onDrtchg(qint64)));
    connect(m_playlist, SIGNAL(currentIndexChanged(int)), this, SLOT(onplaylistchg(int)));
}

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

void MainWindow::onstatechg(QMediaPlayer::State state)    //按钮状态切换
{
    ui->playBtn->setEnabled(!(state == QMediaPlayer::PlayingState));
    ui->pauseBtn->setEnabled(state == QMediaPlayer::PlayingState);
    ui->stopBtn->setEnabled(state == QMediaPlayer::PlayingState);
}
void MainWindow::onplaylistchg(int pos)                   //播放列表更新
{
    ui->listWidget->setCurrentRow(pos);
    QListWidgetItem *item = ui->listWidget->currentItem();
    if(item)
        ui->nameLab->setText(item->text());

}
void MainWindow::onDrtchg(qint64 drt)                     //歌曲时长
{
    ui->progressBar->setMaximum(drt);

    int sec = drt/1000;
    int min = sec/60;
    sec = sec % 60;

    drtTime = QString::asprintf("%d:%d", min, sec);
    ui->progressLab->setText(pstTime+"|"+drtTime);

}
void MainWindow::onpstChg(qint64 pos)                     //歌曲当前播放位置
{
    if(ui->progressBar->isSliderDown())
        return;

    ui->progressBar->setSliderPosition(pos);

    int sec = pos/1000;
    int min = sec/60;
    sec = sec % 60;

    pstTime = QString::asprintf("%d:%d", min, sec);
    ui->progressLab->setText(pstTime+"|"+drtTime);
}


void MainWindow::on_openFileBtn_clicked()
{
    QString currentpath = QDir::currentPath();
    QString dlgtitle = "请选择音频文件:";
    QString strfilter = "所有文件(*.*);;音频文件(*.mp3);;MP3文件(*mp3)";

    QStringList filelist = QFileDialog::getOpenFileNames(this, dlgtitle, currentpath,strfilter);

    if(filelist.count()<1)
        return;

    for(int i = 0;i < filelist.count(); i++)
    {
        QString afile = filelist.at(i);
        m_playlist->addMedia(QUrl::fromLocalFile(afile)); //添加文件

        QFileInfo fileinfo(afile);
        ui->listWidget->addItem(fileinfo.fileName());
    }

    if(m_player->state()!=QMediaPlayer::PlayingState)
        m_playlist->setCurrentIndex(0);
    m_player->play();
}


void MainWindow::on_playBtn_clicked()
{
    if(m_playlist->currentIndex()<0)
        m_playlist->setCurrentIndex(0);
    m_player->play();
}


void MainWindow::on_pauseBtn_clicked()
{
    m_player->pause();
}


void MainWindow::on_stopBtn_clicked()
{
    m_player->stop();
}


void MainWindow::on_PreviousBtn_clicked()
{
    m_playlist->previous();
}


void MainWindow::on_nextBtn_clicked()
{
    m_playlist->next();
}


void MainWindow::on_volumnBtn_clicked()        //切换音量图标(需要添加图片资源到项目)
{
    bool mute = m_player->isMuted();

    m_player->setMuted(!mute);
    if(mute)
    {
        ui->volumnBtn->setIcon(QIcon(":/icon/volumn.png"));
    }
    else
    {
        ui->volumnBtn->setIcon(QIcon(":/icon/novolume.png"));
    }
}


void MainWindow::on_volumnBar_valueChanged(int value)     //音量调节
{
    m_player->setVolume(value);
}


void MainWindow::on_progressBar_valueChanged(int value)   //进度调节
{
    m_player->setPosition(value);
}
相关推荐
studyForMokey3 分钟前
【Kotlin进阶】泛型的高级特性
android·开发语言·kotlin
ajassi200020 分钟前
开源 C# 快速开发(八)通讯--Tcp服务器端
开发语言·开源·c#
毕设源码-钟学长20 分钟前
【开题答辩全过程】以 基于Java的戏曲网站设计与实现为例,包含答辩的问题和答案
java·开发语言
2501_9160074738 分钟前
Java界面开发工具有哪些?常用Java GUI开发工具推荐、实战经验与对比分享
android·java·开发语言·ios·小程序·uni-app·iphone
txwtech1 小时前
Qt5.15.2离线安装现有压缩包
qt
_码力全开_1 小时前
Python从入门到实战 (14):工具落地:用 PyInstaller 打包 Python 脚本为可执行文件
开发语言·数据结构·python·个人开发
tpoog1 小时前
[C++项目框架库]redis的简单介绍和使用
开发语言·c++·redis
yi碗汤园2 小时前
【一文了解】C#的StringComparison枚举
开发语言·前端·c#
Larry_Yanan2 小时前
QML学习笔记(十九)QML的附加信号处理器
开发语言·笔记·qt·学习·ui
某不知名網友2 小时前
I/O 多路转接之 epoll:高并发服务器的性能利器
开发语言·php