我是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 ++风格来做这件事,当我需要播放声音并完成它但是无法完成它时,我调用了一个函数。建议最受欢迎。
由于
答案 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的指针并在之后将其删除。这不是一个好方法,你不应该像我那样使用指针,更好的解决方案只是实例化你将使用的对象。不得不手动删除东西并不好,依靠好的堆栈来实现更好。