如何使用QProcess在Linux下执行一个shell命令?

3

我正在尝试从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

如何解决这个问题?


1
@scopchanov 感谢您编辑问题。 - Som
2个回答

7

您需要使用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来执行像这样的管道系统命令,它是设计用于运行带参数的单个程序。请尝试:

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);

谢谢,虽然这个确实给我一个结果,但是它打印了整个命令输出而没有过滤第一个。 - Som
仍然存在相同的问题。在命令行中,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 ... - Som
你试图过滤的实际字符串(格式)是什么? - Marker
抱歉,分辨率类似于格式,例如1366x768。 - Som
是的,我现在明白了,似乎它没有通过grep传递输出。你可以使用进程调用xrandr,读取输出并使用正则表达式提取所需信息。 - Marker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接