2014-01-12 2 views
1

Я создаю очень простое консольное приложение C++ QT из приведенного здесь примера при переполнении стека.Приложение Qt-консоли «ПРЕДУПРЕЖДЕНИЕ: QApplication не был создан в потоке main()»

How to use QFileSystemWatcher to monitor a folder for change

код точно так, как код в этом приложении, и я разрабатываю с UI в 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 
+0

Пока неясно, что вы просите, потому что нет никакого кода –

+0

код находится в ссылке. – ceorron

+0

Непонятная вещь о Qt заключается в том, что вам нужно создать объект QApplication, прежде чем делать что-либо еще, даже если вы не получили доступ к этому объекту напрямую. Похоже, это то, чего не хватает в вашем коде. –

ответ

2

У вас было несколько вопросов, текущих в проекте:

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

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

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

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

  • Вы не используете ссылку const для строки, итерации с помощью 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 для отладки.

Setting Up Debugger

+0

Примечание Ласло это место для ответов на вопрос, а не критика кода. Имейте в виду, что код является модификацией кода в ссылке. Я бы предположил, что вы смотрите туда, если у вас есть много проблем, спасибо за помощь в любом случае. – ceorron

+2

@ceorron: если вы вставляете код здесь, ожидайте, что некоторые люди посвятят свое свободное время, чтобы помочь вам с этим как можно больше. Мой ответ также охватывает решение, с дополнительными помещениями для улучшения. Пожалуйста, не считайте это личным, или что отрицательно. Мы здесь для улучшения вещей, не так ли? :-) – lpapp

+0

Да, мы здесь, чтобы улучшить ситуацию, и здорово, что вы потратите время, и я сделаю эти изменения. Спасибо. Я просто хотел сказать, что в общем случае переполнение стека - это ответы, а не критические замечания вообще. – ceorron