我正在从堆栈溢出的例子中创建一个非常简单的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
答案 0 :(得分:2)
您的项目中有几个问题正在进行中:
QCoreApplication在一个应该显示QWidget的程序中
调用main.cpp源文件main.moc。这表明你不太了解moc是如何工作的以及它是什么。
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以进行正确的调试。