Qt控制台应用程序“警告:QApplication未在main()线程中创建”

时间:2014-01-12 17:20:17

标签: c++ qt qt-creator qmake qtgui

我正在从堆栈溢出的例子中创建一个非常简单的C ++ QT控制台应用程序。

How to use QFileSystemWatcher to monitor a folder for change

代码与该应用程序中的代码完全一样,我正在使用Qt的UI,Qt Creator和MinGW 32位进行开发。我从我可以选择的项目中选择了控制台应用程序,因为我不需要图形用户界面。应用程序完成加载后,应用程序会显示错误消息“警告:未在main()线程中创建QApplication”,然后什么都不做。

我已经尝试过调试应用程序,但没有得到断点,我不认为调试在编辑器中有效。

我快速完成了将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 个答案:

答案 0 :(得分:2)

您的项目中有几个问题正在进行中:

  • QCoreApplication在一个应该显示QWidget的程序中

  • 调用main.cpp源文件main.moc。这表明你不太了解moc是如何工作的以及它是什么。

  • 在Qt程序中
  • cout而不是QTextStream或qDebug()。

  • 源代码中的Q_FOREACH未被其他应用程序重用,因此通常不会发生冲突。你应该简单地使用“foreach”。

  • 使用foreach迭代时,你没有使用const引用,即使你似乎只是在阅读它而不是修改它。

  • 此处有硬编码路径,而不是位于分离良好的地方的常量字符串: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