运行资源文件时重定向QProcess的输出

时间:2016-12-21 10:12:16

标签: c++ qt qprocess qresource

对Qt来说相当新鲜。

我使用QProcess运行外部shell脚本并将输出重定向到GUI上的textBrowser。代码:

在mainwindow.h中:

private:
   QProcess *myProcess;

和mainwindow.cpp:

void MainWindow::onButtonPressed(){
   myProcess = new QProcess(this);
   myProcess->connect(myProcess, SIGNAL(readyRead()), this, SLOT(textAppend()));
   myProcess->start("./someScript.sh", arguments);
}

void MainWindow::textAppend(){
   ui->textBrowser->append(myProcess->readAll());
}

这非常适合运行外部脚本。我的问题是如何将相同的进程与作为资源文件包含的脚本一起应用。 我尝试过简单地用资源版本"./someScript.sh"替换":/someScript.sh",但它似乎不起作用。 资源脚本运行完美,但控制台输出消失。

2 个答案:

答案 0 :(得分:4)

出于这个原因,有一种叫做" QTemporaryFile "类。

因为您需要在系统中调用已存在的文件 - 好吧!

让我们举个例子:

使用 QProcess 我们需要从资源运行python文件

//[1] Get Python File From Resource
QFile RsFile(":/send.py");
//[2] Create a Temporary File
QTemporaryFile *NewTempFile = QTemporaryFile::createNativeFile(RsFile);
//[3] Get The Path of Temporary File
QStringList arg;
arg << NewTempFile->fileName();
//[4] Call Process
QProcess *myProcess = new QProcess(this);
myProcess->start("python", arg);
//[5] When You Finish, remove the temporary file
NewTempFile->remove();
  

注意:在Windows上,存储在%TEMP%目录中的临时文件

您可以访问Qt Documentation - QTemporaryFile Class

获取更多信息

祝你好运♥

答案 1 :(得分:1)

我无法正常工作,因为当您运行myProcess->start(":/someScript.sh", arguments);时,系统会要求您的系统运行:/someScript.sh,而系统不存在此问题。

快速解决方案是将脚本复制到临时文件夹并从那里运行。

QFile::copy(":/someScript.sh", pathToTmpFile);
myProcess->start(pathToTmpFile, arguments);

我还建议您使用QTemporaryFile来获取唯一的临时文件名。