QProcess:如何读取pactl的输出

QProcess: how to read output from pactl

本文关键字:pactl 输出 读取 何读取 QProcess      更新时间:2023-10-16

我正在尝试运行这个bash命令

$pactl list sinks short | grep 10_B7_F6_02_1B_4A

在我的c++项目中使用QProcess,并使用readAllStandardOutput()获得输出,如本文所示。当我将echo放在命令的开头,并将10_B7_F6_02_1B_4A放在管道之前时,我将在QByteArray中获得正确的输出。然而,pactl的输出格式似乎与echo的不同。在终端中,它看起来像这样:

$ pactl list sinks short | grep 10_B7_F6_02_1B_4A
2       bluez_sink.10_B7_F6_02_1B_4A    module-bluez5-device.c  s16le 2ch 44100Hz       SUSPENDED

如何读取此输出?

您试图读取的应用程序可能正在将控制台输出发送到stderr,在这种情况下,您有几个选项:

  • 直接从stderr读取:process.readAllStandardError()

  • 将读取通道设置为仅从stderr:process.setReadChannel(QProcess::StandardError)读取

  • 不计后果地从stderr和stdout读取!:process.setProcessChannelMode(QProcess::MergedChannels)

另一种可能性是,您在QProcess中输入了不正确的参数。看起来你正试图在上面传输数据,用QProcess这样做的正确方法是:

#include <QCoreApplication>
#include <QProcess>
#include <QDebug>
int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    QProcess pactl;
    QProcess grep;
    pactl.setStandardOutputProcess(&grep);
    pactl.start("pactl list sinks short");
    grep.start("grep 10_B7_F6_02_1B_4A");
    pactl.waitForFinished();
    grep.waitForFinished();
    qDebug() << grep.readAll();
    return EXIT_SUCCESS;
}