如何在 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 命令?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 QProcess 运行 vim 终端

linux下QT中如何使用QProcess运行linux命令。

Qt使用QProcess进程间双向通信(linux和win系统)

当进程结束时,如何保持QProcess执行的命令?

运行文件时如何使用qprocess实时读取输出

如何在 Windows 上通过 QProcess 启动提升的子进程?