我以为我将使用以下代码从QProcess获取输出:
// Start the process
process.start(tr("php-cgi www/test.php"),QIODevice::ReadWrite);
// Wait for it to start
if(!process.waitForStarted())
return 0;
// Continue reading the data until EOF reached
QByteArray data;
while(process.waitForReadyRead())
data.append(process.readAll());
// Output the data
qDebug(data.data());
qDebug("Done!");
Run Code Online (Sandbox Code Playgroud)
我期待的是看到程序的输出打印到调试控制台,但我看到的只有:
完成!
我知道:
我在这做错了什么?
我有一个像这样使用QProcess的代码.
int main(int argc, char *argv[])
{
int status=0;
QProcess pingProcess;
QString ba;
QString exec = "snmpget";
QStringList params;
params << "-v" << "2c" << "-c" << "public" << "10.18.32.52" << ".1.3.6.1.4.1.30966.1.2.1.1.1.5.10";
status=pingProcess.execute(exec, params);
pingProcess.close();
}
Run Code Online (Sandbox Code Playgroud)
这输出以下内容.
SNMPv2-SMI::enterprises.30966.1.2.1.1.1.5.10 = STRING: "0.1"
Run Code Online (Sandbox Code Playgroud)
我想把这个输出作为字符串.我搜索了这个,我找不到解决方案.提前致谢.
我有以下内容:
QProcess *process = new QProcess(this);
QString path = QDir::toNativeSeparators(QApplication::applicationPath);
#if defined(Q_OS_WIN)
process->start("explorer.exe", QStringList() << path);
#elif defined(Q_OS_MAC)
process->start("open", QStringList() << path);
#endif
Run Code Online (Sandbox Code Playgroud)
如何说Ubuntu可以达到相同的行为?
我正在使用Qt和bash,需要执行以下操作:
bash: cat file | grep string
Run Code Online (Sandbox Code Playgroud)
在Qt:
QString cmd = "cat file | grep string";
QProcess *process = new QProcess;
process->start(cmd);
process->waitForBytesWritten();
process->waitForFinished();
qDebug() << process->readAll();
Run Code Online (Sandbox Code Playgroud)
问题在于管道("|"),并且进程没有任何回复.如果没有("|"),就像
"cat file"
Run Code Online (Sandbox Code Playgroud)
一切都好.我试过smth.喜欢
"cat file \\| grep string",
"cat file \| grep string"
Run Code Online (Sandbox Code Playgroud)
但结果是一样的.如果我复制命令并在bash中运行它一切正常.
QString::toAscii().data()
Run Code Online (Sandbox Code Playgroud)
和其他变换也有不好的结果.
如何使用Qt(C++)通过名称检查程序是否正在运行.
会QProcess::pid
做这个工作吗?我不知道如何使用它.请建议.
几天前我问过如何使用QProcess获取系统中所有正在运行的进程.我找到了一个可以将所有进程输出到文件的命令行:
C:\ WINDOWS\system32\wbem\wmic.exe"/OUTPUT:C:\ProcessList.txt PROCESS获取标题
这将创建C:\ ProcessList.txt文件,其中包含系统中所有正在运行的进程.我想知道如何使用QProcess运行它并将其输出变为变量.
似乎每次我尝试运行它并且没有发生任何事情:
QString program = "C:\\WINDOWS\\system32\\wbem\\wmic.exe";
QStringList arguments;
arguments << "/OUTPUT:C:\\ProcessList.txt" <<"PROCESS"<< "get"<< "Caption";
process->setStandardOutputFile("process.txt");
process->start(program,arguments);
QByteArray result = process->readAll();
Run Code Online (Sandbox Code Playgroud)
我宁愿不创建process.txt并将所有输出都带到变量......
Qt文档给出了这样的解释:
QProcess::start
:
如果没有运行,则在新进程中启动给定程序,在参数中传递命令行参数.
QProcess::startDetached
:
在新进程中使用参数参数启动程序程序,并从中分离.
两者有什么区别?唯一的区别是你只能使用一个程序的一个实例启动QProcess::start
而且许多实例使用QProcess::startDetached
?
我想通过在linux中运行命令来重启计算机QProcess
.我在我的应用程序中对我的root密码进行了硬编码.
当我在终端中运行以下内容时,它可以完美运行:
echo myPass | sudo -S shutdown -r now
Run Code Online (Sandbox Code Playgroud)
当我将命令放在shell脚本中并通过QProcess
它调用它也是成功的:
QProcess process;
process.startDetached("/bin/sh", QStringList()<< "myScript.sh");
Run Code Online (Sandbox Code Playgroud)
但我无法通过直接传递到QProcess
:
process.startDetached("echo myPass | sudo -S shutdown -r now ");
Run Code Online (Sandbox Code Playgroud)
它只会打印 myPass | sudo -S shutdown -r now
如何直接使用这些相对复杂的命令QProcess
.(没有放入shell脚本).
我正在使用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
将删除任何引号(""
)在空格出现的地方留下参数.
我似乎错过了什么,有人可以帮助解决这个问题吗?