- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在我的文件 console.h/.cpp 中,我有一个小类,它只要求用户输入一些文本,然后再次打印文本,直到用户输入“退出”(参见方法 consoleMain()
)。然而,在 main.cpp 我也有一个QFileSystemWatcher
监视文件 MyTextFile.txt 并在文本文件更改时调用 Console::slotFileChanged(QString)
。不幸的是,QFileSystemWatcher
不起作用。 Console::slotFileChanged(QString)
在我更改文本文件时从不执行。据我所知,QFileSystemWatcher
仅在主事件循环已启动时才起作用,我的代码也是如此。当我在 main.cpp 中禁用 QTimer::singlaShot
并将其替换为 emit console.signalStart()
不会进入主事件循环,但我看到 QFileSystemWatcher
的消息(“文件已更改!”)在我输入“退出” 后。问题是:是否可以让用户与控制台交互并让 FileWatcher 在并行更改文本文件时发出信号?(我还尝试将 QFileSystemWatcher
放入控制台类并在堆上创建它;不幸的是它没有改变任何东西)
这是我的代码:
console.h
#ifndef CONSOLE_H
#define CONSOLE_H
#include <iostream>
#include <QObject>
#include <QFileSystemWatcher>
class Console: public QObject
{
Q_OBJECT
public:
Console(QObject *parent = 0);
~Console();
signals:
void signalStart();
void signalEnd();
public slots:
void consoleMain();
void slotFileChanged(QString text);
void slotEmit();
};
#endif // CONSOLE_H
控制台.cpp
#include "console.h"
Console::Console(QObject *parent): QObject(parent)
{
}
Console::~Console()
{
}
void Console::consoleMain()
{
bool isRunning = true;
std::string in;
while (isRunning)
{
std::cout << ">" << std::flush;
std::getline(std::cin, in);
if (in.compare("quit") == 0)
isRunning = false;
else
std::cout << "You have entered: " << in << std::endl;
}
emit signalEnd();
}
void Console::slotFileChanged(QString text)
{
Q_UNUSED(text);
std::cout << "File changed!" << std::endl;
}
void Console::slotEmit()
{
emit signalStart();
}
main.cpp
#include "console.h"
#include <QCoreApplication>
#include <QTimer>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFileSystemWatcher watcher(&a);
watcher.addPath("C:/MyTextFile.txt");
Console console(&a);
QObject::connect(&console, SIGNAL(signalStart()), &console, SLOT(consoleMain()));
QObject::connect(&console, SIGNAL(signalEnd()), &a, SLOT(quit()));
QObject::connect(&watcher, SIGNAL(fileChanged(QString)), &console, SLOT(slotFileChanged(QString)));
QTimer::singleShot(0, &console, SLOT(slotEmit()));
//emit console.signalStart();
std::cout << "Enter main event loop now" << std::endl;
return a.exec();
}
最佳答案
好的,解决了。我已经使用不同的线程尝试了 Yakk 的想法(感谢 Yakk 的想法)。我不得不引入一个名为 MyObject
的 QObject
的新子类。在其构造函数中,我为控制台对象创建了 Console
和一个新的 QThread
。 QFileSystemWatcher
是在 main.cpp 中创建的,也是 MyObjcet
的一个实例。见下面的代码:
myobject.h
#ifndef MYOBJECT_H
#define MYOBJECT_H
#include "console.h"
#include <QThread>
#include <QCoreApplication>
class MyObject : public QObject
{
Q_OBJECT
public:
MyObject(QObject *parent = 0);
~MyObject();
private:
QThread *thread;
Console *console;
signals:
void signalStart();
public slots:
void slotFileChanged(QString text);
void slotEnd();
};
#endif // MYOBJECT_H
myobject.cpp
#include "myobject.h"
MyObject::MyObject(QObject *parent): QObject(parent)
{
console = new Console;
thread = new QThread(this);
console->moveToThread(thread);
thread->start();
connect(this, SIGNAL(signalStart()), console, SLOT(consoleMain()));
connect(console, SIGNAL(signalEnd()), this, SLOT(slotEnd()));
emit signalStart();
}
MyObject::~MyObject()
{
thread->quit();
thread->wait();
}
void MyObject::slotFileChanged(QString text)
{
console->displayChangedFileText(text);
}
void MyObject::slotEnd()
{
QCoreApplication::exit(0);
}
main.cpp
#include "myobject.h"
#include <QTimer>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFileSystemWatcher *watcher = new QFileSystemWatcher(&a);
watcher->addPath("C:/MyTextFile.txt");
MyObject *object = new MyObject(&a);
QObject::connect(watcher, SIGNAL(fileChanged(QString)), object, SLOT(slotFileChanged(QString)));
std::cout << "Enter main event loop now" << std::endl;
return a.exec();
}
console.h/.cpp 未更改,只有 Console::slotFileChanged(QString)
被替换为 Console::displayChangedFileText(QString)
.
关于c++ - QFileSystemWatcher 不在控制台应用程序中发出 fileChanged(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29807758/
看似简单,实则行不通。我安装了 usbautomount。 #Watch the media directory and connect to enable save csv pb self.usb_
我有一个 QT 应用程序需要知道特定文件中的新数据何时可用。所以我使用了 QFileSystemWatcher 并将 fileChanged 信号连接到一个函数,该函数将在发生更改时发送消息。 问题是
我有以下问题:我创建了一个 QFileSystemWatcher它在 Linux 上运行良好,但在 Windows 7 上无法正常运行。您能在代码中发现任何可能使其无法工作的内容吗? 谢谢。 这是初始
QFileSystemWatcher watcher; watcher.addPath("C:/watch"); QStringList directoryList = watcher.directo
我正在摆弄 QFileSystemWatcher,跟随 this example .但是在编译时出现 Unresolved external symbol 错误。这是我的代码: #include #
大家好我想使用QFileSystemWatcher递归地观察给定目录及其子目录的变化,但是void QFileSystemWatcher::addPath (const QString & path)
我正在使用 QFileSystemWatcher 来监视我在 watcher->addPath("myPath") 方法中设置的目录中的更改。 当我调用 watcher->directories()
摘自 How do I watch a file for changes? 中的片段: ... @QtCore.pyqtSlot(str) def file_changed(path): pr
在我的文件 console.h/.cpp 中,我有一个小类,它只要求用户输入一些文本,然后再次打印文本,直到用户输入“退出”(参见方法 consoleMain())。然而,在 main.cpp 我也有
我遇到文件被两次上传到服务器的问题。 我在 Windows XP 上使用 C++ Qt 的 QFileSystemWatcher 类在文件夹更改时发送文件文件很小 (1-12kb)。 应用程序通过在文
我是 QT 新手,我想使用 QFileSystemWatcher 来监控文件夹。我只是想不出该怎么做。 我读过 http://qt-project.org/doc/qt-4.8/qfilesystem
我提前道歉,我是 QT 的新手(而且是 C++ 的新手) 我正在尝试设置一个程序,该程序将在特定文件发生更改时执行某个功能。尽管在谷歌上花了几个小时并阅读了 QT 上提供的文档,但我无法找到一种方法让
我有一个 QTreeView,它是通过重新实现 QFileSystemModel 填充的。据我所知,QFileSystemModel 在 rootPath 上安装了一个 QFileSystemWatc
如何从 QFileSystemWatcher directoryChanged 事件中获取更改的文件名? 最佳答案 如果您对文件名更感兴趣,则需要将插槽连接到 fileChanged() 信号而不是
我正在尝试检测由另一个 tcl/python 应用程序修改的文件中的更改。我对文件使用了 QFileSystemWatcher addPath。它不会针对文件更改发出 fileChanged(QStr
这是我的应用程序的基本前提: 我已经建立了一个 QFileSystemWatcher 来监视目录。 Path = [r'C:\Users\user\Documents\Images'] Directo
我有一个 Qt 5 C++ 应用程序,它使用 QFileSystemWatcher 运行很好地监视本地文件。我现在正试图在另一台主机上观看通过 nfs 安装的文件。虽然我的应用可以打开和读取文件,但它
我需要查看qt中的目录。创建了连接。但是当文件被编辑时,发送者会发出两次目录更改信号。 filechanged 信号也同时发出。发射两次信号有什么用?有什么方法可以知道哪个文件/文件夹被更改了?请帮忙
我需要监控一个文件系统,我有一个函数可以递归浏览文件夹和文件,并将它们的路径添加到我的 QFileSystemWatcher 中: void watchFileSystem(const QDir& d
周末我试图解决这个问题,但无济于事。我似乎找不到使用 QFileSystemWatcher::Files() 的示例直接所以我想我会问。 我有一个程序: 让用户选择“来源”文件夹。 按下按钮开始查看源
我是一名优秀的程序员,十分优秀!