使用QProcess读取标准输出

问题描述 投票:0回答:2

在我的QT小部件应用程序中,我试图运行一个打开C ++程序的shellcript,并为程序提供输入。该程序启动一个命令提示符,要求用户输入启动。程序启动后,程序的输出将通过标准输出重定向到文本文件。我试图使用QProcess打开并运行此shell脚本,然后读取用于将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;
c++ linux qt shell qprocess
2个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.