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

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日