You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 10:28:12