2013-09-07 2 views
0

저는 여기에 나열된 예제를 실행하려고합니다 : http://qt-project.org/doc/qt-5.1/qtmultimedia/qaudiooutput.html#details 그리고 저는 C++과 Qt를 처음 접했으므로 그 의미를 이해할 수 없습니다. 이것은 내가 그것을 구현하기 위해 노력하고있어 방법은 다음과 같습니다Qt에서 AudioOutput 예제 코드를 어떻게 실행합니까?

#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() 기능에 대한 설명에서와 동일한 코드입니다.

"멤버가 아닌 함수에서이 '를 잘못 사용했습니다"오류가 발생하고 함수의 끝에 가까운 행에 "값이없는 return 문"오류가 발생합니다. 내가 틀렸다고 확신한다. 코드와 함께 별도의 함수를 작성하고 main()에서 호출하려고 시도했지만 오류로 인해 새 함수를 호출했습니다.

+0

일반적으로 문서의 코드 스 니펫은 QT와 함께 제공되는 예제 프로젝트에서 가져온 것입니다. 약간의 코드를 붙여 넣기 만해도 작동하지 않으므로 모든 것을 찾아보십시오. –

+0

@RetiredNinja : QT = 빠른 시간 ... – lpapp

+0

아직 1 년이 지나도 해결되지 않았습니까? – lpapp

답변

1

원래 클래스가 해당 클래스를 나타내는 클래스 메서드 인 this에 포함되어 있기 때문입니다.

여기에서 코드를 주 기능 내에 복사했으며 this은 그 의미를 잃었습니다.

스마트 포인터 대신 QAudioOutput에 대한 스택 개체를 사용할 수 있습니다. 즉, this0으로 바꿉니다. 그러나 연결시 동일한 문제가 발생합니다.

주위에 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 예제를 찾을 수 있습니다.

+0

@Jamil : moc를 포함하십시오. 게시물을 업데이트했습니다.다시 시도하십시오. 이상한, 그것은 여기에서 일한다. 전체 경로를 염려하지 말고 코드를 복사하여 붙여 넣기 만하면됩니다. :-) – lpapp

+0

지금 봅니다. moc의 전체 경로는 무엇입니까? – JVE999

+0

그게 작동하지 않았다. 그것은 moc를 찾지 못했습니다. 나는 Qt가 소진되고 실제로 내가 찾던 것이 아니라는 것을 알았습니다. 그래서 나는 그것을 포기했습니다. – JVE999

관련 문제