如何在 Linux unsing QProcess 下执行 shell 命令?
Posted
技术标签:
【中文标题】如何在 Linux unsing QProcess 下执行 shell 命令?【英文标题】:How to execute a shell command under Linux unsing QProcess? 【发布时间】:2018-09-10 20:13:13 【问题描述】:我正在尝试从 Qt 应用程序中读取屏幕分辨率,但不使用 GUI 模块。
所以我尝试使用:
xrandr |grep \* |awk 'print $1'
通过QProcess命令,但是它显示警告并且没有给出任何输出:
unknown escape sequence:'\\*'
用\\\*
重写它没有帮助,因为它会导致以下错误:
/usr/bin/xrandr: unrecognized option '|grep'\nTry '/usr/bin/xrandr --help' for more information.\n
我该如何解决?
【问题讨论】:
@scopchanov 感谢您编辑问题。 【参考方案1】:您必须使用 bash 并在引号中传递参数:
#include <QCoreApplication>
#include <QProcess>
#include <QDebug>
int main(int argc, char *argv[])
QCoreApplication a(argc, argv);
QProcess process;
QObject::connect(&process, &QProcess::readyReadStandardOutput, [&process]()
qDebug()<<process.readAllStandardOutput();
);
QObject::connect(&process, &QProcess::readyReadStandardError, [&process]()
qDebug()<<process.readAllStandardError();
);
process.start("/bin/bash -c \"xrandr |grep \\* |awk 'print $1' \"");
return a.exec();
输出:
"1366x768\n"
或者:
QProcess process;
process.start("/bin/bash", "-c" , "xrandr |grep \\* |awk 'print $1'");
或者:
QProcess process;
QString command = R"(xrandr |grep \* |awk 'print $1')";
process.start("/bin/sh", "-c" , command);
【讨论】:
【参考方案2】:您不能使用 QProcess 来执行这样的管道系统命令,它旨在运行带有参数 Try 的单个程序:
QProcess process;
process.start("bash -c xrandr |grep * |awk 'print $1'");
或
QProcess process;
QStringList args = QString("-c,xrandr,|,grep *,|,awk 'print $1'").split(",");
process.start("bash", args);
【讨论】:
谢谢,虽然这个确实给我一个结果,但这是打印整个命令输出而不过滤第一个。 还是同样的问题。而在命令行 xrandr 给出 1366x768 输出。它通过 QProcess 给出整个值,屏幕 0:最小 320 x 200,当前 1366 x 768,最大 8192 x 8192\neDP-1 连接初级 1366x768+0+0(正常左倒右 x 轴 y 轴)344mm x 194mm\ n 1366x768 59.97*+\n 1280x720 60.00 59.99 59.86 59.74 \n 1024x768 60.04 60.00 \n 960x720 60.00 \n 928x696 60.05 \n 896x672 60.01 ...>s 您要过滤掉的实际字符串(格式)是什么? 抱歉,分辨率类似于格式,比如这个 1366x768。 是的,我现在明白了,它似乎没有通过 grep 传递输出。您可以使用该过程调用 xrandr,读取输出并使用正则表达式提取您想要的信息。以上是关于如何在 Linux unsing QProcess 下执行 shell 命令?的主要内容,如果未能解决你的问题,请参考以下文章
linux下QT中如何使用QProcess运行linux命令。