Использование Mediaplayer, объявленного в MainWindow, в другой функции в Qt6 C++

Вопрос или проблема

Я пытаюсь получить звуковой эффект каждый раз, когда задача добавляется в мой список дел. Однако я не хочу настраивать медиаплеер каждый раз, когда добавляется новая задача, поэтому хочу настроить его один раз и использовать, когда это нужно. Я не уверен, что это вообще возможно, но если да, я был бы рад узнать как.

Мой MainWindow:

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

    QFile file(pathTaskFile);

    if (!file.open(QIODevice::ReadOnly)) {
        QMessageBox::information(0, "ошибка", 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);
        if (item->checkState()) {
            item->setCheckState(Qt::Checked);
        } else {
            item->setCheckState(Qt::Unchecked);
        }

        item->setForeground(QBrush(Qt::black));

        item->setFlags(item->flags() | Qt::ItemIsEditable | Qt::ItemIsUserCheckable);
        ui->listWidget_1->addItem(item);
    }

    file.close();

    // создаем медиаплеер для звукового эффекта
    QMediaPlayer* player     = new QMediaPlayer;
    QAudioOutput* audioOutput = new QAudioOutput;

    player->setAudioOutput(audioOutput);
    player->setSource(QUrl("qrc:/resources/sounds/pop-6.wav"));
    audioOutput->setVolume(50);
    player->play();
}

Функция для добавления задачи, где я хочу добавить звуковой эффект:

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();
    }
}

Ответ или решение

Для того чтобы воспроизводить звук каждый раз, когда вы добавляете задачу в список, не создавая объект медиаплеера заново, вы можете определить медиаплеер как член класса MainWindow. Это позволит инициализировать его один раз в конструкторе и использовать в других методах вашего класса.

Вот как можно изменить ваш код:

Шаг 1: Определение медиаплеера как члена класса

Вам нужно будет добавить следующие члены в файл заголовка mainwindow.h:

#include <QMediaPlayer>
#include <QAudioOutput>

class MainWindow : public QMainWindow {
    Q_OBJECT

public:
    explicit MainWindow(QWidget* parent = nullptr);
    // Другие объявления методов...

private:
    Ui::MainWindow* ui;
    QMediaPlayer* player;      // Добавьте медиаплеер как член класса
    QAudioOutput* audioOutput; // Добавьте аудиовыход как член класса
};

Шаг 2: Инициализация медиаплеера в конструкторе

Затем инициализируйте медиаплеер в конструкторе:

MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
    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(Qt::Unchecked);
        item->setForeground(QBrush(Qt::black));
        item->setFlags(item->flags() | Qt::ItemIsEditable | Qt::ItemIsUserCheckable);
        ui->listWidget_1->addItem(item);
    }
    file.close();

    // Создание медиаплеера и аудиовыхода
    player = new QMediaPlayer(this);
    audioOutput = new QAudioOutput(this);
    player->setAudioOutput(audioOutput);
    player->setSource(QUrl("qrc:/resources/sounds/pop-6.wav"));
    audioOutput->setVolume(50);
}

Шаг 3: Воспроизведение звука в методе добавления задачи

Теперь вы можете воспроизводить звук в методе on_addTaskbtn_1_clicked, добавив вызов player->play() после добавления новой задачи:

void MainWindow::on_addTaskbtn_1_clicked() {
    QString 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();

        // Воспроизведение звукового эффекта
        player->play();
    }
}

Примечание

Не забудьте освободить ресурсы, если вам это нужно. В случае, если ваш класс MainWindow будет уничтожен, его члены (включая player и audioOutput) также будут уничтожены, если вы передали this в их конструкторы. Это поможет избежать утечек памяти.

Теперь ваш медиаплеер будет создан один раз в конструкторе и использоваться каждый раз, когда вы добавляете новую задачу, без необходимости повторной инициализации.

Оцените материал
Добавить комментарий

Капча загружается...