Проблемы с функцией QTimer::singleShot

Я пытаюсь записать звук с помощью QAudioInput. Согласно документу на этом сайте QAudioInput. Но когда я запустился, он экспортировал пустой файл. После проверки кажется, что функция QTimer::singleShot не работает (я добавил оператор qWarning << "Done" в void stopRecording() и он не отображал "Done", так что я подумал, что в QTimer::singleShot есть какая-то ошибка).

Это мой код, используемый для проверки функции QTimer::singleShot

----Check.pro----
QT += core
QT -= gui
TARGET = Check
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
HEADERS += test.h

-----test.h------
#ifndef TEST_H
#define TEST_H

#include <QCoreApplication>
#include <QTimer>
#include <iostream>
#include <QObject>
#include <test.h>
#include <QDebug>

using namespace std;

class Object: public QObject {
   Q_OBJECT
private slots:
  void func() { cout << "Hello"; }
};

#endif // TEST_H

----main.cpp----
#include <QCoreApplication>
#include <QTimer>
#include <iostream>
#include <QObject>
#include <test.h>
#include <QDebug>

using namespace std;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Object *o = new Object;
    QTimer::singleShot(10000, o, SLOT(func()));
    return 0;
}

И этот код тоже не работает. Кто-нибудь может мне объяснить? Я новичок в Qt-программировании.

1 ответ

Решение

Ваша программа завершает работу сразу после установки таймера - у нее нет времени на запуск.

Чтобы таймер работал, вам нужно запустить цикл обработки событий. Без цикла обработки событий события не обрабатываются.

Измените последнюю строку вашего main в

return a.exec();

Также измените ваш тестовый слот, добавив << std::endl или смывать std::cout в противном случае вы можете не видеть вывод на консоли.

Ваша программа должна работать так, как ожидалось (за исключением того, что она никогда не завершится, поскольку ничто не приведет к остановке цикла событий - просто прервите его)

Другие вопросы по тегам