以下是完整的源码和实现步骤:
首先,在Qt Creator中创建一个新的Qt Widgets Application项目,并命名为“MusicPlayer”。
确保项目文件包含多媒体模块:
qmake
QT += core gui multimedia widgets
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(); }
main.cpp
:cpp
#include "mainwindow.h" #includeint main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.setWindowTitle("Qt音乐播放器"); w.resize(400, 200); w.show(); return a.exec(); }
打开文件:支持选择MP3和WAV文件。
播放/暂停:切换播放状态。
停止:停止播放并重置进度条。
音量控制:通过滑动条调节音量。
进度条:显示播放进度,可拖动调整播放位置。
在Qt Creator中打开项目,构建并运行。
点击“打开文件”选择音频文件。
使用播放/暂停和停止按钮控制播放。
拖动音量条调整音量,拖动进度条调整播放位置。