2014-01-12 77 views
1

我從這裏給出的一個堆棧溢出的例子中創建了一個非常簡單的C++ QT控制檯應用程序。Qt控制檯應用程序「警告:QApplication沒有在main()線程中創建」

How to use QFileSystemWatcher to monitor a folder for change

的代碼是完全一樣的在應用程序的代碼,我用Qt的用戶界面,Qt Creator的使用MinGW 32位發展。我從我可以選擇的項目中選擇控制檯應用程序,因爲我不需要圖形用戶界面。應用程序加載完成後,應用程序將顯示錯誤消息「警告: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」。

  • 即使您只是在閱讀而不是修改,您在使用foreach進行迭代時並未對字符串使用const引用。

  • 你很難在一個良好分離的地方編碼路徑在這裏,而不是一個常量字符串的:watcher.addPath("C:/QtTest");

  • 你加入widgets到CONFIG變量,但您刪除gui

  • 如果默認情況下,您正在將`core添加到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

相關問題