QProcess提示Unknown error

发布时间 2023-06-07 13:03:08作者: 乐吴

编译环境qt(5.14.2)

问题:在使用QProcess进行进程交互的出现UnKnown error

错误代码:

    // 创建一个 tesseract 进程对象
    QProcess* process = new QProcess(this);
    process->setProcessChannelMode(QProcess::SeparateChannels);
    // 指定 tesseract 可执行文件
    process->setProgram("F:\\qt_test_lib\\test_tesseract_mingw32\\tess_ocr\\tesseract.exe");
    qDebug() << "指定tesseract:" << process->errorString();
    // 指定命令行参数
    process->setArguments(args);
    qDebug() << "指定命令行参数:" << process->errorString();
    process->setWorkingDirectory("F:\\qt_test_lib\\test_tesseract_mingw32\\tess_ocr");
     qDebug() << "setWorkingDirectory:" << process->errorString();
    process->setProcessChannelMode(QProcess::MergedChannels);
      qDebug() << "setProcessChannelMode:" << process->errorString();
    // 启动进程
    process->start();
    qDebug() << "打开前Error:" << process->errorString();
    // 等待进程结束,并获取输出结果
    if (process->waitForFinished()) {
        // 打开输出文件,读取识别结果
        QFile outputFile(outputFilePath);
        if (outputFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
            QString output = QString::fromUtf8(outputFile.readAll());
            // 根据需求处理识别结果
            qDebug() << "识别结果:" << output;
            outputFile.close();
        } else {
            qDebug() << "打开输出文件失败!";
        }
    } else {
        qDebug() << "进程执行失败!";
    }

输出:

指定tesseract: "Unknown error"
指定命令行参数: "Unknown error"
setWorkingDirectory: "Unknown error"
setProcessChannelMode: "Unknown error"
打开前Error: "Unknown error"

此时将路径等复制到命令行中是可以正常执行的。

使用下面写法QProcess不在报错:

    // 获取识别图片的路径
    QString imageFilePath = "C:\\Users\\admin\\Desktop\\test_jpg\\test.png";
    // 获取输出文件的路径
    QString outputFilePath = "F:\\qt_test_lib\\test_tesseract_mingw32\\output_text.txt.txt";
    // 设置命令行参数
    QStringList args;
    args << imageFilePath << outputFilePath << "-l" << "chi_sim";

    QString program("F:\\qt_test_lib\\test_tesseract_mingw32\\tess_ocr\\tesseract.exe");
     QProcess *tesseract=new QProcess;
     tesseract->start(program,args);
     if(tesseract->waitForFinished()){
         qDebug() << "成功";
     }

执行完毕后可在指定文本内得到数据。