0

我正在尝试运行此处列出的示例: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'”错误和一个“没有值的返回语句”错误。我确定我做错了。我尝试使用代码创建一个单独的函数并从中调用它main(),但这导致调用新函数时出错。

4

1 回答 1

1

这是因为原始类在一个类方法中,其中this单词指的是所讨论的类。

这里你复制了 main 函数内部的代码,this失去了它的意义。

您可以改用智能指针,或者只是 QAudioOutput 的堆栈对象,同时替换this0. 但是,您在连接中会遇到同样的问题。

如果您周围有 QCoreApplication,则可以使用 QCoreApplication 替换this为父级。但是,您仍然会遇到插槽名称的问题,因为它似乎也没有在任何地方定义。

这有点离题,但在这里包含整个 QtWidgets 是没有意义的。即使在这种情况下无关紧要,这通常也会减慢编译速度。

QFile 和 QDebug 也不包括在内。许多 std 包含也是不必要的。你有一个“回报”;在一个名为 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

摘要:如果你想坚持那个例子,我建议把那个代码放在一个类中。这对你来说是最简单的。

在这里,您可以找到另一个关于其正确和建议用法的 QAudioOutput 示例。

于 2013-09-07T05:38:33.030 回答