使用C++和Qt实现的简单音乐播放器

以下是完整的源码和实现步骤:


1. 创建Qt项目

首先,在Qt Creator中创建一个新的Qt Widgets Application项目,并命名为“MusicPlayer”。


2. 修改项目文件(MusicPlayer.pro)

确保项目文件包含多媒体模块:

qmake

QT += core gui multimedia widgets

3. 主窗口类实现

头文件 mainwindow.h

cpp

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include 
#include 

class QPushButton;
class QSlider;
class QLabel;

class MainWindow : public QMainWindow {
    Q_OBJECT

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

private slots:
    void openFile();
    void togglePlayPause();
    void stop();
    void setVolume(int volume);
    void updatePosition(qint64 position);
    void updateDuration(qint64 duration);
    void setPosition(int position);
    void handleMediaStatus(QMediaPlayer::MediaStatus status);
    void handleError(QMediaPlayer::Error error, const QString &errorString);

private:
    QMediaPlayer *player;
    QAudioOutput *audioOutput;
    QPushButton *openButton;
    QPushButton *playPauseButton;
    QPushButton *stopButton;
    QSlider *volumeSlider;
    QSlider *positionSlider;
    QLabel *statusLabel;
    bool isPlaying;
};

#endif // MAINWINDOW_H
源文件 mainwindow.cpp

cpp

#include "mainwindow.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), isPlaying(false) {
    player = new QMediaPlayer(this);
    audioOutput = new QAudioOutput(this);
    player->setAudioOutput(audioOutput);

    // 初始化UI组件
    openButton = new QPushButton("打开文件", this);
    playPauseButton = new QPushButton("播放", this);
    stopButton = new QPushButton("停止", this);
    volumeSlider = new QSlider(Qt::Horizontal, this);
    positionSlider = new QSlider(Qt::Horizontal, this);
    statusLabel = new QLabel("状态: 未加载文件", this);

    volumeSlider->setRange(0, 100);
    volumeSlider->setValue(50);
    audioOutput->setVolume(0.5); // 初始音量50%

    // 布局
    QHBoxLayout *buttonLayout = new QHBoxLayout;
    buttonLayout->addWidget(openButton);
    buttonLayout->addWidget(playPauseButton);
    buttonLayout->addWidget(stopButton);

    QVBoxLayout *mainLayout = new QVBoxLayout;
    mainLayout->addLayout(buttonLayout);
    mainLayout->addWidget(positionSlider);
    mainLayout->addWidget(volumeSlider);
    mainLayout->addWidget(statusLabel);

    QWidget *centralWidget = new QWidget(this);
    centralWidget->setLayout(mainLayout);
    setCentralWidget(centralWidget);

    // 连接信号与槽
    connect(openButton, &QPushButton::clicked, this, &MainWindow::openFile);
    connect(playPauseButton, &QPushButton::clicked, this, &MainWindow::togglePlayPause);
    connect(stopButton, &QPushButton::clicked, this, &MainWindow::stop);
    connect(volumeSlider, &QSlider::valueChanged, this, &MainWindow::setVolume);
    connect(player, &QMediaPlayer::positionChanged, this, &MainWindow::updatePosition);
    connect(player, &QMediaPlayer::durationChanged, this, &MainWindow::updateDuration);
    connect(positionSlider, &QSlider::sliderMoved, this, &MainWindow::setPosition);
    connect(player, &QMediaPlayer::mediaStatusChanged, this, &MainWindow::handleMediaStatus);
    connect(player, &QMediaPlayer::errorOccurred, this, &MainWindow::handleError);
}

MainWindow::~MainWindow() {}

void MainWindow::openFile() {
    QString fileName = QFileDialog::getOpenFileName(
        this, "选择音频文件", "", "音频文件 (*.mp3 *.wav)");
    if (!fileName.isEmpty()) {
        player->setSource(QUrl::fromLocalFile(fileName));
        statusLabel->setText("文件: " + fileName);
        playPauseButton->setText("播放");
        isPlaying = false;
    }
}

void MainWindow::togglePlayPause() {
    if (player->source().isEmpty()) return;

    if (isPlaying) {
        player->pause();
        playPauseButton->setText("播放");
        isPlaying = false;
    } else {
        player->play();
        playPauseButton->setText("暂停");
        isPlaying = true;
    }
}

void MainWindow::stop() {
    player->stop();
    playPauseButton->setText("播放");
    isPlaying = false;
    positionSlider->setValue(0);
    statusLabel->setText("状态: 已停止");
}

void MainWindow::setVolume(int volume) {
    audioOutput->setVolume(volume / 100.0);
}

void MainWindow::updatePosition(qint64 position) {
    positionSlider->setValue(position);
}

void MainWindow::updateDuration(qint64 duration) {
    positionSlider->setRange(0, duration);
}

void MainWindow::setPosition(int position) {
    player->setPosition(position);
}

void MainWindow::handleMediaStatus(QMediaPlayer::MediaStatus status) {
    if (status == QMediaPlayer::EndOfMedia) {
        stop();
    }
}

void MainWindow::handleError(QMediaPlayer::Error error, const QString &errorString) {
    QMessageBox::critical(this, "错误", "播放错误: " + errorString);
    stop();
}

4. 主函数 main.cpp

cpp

#include "mainwindow.h"
#include 

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    MainWindow w;
    w.setWindowTitle("Qt音乐播放器");
    w.resize(400, 200);
    w.show();
    return a.exec();
}

5. 功能说明

  • 打开文件:支持选择MP3和WAV文件。

  • 播放/暂停:切换播放状态。

  • 停止:停止播放并重置进度条。

  • 音量控制:通过滑动条调节音量。

  • 进度条:显示播放进度,可拖动调整播放位置。


6. 编译和运行

  1. 在Qt Creator中打开项目,构建并运行。

  2. 点击“打开文件”选择音频文件。

  3. 使用播放/暂停和停止按钮控制播放。

  4. 拖动音量条调整音量,拖动进度条调整播放位置。

你可能感兴趣的:(c语言)