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

我正在通过堆栈溢出此处给出的示例创建一个非常简单的C QT控制台应用程序.

How to use QFileSystemWatcher to monitor a folder for change

该代码与该应用程序中的代码完全相同,我正在使用Qt的UI(带有MinGW 32位的Qt Creator)进行开发.我从可以选择的项目中选择了控制台应用程序,因为我不需要图形用户界面.一旦应用程序完成加载,应用程序将显示错误消息“警告: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

解决方法:

您的项目中存在几个问题:

>应该在程序中显示QWidget的QCoreApplication
>调用main.cpp源文件main.moc.这表明您不太了解moc的工作原理及其含义.
>与QTextStream或qDebug()相对的Qt程序中的cout.
>源代码中的Q_FOREACH不被其他应用程序重用,因此通常不会发生冲突.您应该简单地使用“ foreach”.
>在使用foreach进行迭代时,即使您似乎只是在读取而不修改,也没有在字符串上使用const引用.
>您在这里有硬编码的路径,而不是在分隔良好的位置使用const字符串:watcher.addPath(“ C:/ QtTest”);
>您正在将小部件添加到CONFIG变量,但删除了gui.
>默认情况下,您要将`core添加到CONFIG变量中.
>您包括#include< QtWidgets / QFoo>而不是#include< QFoo>保留使用Qt 4进行构建的选项,并且通常使用清晰的buildsystem包含路径.
>您正在为非基于控制台的应用程序添加CONFIG = console.
>您正在为非基于控制台的应用程序添加CONFIG-= app_bundle.
>您将反斜杠用于SOURCES变量,而不是HEADERS.这是不一致的.
>您可以在堆上而不是堆栈上创建MyClass实例,从而使它更简单,因为事件循环已经对其进行了适当的保护,以使其对预期的范围仍然有效.

最重要的是,您的问题似乎与基于评论讨论的qDebug()有关.您应该遵循下面的文档,以了解如何正确设置QtCreator以进行调试.

Setting Up Debugger

上一篇:c-QListWidget,为更长的文本插入换行符


下一篇:c – Qt标签顺序键