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

标签 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 creator 中“应用程序输出”区域中的红色按钮强行关闭它。我尝试使用 Qwidget 的 close() 和 QApplication 的 quit() 但可能我做错了。如何做到这一点?

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

谢谢

最佳答案

我可以使用 PyQt4 提供答案(因为我是一名 Python 编码员),但想法是一样的。

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

如果您需要更多高级选项,可以使用 phonon module ,它确实内置了所有这些不同的信号。设置起来有点烦人,但这样你就不需要 QThread 了。

2) 事件循环是 Qt 功能的核心概念。您的主应用程序总是进入一个事件循环,以便小部件可以发布它们的事件并处理它们。从技术上讲,您可以在没有事件循环的情况下使用 Qt,但这真的毫无意义,因为您只是在与框架作斗争,并失去了它的所有功能。

关于c++ - QT (C++) 中的简单声音 (.wav) 播放应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9958704/

相关文章:

c++ - 运行在同一台机器上编译的程序时 GLIBCXX 版本错误

C++ 从引用中转换

c++ - 使用调试器单步执行程序需要很长时间

ios - 快速音量 slider

javascript - 如何在 jquery 中使用音频标签自动播放音乐?

objective-c - 音频队列 |在 audioQueue 运行时更改音频设备

c++ - 在 QSplitter 中使用 QScrollArea 时的初始窗口大小稍微太小,导致滚动条出现

C++ - 声明一个仅包含非连续索引值的数组

c++ - 如何在最后一个窗口关闭时保持应用程序运行?

c++ - 使用 Qt 5.4 和 Clang(64 位)的 Mac 10.9 上的 Zipios 错误