QProcess:如何从pactl读取输出

时间:2014-04-22 15:44:07

标签: c++ bash qt qprocess

我正在尝试运行此bash命令

$pactl list sinks short | grep 10_B7_F6_02_1B_4A

在我的c ++项目中使用QProcess并使用readAllStandardOutput()获取输出,如this post所示。当我在命令的开头放置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

如何阅读此输出?

1 个答案:

答案 0 :(得分:3)

您尝试读取的应用程序可能正在向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;
}