怎样C语言编程触发QFileSystemWatcher类发出fileChanged()信号

我不会Debug 2012-04-20 04:12:00
实现功能:当/home/ma/ma.txt文件被修改后,实时显示在TextEdit文本框里,用C语言对文件ma.txt修改(open()/write()等函数)则触发不了fileChanged(),但是用VIM打开时可以触发,我该怎么C编程来实现fileChanged()信号触发呢?
...全文
452 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
renguozhao 2013-03-13
  • 打赏
  • 举报
回复
你板子的内核是啥版本, 2.6.13以前是不支持 notify
我不会Debug 2012-04-22
  • 打赏
  • 举报
回复
你好,我上位机Qt版本是4.8.1,开发板里的QtE版本是4.6.3,上位机Vmware里QT程序当文本更改时可以触发信号并更新显示,当移植到开发板上后显示正常但是触发不了信号,4.6.3也是支持QFileSystemWatcher的,请问可能是什么原因导致的呢?
谢谢
xiachm 2012-04-21
  • 打赏
  • 举报
回复
楼主监控的是个目录,而不是文件。看下帮助文档就知道,path是目录时与path是文件时的监控行为是不一样的。用vi之所以可以是因为vi 在打开文件时会创建一个临时文件,从而导致目录发生变化。
我不会Debug 2012-04-21
  • 打赏
  • 举报
回复
谢谢各位 问题解决了
我不会Debug 2012-04-21
  • 打赏
  • 举报
回复
谢谢各位 问题解决,结贴撒分
我不会Debug 2012-04-20
  • 打赏
  • 举报
回复
你好 我的c程序对文件ma1.txt进行写操作,不知何故 。。。
echo ma1.txt >test.txt 这个操作我在终端执行,也不会触发,目前我试验的只有vim的操作可行,深层次的原因实在不懂 。。。
feilinhe 2012-04-20
  • 打赏
  • 举报
回复
这个类 Qt Assistant上写:“The fileChanged() signal is emitted when a file has been modified, renamed or removed from disk.”
根据我的理解文件或目录被修改,重命名,删除时才发送信号,LZ的操作只是打开文件读,没有写,所以没有发送信号,5楼的大哥的例子是往里面写东西了才有信号产生的
我不会Debug 2012-04-20
  • 打赏
  • 举报
回复
你好,我的代码写的很菜鸟,我还没QT入门,不好意思,请问你的代码是如何触发fileChanged的? 我的代码C语言函数open() write()等操作文件根本无法触发changeread执行 你能帮我分析下吗?谢谢
我不会Debug 2012-04-20
  • 打赏
  • 举报
回复
Sorry My VMware can not input chinese today!
There is my code and it is no signal directoryChanged() !
Thanks!

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtCore/QFile>
#include <QtCore/QTextStream>
#include <QFileSystemWatcher>
#include <QDir>
MainWindow::MainWindow(QWidget *parent):
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);

changeread();
path1="/home/ma/ma1/";
fsWatcher=new QFileSystemWatcher();

fsWatcher->addPath(path1);
connect(fsWatcher, SIGNAL(directoryChanged(QString)), this, SLOT(changeread()));

/*
fsWatcher->addPaths(path2);
connect(fsWatcher, SIGNAL(directoryChanged(QString)), this, SLOT(loadtextfile2()));

fsWatcher->addPaths(path3);
connect(fsWatcher, SIGNAL(directoryChanged(QString)), this, SLOT(loadtextfile3()));

fsWatcher->addPaths(path4);
connect(fsWatcher, SIGNAL(directoryChanged(QString)), this, SLOT(loadtextfile4()));
*/
}
void MainWindow::loadtextfile1()
{
QFile inputFile("/home/ma/ma1/ma1.txt");
inputFile.open(QIODevice::ReadOnly);
QTextStream in(&inputFile);
QString line = in.readAll();
inputFile.close();
ui->textEdit->setPlainText(line);
}

void MainWindow::loadtextfile2()
{
QFile inputFile("/home/ma/ma2/ma2.txt");
inputFile.open(QIODevice::ReadOnly);
QTextStream in(&inputFile);
QString line = in.readAll();
inputFile.close();
ui->textEdit_2->setPlainText(line);
}
void MainWindow::loadtextfile3()
{
QFile inputFile("/home/ma/ma3/ma3.txt");
inputFile.open(QIODevice::ReadOnly);
QTextStream in(&inputFile);
QString line = in.readAll();
inputFile.close();
ui->textEdit_3->setPlainText(line);
}
void MainWindow::loadtextfile4()
{
QFile inputFile("/home/ma/ma4/ma4.txt");
inputFile.open(QIODevice::ReadOnly);
QTextStream in(&inputFile);
QString line = in.readAll();
inputFile.close();
ui->textEdit_4->setPlainText(line);
}

void MainWindow::changeread()
{
loadtextfile1();
loadtextfile2();
loadtextfile3();
loadtextfile4();
}
MainWindow::~MainWindow()
{
delete ui;
}

xiachm 2012-04-20
  • 打赏
  • 举报
回复
另外,所有对文件的操作一定会发射信号的。也许你的代码有问题,我简单写了一个,测试没问题的。


CMainForm::CMainForm(QWidget *parent)
: QWidget(parent),
ui(new Ui::CMainForm)
{
ui->setupUi(this);

watcher.addPath("/home/xiachm/123");
connect(&watcher, SIGNAL(fileChanged(const QString &)), this, SLOT(fileChanged(const QString &)));
}

void CMainForm::fileChanged(const QString &path)
{
qDebug() << path;
}

void CMainForm::on_button_clicked()
{
QFile file("/home/xiachm/123");
file.open(QIODevice::WriteOnly);
file.write("xiachm");
file.close();
}
xiachm 2012-04-20
  • 打赏
  • 举报
回复
你用echo XXXX > ma.txt不行吗?
我不会Debug 2012-04-20
  • 打赏
  • 举报
回复
帮帮忙撒 大家
我不会Debug 2012-04-20
  • 打赏
  • 举报
回复
写个脚本也好
#!bin/sh
cd /home/ma/
vim ma.txt

这样可以触发,有点麻烦 还有就是vim ma.txt之后怎么关闭文件?
我不会Debug 2012-04-20
  • 打赏
  • 举报
回复
自己顶一个,急需 牛人快快现身

16,211

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧