首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >QFileSystemWatcher不发送fileChanged()信号

QFileSystemWatcher不发送fileChanged()信号
EN

Stack Overflow用户
提问于 2022-07-12 04:28:20
回答 2查看 177关注 0票数 3

我提前向您道歉,我对QT非常陌生(对C++来说也相当陌生)

我正在尝试设置一个程序,它将在任何特定文件被更改时执行一个函数。尽管在google上工作了几个小时,并且阅读了QT上提供的文档,但在编辑SSOpen_Log时,我仍然找不到一种方法来执行myfunction()。

目前,我的代码如下所示(SOpen_Log是在.h中声明的QString ):

代码语言:javascript
复制
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    QFileSystemWatcher watcher;
    watcher.addPath(SOpen_Log);
    MainWindow::connect(&watcher, SIGNAL(fileChanged(QString)), this, SLOT(myfunction()));
}

MainWindow::myfunction()
{
    //mycode executes here
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-12 08:35:38

您在堆栈上分配了实例,当构造函数结束时,它就会被解构。我建议您为实例设置一个类成员,以便它在整个类中仍然有效。

代码语言:javascript
复制
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    m_watcher.addPath(SOpen_Log);
    MainWindow::connect(&m_watcher, SIGNAL(fileChanged(QString)), this, SLOT(myfunction()));
}

没有必要通过有效地使用指针将其放到堆中来使这个问题复杂化,尽管这也是一个需要考虑的选项。

代码语言:javascript
复制
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    QFileSystemWatcher *watcher = new QFileSystemWatcher(this);
    watcher->addPath(SOpen_Log);
    MainWindow::connect(watcher, SIGNAL(fileChanged(QString)), this, SLOT(myfunction()));
}

在我们做这件事的时候,我还想提到使用新的信号槽语法风格,而不是旧的。在运行时检查旧的,在编译时检查新的。因此,您可以在编译期间而不是在运行时捕获与它有关的任何问题。

票数 2
EN

Stack Overflow用户

发布于 2022-07-12 05:31:26

一个完整而简单的例子: Dirwatcher.h

代码语言:javascript
复制
   class DirWatcher : public QObject
{
    Q_OBJECT
public:
    static const int sMaxCount = 5;

    explicit DirWatcher(const QString& root, QObject* parent = nullptr);
    virtual ~DirWatcher();

private slots:

    void hDirChanged(const QString&);

    void hFileChanged(const QString&);

private:

    quint64 m_rbSize;
    QByteArray m_ringBuffer[10];
    QFileSystemWatcher m_watcher;
    QDir m_root;
    QSet<QString> m_directories;
    QMap<QString, QSet<QString>> m_abspaths;
    QString m_lastKey;

};

和Dirwatcher.cpp

代码语言:javascript
复制
namespace
{

    void split(const char* str, const char* delim, std::vector<std::string>& out)
    {
        const char* begin = str;
        const char* it = strstr(str, delim);
        if (it != NULL)
        {
            std::string data{begin, it};
            out.push_back(data);
            it++;
            split(it, delim, out);
        } else {
            std::string data{str};
            out.push_back(data);
        }
    }
}


DirWatcher::DirWatcher(const QString &root, QObject* parent):
    QObject(parent), m_root(root), m_rbSize{10}
{

    m_watcher.addPath(root);

    QObject::connect(&m_watcher, SIGNAL(directoryChanged(const QString&)),
                                        this, SLOT(hDirChanged(const QString&)));


    QObject::connect(&m_watcher, SIGNAL(fileChanged(const QString&)),
                                        this, SLOT(hFileChanged(const QString&)));


}

DirWatcher::~DirWatcher()
{

}


void DirWatcher::hDirChanged(const QString &path)
{
    QDirIterator it(m_root.path());
    while (it.hasNext()) {
        QString d = it.next();
        if (d.at(0) == '.' || d.at(d.size()-1) == '.') {
        } else {
            if (!m_directories.contains(d)){
                m_directories << d;
                m_lastKey = d;
            }
        }

    }

#if 0 //delete directories when count reaches...
    if (m_directories.count() > DirWatcher::sMaxCount) {
        QSetIterator<QString> setit(m_directories);
        while (setit.hasNext()) {
            QString toDel = setit.next();
            if (toDel != m_lastKey) {
                QDir rem (toDel);
                rem.removeRecursively();
            }
        }
        m_directories.clear();
        m_directories << m_lastKey;
    }
#endif
    std::cout << "##############################################\r\n";
    QSetIterator<QString> setit(m_directories);
    while (setit.hasNext()) {
        QString d = setit.next();
        if (d.contains(".tlf")) {
            m_watcher.addPath(d);
        }
        std::cout << d.toStdString() << std::endl;
    }
}


void DirWatcher::hFileChanged(const QString& file)
{
    static size_t cnt = 0;
    QFile f{file};
    if (f.open(QFile::ReadOnly)) {
        quint64 s = f.size();
        f.seek(f.size()-f.size()/2);
        while (!f.atEnd()) {
            QByteArray data = f.readLine();
            m_ringBuffer[cnt++ % m_rbSize]=data;
        }
    }

    std::cout << "----------------- B E G I N ----------------------\r\n";
    for(auto i : m_ringBuffer) {
        std::cout << "~~~~~~\r\n";
        std::cout << i.toStdString().c_str() << "\r\n";
    }
}

这是一个实际的后台监视作业过程,用于删除给定时间或计数的文件,但如果调试代码,您将了解代码中缺少什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72947048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档