Qt6 C++:复用MainWindow中初始化的QMediaPlayer播放添加任务音效
复用QMediaPlayer实现添加任务时播放音效的解决方案
核心思路
将QMediaPlayer和QAudioOutput从构造函数的局部变量改为MainWindow的成员变量,让它们在窗口生命周期内仅初始化一次,后续需要播放音效时直接调用play()方法复用即可。
具体实现步骤
1. 修改头文件(mainwindow.h)
添加成员变量声明,让播放器对象成为类的全局成员:
#include <QMediaPlayer> #include <QAudioOutput> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void on_addTaskbtn_1_clicked(); private: Ui::MainWindow *ui; QMediaPlayer* m_player; // 全局播放器对象 QAudioOutput* m_audioOutput; // 全局音频输出对象 };
2. 修改构造函数(mainwindow.cpp)
初始化成员变量,配置音频参数,同时指定父对象实现自动内存管理:
MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow), m_player(new QMediaPlayer(this)), m_audioOutput(new QAudioOutput(this)) { ui->setupUi(this); // --- 原有的文件读取、列表初始化代码保持不变 --- QFile file(pathTaskFile); if (!file.open(QIODevice::ReadOnly)) { QMessageBox::information(0, "error", file.errorString()); } ui->listWidget_1->setWordWrap(true); ui->listWidget_1->setStyleSheet("QListView QLineEdit{background:#FFF2D7; color:black;}"); QTextStream in(&file); while (!in.atEnd()) { QListWidgetItem* item = new QListWidgetItem(in.readLine(), ui->listWidget_1); item->setCheckState(item->checkState() ? Qt::Checked : Qt::Unchecked); item->setForeground(QBrush(Qt::black)); item->setFlags(item->flags() | Qt::ItemIsEditable | Qt::ItemIsUserCheckable); ui->listWidget_1->addItem(item); } file.close(); // --- 原有代码结束 --- // 配置播放器参数 m_player->setAudioOutput(m_audioOutput); m_player->setSource(QUrl("qrc:/resources/sounds/pop-6.wav")); m_audioOutput->setVolume(50); // 可选:窗口启动时播放一次音效,不需要则删除此行 // m_player->play(); }
3. 修改添加任务函数
在任务添加成功后调用播放器播放音效,同时处理音频重置逻辑,确保每次都从开头播放:
void MainWindow::on_addTaskbtn_1_clicked() { task = ui->toDoInput_1->text(); int len = task.length(); if (len != 0) { QListWidgetItem* item = new QListWidgetItem(task); item->setCheckState(Qt::Unchecked); ui->listWidget_1->addItem(item); item->setFlags(item->flags() | Qt::ItemIsEditable | Qt::ItemIsUserCheckable); ui->toDoInput_1->clear(); ui->toDoInput_1->setFocus(); // 播放音效:先重置到音频开头,再播放 if (m_player->playbackState() == QMediaPlayer::PlayingState) { m_player->stop(); } m_player->setPosition(0); m_player->play(); } }
关键注意事项
- 内存管理:给
m_player和m_audioOutput指定父对象this,这样MainWindow销毁时会自动释放这些对象,避免内存泄漏。 - 音频重置:每次播放前调用
setPosition(0),确保音频从开头播放,避免上次播放结束后位置停留在结尾导致无声音。 - 路径验证:确认资源文件路径
qrc:/resources/sounds/pop-6.wav正确,确保音频文件已添加到Qt资源文件中。
内容的提问来源于stack exchange,提问作者Boriscodes
相关产品推荐
相关产品推荐

