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以进行调试.
标签:qtgui,c,qt,qt-creator,qmake 来源: https://codeday.me/bug/20191013/1907393.html