我正在尝试运行此处列出的示例:http://qt-project.org/doc/qt-5.1/qtmultimedia/qaudiooutput.html#details我是C ++和Qt的新手,所以我无法弄清楚它们的含义。这就是我试图实现它的方式:
#include <QtWidgets>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <string>
#include <QObject>
#include <QAudioOutput>
int main() {
QFile sourceFile; // class member.
QAudioOutput* audio; // class member.
{
sourceFile.setFileName("C:\\Documents\\ParadigmE3-shortened.wav");
sourceFile.open(QIODevice::ReadOnly);
QAudioFormat format;
// Set up the format, eg.
format.setSampleRate(8000);
format.setChannelCount(1);
format.setSampleSize(8);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::UnSignedInt);
QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
if (!info.isFormatSupported(format)) {
qWarning() << "Raw audio format not supported by backend, cannot play audio.";
return;
}
audio = new QAudioOutput(format, this);
connect(audio, SIGNAL(stateChanged(QAudio::State)), this, SLOT(handleStateChanged(QAudio::State)));
audio->start(&sourceFile);
}
}
它与描述中的代码相同,只是在int main()
函数中。
对于靠近函数末尾的行,我得到两个“在非成员函数中无效使用'this'”错误和一个“没有值的return语句”错误。我确定我做错了。我尝试使用代码创建一个单独的函数并从main()
调用它,但这导致调用新函数时出错。
答案 0 :(得分:1)
这是因为原始类在一个类方法中,this
字引用了相关的类。
在这里你复制了main函数中的代码,this
失去了意义。
您可以使用智能指针或仅使用QAudioOutput的堆栈对象,将this
替换为0
。但是,您在连接时会遇到同样的问题。
如果您有QCoreApplication,可以使用QCoreApplication将this
替换为父级。但是,您仍然会遇到插槽名称的问题,因为它似乎也没有在任何地方定义。
这是一个稍微偏离主题的内容,但在此处包含整个QtWidgets是没有意义的。即使在这种情况下并不重要,这也会减慢编译的速度。
QFile和QDebug也不包括在内。许多标准包含也是不必要的。你有一个“回归”;一个名为main的函数中的语句,您需要返回一个整数。那也不会编译。
这是你可以在一个非常简单的案例中得到的代码。虽然它是一个示例的切碎版本,但它可以帮助你理解错误:
#include <QAudioOutput>
#include <QFile>
#include <QDebug>
#include <QCoreApplication>
class AudioOutputTest : public QObject
{
Q_OBJECT
public Q_SLOTS:
void handleStateChanged(QAudio::State state) {
qWarning() << "state = " << state;
qApp->exit();
}
};
#include "main.moc"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFile sourceFile;
QAudioOutput* audio;
sourceFile.setFileName("ParadigmE3-shortened.wav");
sourceFile.open(QIODevice::ReadOnly);
QAudioFormat format;
// Set up the format, eg.
format.setSampleRate(8000);
format.setChannelCount(1);
format.setSampleSize(8);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::UnSignedInt);
QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
if (!info.isFormatSupported(format)) {
qWarning() << "Raw audio format not supported by backend, cannot play audio.";
return 1;
}
audio = new QAudioOutput(format, &a);
AudioOutputTest audioOutputTest;
QObject::connect(audio, SIGNAL(stateChanged(QAudio::State)), &audioOutputTest, SLOT(handleStateChanged(QAudio::State)));
audio->start(&sourceFile);
return a.exec();
}
我使用以下命令编译它:
g++ -I/usr/include/qt/QtMultimedia -I/usr/include/qt -I/usr/include/qt/QtCore -fPIC -lQt5Core -lQt5Multimedia qtaudio.cpp
总结:如果您想坚持这个例子,我建议将该代码放在一个类中。这对你来说是最简单的。
Here您可以找到另一个关于其正确和建议用法的QAudioOutput示例。