Консольное приложение Qt "ВНИМАНИЕ: QApplication не был создан в потоке main()"

Я создаю очень простое консольное приложение C++ QT из приведенного здесь примера переполнения стека.

Как использовать QFileSystemWatcher для мониторинга папки на предмет изменений

Код точно такой же, как и код в этом приложении, и я разрабатываю с помощью пользовательского интерфейса Qt, Qt Creator с MinGW 32bit. Я выбрал консольное приложение из проектов, которые я мог выбрать, так как мне не нужен графический интерфейс пользователя. После завершения загрузки приложения отображается сообщение об ошибке "ПРЕДУПРЕЖДЕНИЕ. QApplication не был создан в потоке main()", после чего ничего не происходит.

Я попытался отладить приложение, но не получил никаких точек останова, я не думаю, что отладка работает в редакторе.

Я быстро пошел по другому пути и изменил QApplication на QCoreApplication, когда я разрабатываю консольное приложение, но получаю точно такое же сообщение об ошибке.

filesystemreceiver.h

#ifndef FILESYSTEMRECEIVER_H
#define FILESYSTEMRECEIVER_H

#include <iostream>

using namespace std;

#include <QtCore/QApplication>
#include <QtCore/QFileSystemWatcher>
#include <QtCore/QDebug>
#include <QtWidgets/QWidget>
#include <QtWidgets/QMessageBox>

class MyClass : public QWidget
{
    Q_OBJECT
public:
    MyClass(QWidget* parent=0)
        :QWidget(parent){}

    ~MyClass() {}
public slots:
    void showModified(const QString& str)
    {
        Q_UNUSED(str)
        cout << "A message has been received!" << endl;
        //QMessageBox::information(this,"Directory Modified", "Your Directory is modified");
    }
};

#endif // FILESYSTEMRECEIVER_H

main.cpp

#include <iostream>

using namespace std;

#include <QtCore/QApplication>
#include <QtCore/QFileSystemWatcher>
#include <QtCore/QDebug>
#include <QtWidgets/QWidget>
#include <QtWidgets/QMessageBox>

#include "fileSystemReceiver.h"

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    QFileSystemWatcher watcher;
    watcher.addPath("C:/QtTest");

    QStringList directoryList = watcher.directories();
    Q_FOREACH(QString directory, directoryList)
              qDebug() << "Directory name" << directory <<"\n";

    MyClass* mc = new MyClass;

    QObject::connect(&watcher, SIGNAL(directoryChanged(QString)), mc, SLOT(showModified(QString)));

    return app.exec();
}

Мой профессиональный файл выглядит так:

QT       += core
QT       += widgets

QT       -= gui

TARGET   =  fsw
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app

HEADERS += fileSystemReceiver.h

SOURCES  += \
    main.cpp

1 ответ

У вас было несколько проблем в вашем проекте:

  • QCoreApplication в программе, которая должна показывать QWidget

  • Вызов исходного файла main.cpp main.moc. Это означает, что вы не совсем понимаете, как работает moc и для чего он нужен.

  • cout в программе Qt, в отличие от QTextStream или qDebug().

  • Q_FOREACH в исходном коде не используется другим приложением, и, следовательно, обычно не может возникнуть коллизия. Вы должны использовать "foreach" просто.

  • Вы не используете константную ссылку для строки во время итерации с foreach, даже если кажется, что вы только читаете ее, а не модифицируете.

  • Здесь у вас есть жестко запрограммированный путь вместо константной строки в хорошо отделенном месте: watcher.addPath("C:/QtTest");

  • Вы добавляете widgets в переменную CONFIG, но вы удаляете gui,

  • Вы добавляете ядро ​​в переменную CONFIG, когда оно там по умолчанию.

  • Вы включаете #include <QtWidgets/QFoo> вместо #include <QFoo> сохранить возможность сборки с помощью Qt 4, и в целом с четко собранной системой включайте пути.

  • Вы добавляете CONFIG += console для неконсольного приложения.

  • Вы добавляете CONFIG -= app_bundle для неконсольного приложения.

  • Вы используете обратную косую черту для переменной SOURCES, но не для HEADERS. Это неуместно.

  • Вы создаете экземпляр MyClass в куче, а не в стеке, чтобы упростить его, так как он уже должным образом защищен циклом событий, чтобы оставаться действительным для предполагаемой области.

Вдобавок ко всему, ваша проблема, похоже, связана с qDebug(), основанной на обсуждении комментариев. Вы должны следовать документу ниже, как настроить QtCreator для правильной отладки.

Настройка отладчика

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