Консольное приложение 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 для правильной отладки.