2015-10-17 10 views
1

Следующий код не работает. QSoundEffect :: status всегда возвращает QSoundEffect :: Loading и QSoundEffect :: isLoaded возвращает false.QSoundEffect всегда загружает статус в Qt 5.4

QFile file("file.wav"); 
file.open(QIODevice::ReadWrite); 
QByteArray data = file.readAll(); 
file.close(); 

QSoundEffect sound; 
sound.setSource(QUrl::fromEncoded(data)); 
sound.setVolume(1.0f); 
sound.play(); 
+0

Вы принимаете содержимое файла file.wav и пытаетесь передать его в качестве исходного URL-адреса (!) QSoundEffect, что неверно. Вам нужно передать путь (например, QUrl :: fromLocalFile ("file: ///path/to/your/file.wav")). –

ответ

1

Я не знаю, если это ошибка или это просто недостаток информации в документации, но дело в том, что вам необходимо установить родитель для QSoundEffect.

Например, если вы поместите свой код в функцию main, это не сработает, так как я полагаю, вы уже проверили.

Однако, если вы напишете следующий код, где объект QSoundEffect имеет родительский элемент QWidget, вы услышите звук правильно.

uploaded полный пример GitHub)

main.cpp

#include "widget.h" 
#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    Widget q; 
    q.show(); 
    q.play(); 

    return a.exec(); 
} 

widget.h

#ifndef WIDGET_H 
#define WIDGET_H 

#include <QWidget> 
#include <QSoundEffect> 

class Widget : public QWidget 
{ 
    Q_OBJECT 

public: 
    Widget(QWidget *parent = 0); 
    ~Widget(); 
    void play(); 

private: 
    QSoundEffect effect; 
}; 

#endif // WIDGET_H 

widget.cpp

#include "widget.h" 

Widget::Widget(QWidget *parent) 
    : QWidget(parent) 
{  
    effect.setSource(QUrl::fromLocalFile(":res/kid_giggle.wav")); 
    effect.setLoopCount(QSoundEffect::Infinite); 
    effect.setVolume(1.00f); 
} 

Widget::~Widget() 
{ 
} 

void Widget::play() 
{ 
    effect.play(); 
}