我使用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"
,但它似乎不起作用。
资源脚本运行完美,但控制台输出消失。
答案 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
来获取唯一的临时文件名。