简单的声音(.wav)在QT(C ++)中播放应用程序

时间:2012-03-31 18:52:11

标签: c++ qt audio wav

我是Qt的新手并且正在尝试编写一个可以规划wav文件的简单qt类。 经过一番阅读和环顾四周,我写了课程,代码如下。问题在代码

之后
#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创建器中“应用程序输出”区域中的红色按钮强行关闭它。我尝试使用Qwidget中的close()和QApplication中的quit(),但可能我做错了。怎么去了?

2)这个功能可以实现更简单的实现吗?你知道一些不涉及事件循环的东西。我试图用旧式的C ++风格来做这件事,当我需要播放声音并完成它但是无法完成它时,我调用了一个函数。建议最受欢迎。

由于

2 个答案:

答案 0 :(得分:2)

我可以使用PyQt4提供答案(因为我是一个python编码器),但这个想法是一样的。

1)QSound是播放声音的一个非常基本的界面。它没有任何有用的信号(虽然我认为它确实应该)。为了知道QSound何时完成,您必须继续检查其isFinished()方法。您可以在主线程的循环中执行此操作,或者获得更高级的功能并创建一个QThread,它将播放您的声音,进入循环,然后在完成时发出自己的自定义信号。 QThread是首选,因为你永远不应该阻止你的主线程。然后,您就可以将此自定义soundIsFinished() SIGNAL连接到您的窗口小部件的close() SLOT或任何其他处理程序。

如果你想要更高级的选项,你可以使用phonon module,它内置了所有这些不同的信号。它的设置更加烦人,但是你不需要QThread。

2)事件循环是Qt如何运作的核心概念。您的主应用程序始终进入事件循环,以便窗口小部件可以发布其事件并对其进行处理。从技术上讲,你可以在没有事件循环的情况下使用Qt,但是它真的没有意义,因为你只是在与框架作斗争并失去它能够做的一切。

答案 1 :(得分:0)

要退出应用程序,您必须关闭顶级窗口小部件(如果您的应用程序将名为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.
}

编辑:因为没有阅读我应该拥有的文档而感到羞耻。 QSound没有默认构造函数,我编辑了代码。 一些注意事项:因为这只是对你学习如何使用Qt的测试,我已经创建了一个指向QSound的指针并在之后将其删除。这不是一个好方法,你不应该像我那样使用指针,更好的解决方案只是实例化你将使用的对象。不得不手动删除东西并不好,依靠好的堆栈来实现更好。