在我的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;
正如我在评论中所说,其中一个主要问题是当你运行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");
我想你必须阅读Qt中的信号和插槽。 QProcess有一个readyReadStandardOutput信号。所以你必须连接到这个信号,在插槽中你应该使用QProcess函数readAllStandardOutput。换句话说,当你的shell程序输出一些你在你的插槽中捕获它并转储它或任何你想要的东西。
检查这个问题的答案。它可能对你有帮助。