Почему QAudioRecorder не записывается через конструктор?

#c #qt #qt5

#c #qt #qt5

Вопрос:

заголовок

 #ifndef AUDIORECORD_H
#define AUDIORECORD_H

#include <QMediaRecorder>
#include <QAudioRecorder>
#include <QUrl>

class AudioRecorder : public QAudioRecorder
{
    Q_OBJECT

public:
    AudioRecorder(QObject * parent);
    ~AudioRecorder(){}

};

#endif // AUDIORECORD_H
  

Источник

 #include "audiorecord.h"
#include<iostream>
using namespace std;
AudioRecorder::AudioRecorder(QObject * parent = 0)
{
    this->setOutputLocation(QUrl::fromLocalFile("test.mp3"));

    int x = 0;
    while ( x > 10000)
    {
        this->record();
        x  ;
    }

    this->stop();

    std::cout<<"ndsffsdfn";
}
  

main.cpp

 #include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "audiorecord.h"
int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QObject p;
    AudioRecorder obj(amp;p);
    
    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}
  

Это не приводит к какой-либо ошибке, но и не записывается. Я не ожидаю какой-либо качественной или полноценной записи.

Я просто хочу посмотреть, как работает этот рекордер.

Этот файл test.mp3 не сохраняется.
Какой минимальный минимум я могу добавить или вычесть из него, чтобы он что-то записал и сохранил?

Ответ №1:

Причина

Что было бы, если бы я сказал вам 10 000 раз: иди купи молока, крепко держа тебя за руку, а затем, прежде чем я отпущу тебя, скажи: Ах, забыл об этом? Сможете ли вы купить молоко?

Вы делаете то же самое со своим кодом:

 int x = 0;
while ( x > 10000)
{
    this->record();
    x  ;
}

this->stop();
  

Вы вызываете 10 000 раз QAudioRecorder::record , но не позволяете Qt перейти к циклу событий и фактически выполнить вашу команду. Затем, непосредственно перед тем, как Qt перейдет к циклу событий, вы говорите: stop .

Решение

Прежде всего, вам не нужно создавать подклассы QAudioRecorder , потому что вы не добавляете в него никаких новых функций. Просто создайте экземпляр класса и используйте его.

Во-вторых, record и stop являются слотами. Подключите их к clicked сигналу соответствующих кнопок в вашем графическом интерфейсе, например:

 auto *audioRecorder = new QAudioRecorder(this);

...

connect(btnRecord, amp;QPushButton::clicked, audioRecorder, amp;QAudioRecorder::record);
connect(btnStop, amp;QPushButton::clicked, audioRecorder, amp;QAudioRecorder::stop);
  

Примечание: Для получения дополнительной информации, пожалуйста, взгляните на пример из документации.