我正在使用Qt编写一个跨平台的C++程序,我想在程序中打包/嵌入一些二进制可执行文件.该程序应该能够在运行时执行这些二进制文件.
我想,我需要使用start()和":/ ..."表示法的QResource和QProcess,但我似乎没有让进程运行.有什么我想念的吗?它应该像这样工作吗?二进制文件是否需要设置为可执行文件?
背景:我正在编写一个使用Git的工具,我不想让最终用户手动安装Git.
(在Mac OS X上尝试这个,BTW.)
更新:
我使用以下代码(C++,Mac OS X上的Qt):
QString program = ":/git";
QStringList arguments;
arguments << "help" << "commit";
myProcess->start(program, arguments);
Run Code Online (Sandbox Code Playgroud)
Git可执行文件位于项目路径中,我的resources.qrc引用它,如下所示:
<qresource prefix="/">
<file>git</file>
</qresource>
Run Code Online (Sandbox Code Playgroud)
我没有收到错误,但程序没有执行.当我设置program为不存在的文件时,行为是相同的.":/git"用绝对路径替换git非常有效.
我试图调用一个可执行文件qprocess并传递一些可能(并且很可能会)包含空格(不是全部)的参数.可执行文件是python已打包的脚本Py2exe.该python脚本用于optparse解析参数.
如果我py2exe.exe在cmd.exe通话中打电话是这样的:
pythonExecutable.exe -aarg_a -barg_b -c"path with spaces" -darg_d
Run Code Online (Sandbox Code Playgroud)
像这样的电话会成功.
我希望通过一个Qt应用程序使用Qprocess,但我找不到一种方法来做这个,因为Qprocess将删除任何引号("")在空格出现的地方留下参数.
我似乎错过了什么,有人可以帮助解决这个问题吗?
我无法在Android平台上通过QProcess运行任何命令.我正在使用Qt库.任何人都可以解释如何从Android平台上的应用程序运行shell命令?
QProcess process();
process.execute("ls");
bool finished = process.waitForFinished(-1);
qDebug() << "End : " << finished << " Output : " << process.errorString();
Run Code Online (Sandbox Code Playgroud)
如果我没有指定超时,则该过程不会完成.当我指定超时时,process.waitForFinished()返回false,比如10000毫秒.
如果我使用startDetached()启动QProcess,是否会获得完成的信号?我正在尝试启动一个进程,但是我需要能够在进程终止时获得一个事件.
我希望将输出qconf重定向到test_settings.txt我的tmp文件夹中.我想到了两种可能性:
QProcess procWriteProject;
procWriteProject.start("qconf", QStringList() << " -sprj "
<< projectList[0] << " >> " << "\"/tmp/testing.txt\"");
procWriteProject.start("qconf -sprj " + projectList[0] + " >> "
+ "/tmp/test_settings");
Run Code Online (Sandbox Code Playgroud)
其中任何一个都有效吗?有没有更好的办法?
我正在尝试为我用Python编写的命令行工具编写一个GUI包装器.
有人建议我应该使用Qt.
下面是我的项目的.cpp文件:
#include "v_1.h"
#include "ui_v_1.h"
#include<QtCore/QFile>
#include<QtCore/QTextStream>
#include <QProcess>
#include <QPushButton>
v_1::v_1(QWidget *parent) :
QMainWindow(parent),ui(new Ui::v_1)
{
ui->setupUi(this);
}
v_1::~v_1()
{
delete ui;
}
void v_1::on_pushButton_clicked()
{
QProcess p;
p.start("python script -arg1 arg1");
p.waitForFinished(-1);
QString p_stdout = p.readAllStandardOutput();
ui->lineEdit->setText(p_stdout);
}
Run Code Online (Sandbox Code Playgroud)
下面是我的项目的头文件:
#ifndef V_1_H
#define V_1_H
#include <QMainWindow>
namespace Ui {
class v_1;
}
class v_1 : public QMainWindow
{
Q_OBJECT
public:
explicit v_1(QWidget *parent = 0);
~v_1();
private slots:
void on_pushButton_clicked();
private:
Ui::v_1 *ui;
};
#endif // V_1_H …Run Code Online (Sandbox Code Playgroud) 我正在构建一个GUI应用程序,我在其中进行系统调用并调用gnuplot来运行脚本.现在我想构建一个错误消息,说明什么时候出错(例如没有安装gnuplot或者路径错误).
所以我一直在考虑推出一个QMessageBox,但我不知道如何检查系统调用是否成功.
if(//System call didn't work)
{
QMessageBox msgBox;
msgBox.setWindowTitle("Error");
msgBox.setIcon(QMessageBox::Critical);
msgBox.setText("GNUPLOT was not installed");
msgBox.exec();
}
Run Code Online (Sandbox Code Playgroud)
我的系统调用如下所示:
system(gnuplot script.txt);
Run Code Online (Sandbox Code Playgroud)
有什么建议?
我正在使用CMD,QProcess但我遇到了问题.
我的代码:
QProcess process;
process.start("cmd.exe");
process.write ("del f:\\b.txt\n\r");
process.waitForFinished();
process.close();
Run Code Online (Sandbox Code Playgroud)
当我没有通过争论时,waitForFinished()等待30秒.我想QProcess在执行CMD命令后终止!不多也不少!
我想知道如何捕获PySide中QProcess运行的命令的输出,以便可以显示它.
我对 QProcess 有一个非常奇怪的问题,它的行为很奇怪。
我最后想要得到的是这样的东西(这是Windows 7中的cmd.exe)
C:\path_to_somewhere>cmd /c "C:\Program Files\path_to_dir\executable"
Run Code Online (Sandbox Code Playgroud)
(cmd是为了兼容QProcess的显示)
所以为了做类似的事情,我创建了这个:
QProcess proc;
QString command;
QStringList attributes;
command = "c:\\windows\\system32\\cmd.exe";
QStringList << QString("/c \"C:\\Program Files\\path_to-dir\\executable"");
proc.start(command, attributes);
Run Code Online (Sandbox Code Playgroud)
我得到的错误输出是:
Name '\"c:\Program Files\Quantum GIS Wroclaw\bin\gdalwarp.exe\"' is not recognized as
internat or external command, executable or batch file.
Run Code Online (Sandbox Code Playgroud)
(它是我从波兰语翻译过来的,所以英语可能有点不同)。
似乎 \ 字符在字符串中没有转义,而将 \" 保留为命令中的字符。我做错了什么?
我已经尝试过
proces.start(QString)
Run Code Online (Sandbox Code Playgroud)
函数与三重“\”\”,它也不起作用。我想这个问题的解决方案必须非常简单,我什至都没有想到它。