Home Articles

使用QProcess读取标准输出

Asked
Viewed 1400 times
0

在我的QT小部件应用程序中,我试图运行一个打开C程序的shellcript,并为程序提供输入 . 该程序启动一个命令提示符,要求用户输入启动 . 程序启动后,程序的输出将通过标准输出重定向到文本文件 . 我试图使用QProcess打开并运行此shellcript,然后读取用于将C程序的结果打印到文本文件的标准输出 . shell脚本只运行此进程,不会终止它 . 这是因为我需要在程序运行时不断将此输出读入GUI . 等到程序完成后才能阅读这些信息是不够的 . 我是QT和C编程的新手 . 我希望有人能帮助我实现这个目标 .

QProcess process;
process.start("/home/pi/Desktop/ShellScripts/RunTutorial3.sh");
QString output =process.readAllStandardOutput();
qDebug() << output;
QString err = process.readAllStandardError();
qDebug() << err;

我已尝试使用其他读取功能,如readline,并尝试将过程作为一个分离过程启动 . 我的任何实验都没有成功 . 是否有可能做我在QT尝试的事情 . 我只需要程序连续运行并让QT经常读取此输出 .

Shell脚本:

#!/bin/bash
cd
cd Desktop
cd tutorial3App
cd bin
echo "start" | ./tutorial3

C代码:我需要在标准输出中捕获meanTOE值以在我的GUI中使用 .

/ Calculate average time to end of discharge
            double meanToE = std::accumulate(ToESamples.begin(), ToESamples.end(), 0.0)/ToESamples.size();
            file << ": EOL in " << meanToE << " s" << std::endl;

2 Answers

  • 0

    正如我在评论中所说,其中一个主要问题是当你运行tutorial3时,该进程是分开的,所以你无法获得输出 . 因此,我建议直接执行它,QProcess可能是一个局部变量,在打印空文本后消除,可能的解决方案是创建一个指针 . 另一个改进是使用readyReadStandardOutput和readyReadStandardError信号,因为展示不是自动的 .

    QProcess *process = new QProcess(this);
    
    connect(process, &QProcess::readyReadStandardOutput, [process, this](){
        QString output =process->readAllStandardOutput();
        qDebug() << "output: "<< output;
    });
    
    connect(process, &QProcess::readyReadStandardError, [process](){
        QString err = process->readAllStandardError();
        qDebug() << "error: "<<err;
    });
    
    process->setWorkingDirectory("/home/pi/Desktop/tutorial3App/bin/")
    process->start("tutorial3", QStringList() << "start");
    
  • 0

    我想你必须阅读Qt中的信号和插槽 . QProcess有一个readyReadStandardOutput信号 . 所以你必须连接到这个信号,在插槽中你应该使用QProcess函数readAllStandardOutput . 换句话说,当你的shell程序输出一些你在你的插槽中捕获它并转储它或任何你想要的东西 .

    检查这个问题的答案 . 它可能对你有帮助 .

    reading and writing to QProcess in Qt Console Application

Related