0

我在不使用的QAudioRecorder情况下使用时遇到了麻烦QMainWindow。它将创建一个 0 字节的文件,在此处运行此脚本后,大多数普通媒体播放器都无法播放该文件:

int main(int argc, char *argv[]){
    QAudioRecorder q;
    q.setAudioInput(q.audioInputs()[0]);
    q.setOutputLocation(QUrl::fromLocalFile("simon.amr"));
    q.record();
    Sleep(10000);
}

而这有效:

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
};

QAudioRecorder q;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    std::cout << "DEFAULT: " << q.defaultAudioInput().toStdString() << std::endl;
    std::cout << "List: " << q.audioInputs().join(',').toStdString() << std::endl;
    std::cout << "STATUS 0: " << q.status() << std::endl;
    std::cout << "Location: " << QUrl::fromLocalFile("simon.amr").path().toStdString() << std::endl;
    q.setAudioInput(q.audioInputs()[0]);
    q.setOutputLocation(QUrl::fromLocalFile("simon.amr"));
    q.record();

    std::cout << "STATUS 1: " << q.status() << std::endl;
}

MainWindow::~MainWindow()
{
    std::cout << "STATUS 2: " << q.status() << std::endl;
}

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

    MainWindow recorder;
    recorder.show();

    return app.exec();
}

QAudioRecorder没有我怎么使用QMainWindow?难道我做错了什么?

4

2 回答 2

2

QAudioRecorder 的内部状态通过信号和槽进行管理。这需要一个正在运行的事件循环;

QCoreApplication应该用于控制台应用程序。

QApplication应该用于 GUI 应用程序。

在你上面的例子中, MainWindow 甚至不是必需的,它是 app.exec() 发生魔法的地方。

于 2013-11-27T20:38:53.770 回答
0
int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    QAudioRecorder q; 
    q.setAudioInput(q.audioInputs()[0]);    
    q.setOutputLocation(QUrl::fromLocalFile("simon.amr"));    
    q.record();

    return app.exec();
}

你需要一个 qt 事件循环。Sleep 不提供 QCoreApplication 提供的事件和信号处理。

请阅读它,否则你不会在 Qt 中走得太远,因为这是 Qt 的核心机制。

祝你的项目好运!

于 2013-11-27T22:23:10.573 回答