Приложение для воспроизведения простого звука (.wav) в QT (C ++) - PullRequest
1 голос
/ 31 марта 2012

Я новичок в Qt и пытался написать простой класс qt, который может планировать wav-файл.После некоторого прочтения и осмотра я написал класс, код которого приведен ниже.Вопросы следуют после кода

#include <QtGui/QApplication>
#include "playsound.h"
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
     QApplication a(argc, argv);
     playSound w;
     int ch = 2;
     int ready = 1;
     cout<<"ready"<<ready<<endl;
     // w.show();
     w.playwav(ch);
     return a.exec();   
}

Исходный код для playsound.cpp

#include "playsound.h"

playSound::playSound(QWidget *parent): QWidget(parent) {}

playSound::~playSound() {}

void playSound::playwav(int ch)
{

    switch (ch)
    {
        case 1: {QSound::play("/home/alok/qtworkspace/sounds/abc.wav"); break;}
        case 2: {QSound::play("/home/alok/qtworkspace/sounds/xyz.wav"); break;}
        case 3: {QSound::play("/home/alok/qtworkspace/sounds/abc.wav"); break;}
        case 4: {QSound::play("/home/alok/qtworkspace/sounds/aaa.wav"); break;}
        case 5: {QSound::play("/home/alok/qtworkspace/sounds/nnn.wav"); break;}
    }
}

Проблемы и вопросы:

1) Я хочу закрыть приложение, как только звукНа данный момент написано, что программа запущена, и я должен принудительно закрыть ее, используя красную кнопку в области «Вывод приложения» в Qt creator.Я пытался использовать close () из Qwidget и quit () из QApplication, но, вероятно, я делаю это неправильно.Как это сделать?

2) Может ли быть более простая реализация для этой функциональности?Вы знаете что-то, что не связано с циклами событий.Я пытался сделать это в стиле старой школы C ++, где я вызываю функцию, когда мне нужно воспроизвести звук и покончить с этим, но я не смог этого сделать.Предложения приветствуются.

Спасибо

Ответы [ 2 ]

2 голосов
/ 01 апреля 2012

Я могу предложить ответ, используя PyQt4 (так как я программист на Python), но идея та же.

1) QSound - очень простой интерфейс для воспроизведения звуков.У него нет никаких полезных сигналов (хотя я думаю, что это действительно должно).Чтобы знать, когда QSound завершен, вы должны продолжать проверять его метод isFinished().Вы можете сделать это в цикле в вашем основном потоке, или получить более продвинутый уровень и создать QThread, который будет воспроизводить ваш звук, перейти в цикл и затем подать собственный сигнал после его завершения.QThread предпочтительнее, потому что вы никогда не должны блокировать ваш основной поток.После этого вы сможете подключить этот пользовательский soundIsFinished() СИГНАЛ, чтобы сказать close() СЛОТ вашего виджета, или любой другой обработчик.

Если вам нужны более продвинутые параметры, вы можете использовать phononмодуль , в который встроены все эти различные сигналы. Это немного раздражает в настройке, но тогда вам не понадобится QThread.

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

0 голосов
/ 01 апреля 2012

Чтобы выйти из приложения, вы должны закрыть виджет верхнего уровня (если у вашего приложения свойство с подробным именем quitOnLastWindowClosed установлено в true, но это значение по умолчанию, так что вам не о чем беспокоиться)или отправьте сигнал о выходе на созданное вами приложение QCoreApplication.В приведенном ниже примере я выбрал простой способ: подать сигнал закрытия.Как заявляет jdi, было бы лучше создать Thread, но я понял, что вы изучаете только Qt, и написал это в качестве примера, так что ожидание isFinished достаточно хорошо.Ниже приведен пример того, как это должно происходить:

#include "playsound.h"

playSound::playSound(QWidget *parent): QWidget(parent) {}

playSound::~playSound() {}

void playSound::playwav(int ch)
{
    QSound *player = 0; // Creates an object so that you can call player.isFinished()
                   // the isFinished function is not static.
    switch (ch)
    {
    case 1: {player = new QSound("/home/alok/qtworkspace/sounds/abc.wav"); break;}
    // other cases
    }
    if(!player)
       this->close();

    while(!player->isFinished()); // waits until the player has finished playing
    delete player;
    this->close(); // closes this widget, and
                   // as this Widget has no parent, i.e. it's the "top-level" widget,
                   // it'll close the app.
}

edit : Позор мне за то, что я не читал документы так, как должен был.QSound не имеет конструктора по умолчанию, я редактировал код.Несколько замечаний: поскольку это всего лишь тест для вас, чтобы узнать, как использовать Qt, я создал указатель на QSound и удалил его позже.Это не очень хороший подход, вы не должны играть с указателями, как я это делал, гораздо лучшим решением было бы только создание экземпляра объекта, который вы бы использовали.Необходимость удалять вещи вручную - это нехорошо, и для этого действительно лучше положиться на хороший старый стек.

...