Me.Doc 2024-05-12 22:54 采纳率: 33.3%
浏览 0
已结题

Qprocess无法找到最新的文件-QT

在下面的代码中,我通过信号槽实现了点击按钮page2_btn1,创建yaml文件,并连接文件夹改变信号,随后自动触发该信号对应的槽,在调用的reconnect()函数中可以通过dir找到最新的文件名称filename,但是通过QProcess类调用终端命令修改该文件时,却无法找到对应的最新的文件(QProcess命令行是正确的,通过system命令行却可以找到)。请问是什么原因呢,该如何解决?

connect(page2_btn1,&QPushButton::clicked,[=](){
    /*
        创建yaml文件的代码    
    */

        // 当point_yaml文件夹中的文件改变后,触发文件更新
        connect(watcher, &QFileSystemWatcher::directoryChanged, [=](){
            qDebug() << "Directory changed:" << dirPath;
            reconnect(watcher);
        });

});

void reconnect(QFileSystemWatcher* watcher)
{
    qDebug()<<"断开与重连";
    disconnect(watcher, &QFileSystemWatcher::directoryChanged,0,0);

    // 提取点位文件中的坐标信息
    QProcess* process2 = new QProcess;
    QString dirPath = "/home/robot/桌面/gazebo/cafe_robot_ws/src/proc_yaml/point_yaml_file";

    // 获取最新添加的文件信息
    QDir dir(dirPath);
    dir.refresh();
    QStringList files = dir.entryList(QDir::Files, QDir::Time);
    QFileInfo info(files[0]);
    QString filename = info.baseName();
    qDebug()<<filename;

    // 从点位数据中提取所需位置数据
    process2->setWorkingDirectory(dirPath);
    process2->start("bash");
    process2->waitForStarted();
    QString qstr1 = QString::fromUtf8("gedit ");
    QString qstr2 = QString::fromUtf8(".yaml\n");
    QString cmdname = qstr1+filename+qstr2;
    const char* cstr = cmdname.toUtf8().constData();
    process2->write(cstr);

}

  • 写回答

3条回答 默认 最新

  • 笑面虎 2024-05-12 22:54
    关注

    以下内容由CHATGPT及笑面虎共同生成、有用望采纳:


    【您想要解决的问题】:您提问的目的是解决在使用Qt框架中的QProcess类通过终端命令修改文件时,无法找到最新创建的文件的问题。

    【问题出现原因】:根据您提供的代码和描述,可能的问题原因包括:

    1. QProcess可能没有正确地在当前工作目录下执行命令,导致无法找到新创建的文件。
    2. 文件可能还没有完全写入磁盘,或者文件系统还没有更新,导致QProcess无法立即找到该文件。
    3. 信号和槽的连接可能存在问题,导致文件系统监视器(QFileSystemWatcher)没有正确地触发信号。

    【问题解决方案】:为了解决这个问题,您可以尝试以下步骤:

    1. 确保QProcess的当前工作目录设置正确,并且与dirPath一致。
    2. 在调用QProcess之前,确保文件已经完全写入磁盘。您可以在文件写入操作后添加一个小的延迟,或者使用文件系统事件来确定文件是否已经稳定。
    3. 检查QFileSystemWatcher的信号和槽连接是否正确,确保它能够触发重连操作。

    【提供代码】:以下是修改后的代码示例,其中包含了一些可能的改进:

    void reconnect(QFileSystemWatcher* watcher)
    {
        qDebug()<<"断开与重连";
        disconnect(watcher, &QFileSystemWatcher::directoryChanged,0,0);
    
        // 提取点位文件中的坐标信息
        QProcess* process2 = new QProcess;
        QString dirPath = "/home/robot/桌面/gazebo/cafe_robot_ws/src/proc_yaml/point_yaml_file";
    
        // 获取最新添加的文件信息
        QDir dir(dirPath);
        dir.refresh();
        QStringList files = dir.entryList(QDir::Files | QDir::Time);
        QFileInfo info(files[0]);
        QString filename = info.baseName();
        qDebug()<<filename;
    
        // 确保文件已经稳定
        QFile file(dirPath + "/" + filename + ".yaml");
        if (file.exists() && file.size() > 0) {
            // 从点位数据中提取所需位置数据
            process2->setWorkingDirectory(dirPath);
            if (process2->start("bash") && process2->waitForStarted()) {
                QString cmd = QString("gedit %1.yaml").arg(filename);
                process2->write(cmd.toUtf8());
                process2->waitForFinished();
            }
        }
    }
    

    【代码运行方式】:您需要在Qt开发环境中运行这段代码,确保您的Qt项目已经设置了正确的信号和槽连接,并且QFileSystemWatcher正在监视正确的目录。

    【代码预期运行结果】:当新的yaml文件创建后,QFileSystemWatcher将触发信号,随后reconnect函数将被调用。函数将找到最新的文件,并使用gedit命令打开它。

    【推荐相关链接】:

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 5月21日
  • 已采纳回答 5月13日
  • 创建了问题 5月12日

悬赏问题

  • ¥15 数据量少可以用MK趋势分析吗
  • ¥15 使用VH6501干扰RTR位,CANoe上显示的错误帧不足32个就进入bus off快慢恢复,为什么?
  • ¥15 大智慧怎么编写一个选股程序
  • ¥100 python 调用 cgps 命令获取 实时位置信息
  • ¥15 两台交换机分别是trunk接口和access接口为何无法通信,通信过程是如何?
  • ¥15 C语言使用vscode编码错误
  • ¥15 用KSV5转成本时,如何不生成那笔中间凭证
  • ¥20 ensp怎么配置让PC1和PC2通讯上
  • ¥50 有没有适合匹配类似图中的运动规律的图像处理算法
  • ¥15 dnat基础问题,本机发出,别人返回的包,不能命中