c++ - 在 QT 中启动多个外部控制台应用程序实例并捕获输出?

标签 c++ qt qt5

我正在学习 Qt 并设法使用教程中的以下代码来启动外部应用程序并处理从中收到的输出:

void Dialog::on_startButton_clicked()
{

    QString program = "C:/Program Files/ffmpeg/bin/ffmpeg.exe";
    mTranscodingProcess = new QProcess(this);
    connect(mTranscodingProcess, SIGNAL(started()), this, SLOT(processStarted()));
connect(mTranscodingProcess,SIGNAL(readyReadStandardOutput()),this,SLOT(readyReadStandardOutput()));
    connect(mTranscodingProcess, SIGNAL(finished(int)), this, SLOT(encodingFinished()));


    QStringList arguments;
    QString input = "myfile_path_1";
    QString input2 = "myfile_path_2";

    arguments << "-y" << "-i" << input << "-i" << input2 << "-c" << "copy" << "output.avi" ;

    qDebug() << arguments;

    mTranscodingProcess->setProcessChannelMode(QProcess::MergedChannels);
    mTranscodingProcess->start(program, arguments);
}

这按预期工作,我可以捕获和处理来 self 应用程序中的 readyReadStandardOutput()encodingFinished() 插槽的输出。

现在我的问题是:如何启动上述的额外作业并从每个实例接收单独的更新。

最佳答案

启动附加作业和接收更新非常容易;您只需多次执行上面发布的代码。

唯一有点棘手的部分(我认为你的问题的核心)是如何判断,当你的 readReadyStandardOutput() (或其他)槽被调用时,调用它的是几个 QProcess 对象中的哪个对象。

有几种方法可以解决这个问题。排名不分先后:

  • 您可以为每个 QProcess 对象声明不同的槽(例如 readReadyStandardOutput1()、readReadyStandardOutput2() 等)并将每个 QProcess 连接到不同的槽。 (除非你只有很少数量的 QProcesses,否则不推荐)

  • 您可以创建一个派生自 QObject 的单独 ProcessLauncher 类,并为您要启动的每个任务创建一个 ProcessLauncher 对象。让每个 ProcessLauncher 对象创建自己的 QProcess 对象并将 QProcess 的信号连接到 ProcessLauncher 的槽。由于每个 ProcessLauncher 与其 QProcess 之间存在 1:1 的关系,因此 ProcessLauncher 会知道它的槽被其自己的 QProcess 调用,而不是其他。

  • 你可以使用 QSignalMapper对象来帮助您区分彼此的信号。

  • 或者,如果您不介意颠覆信号与槽范式的面向对象性质,您的槽方法可以调用 QObject::sender()找出发出信号的 QProcess,并根据 sender() 的返回值改变它们的行为。

关于c++ - 在 QT 中启动多个外部控制台应用程序实例并捕获输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19739332/

相关文章:

c++ - ./配置错误: The test for linking against libxcb and support libraries failed

c++ - 使用现有 C 程序编写 Qt 程序时未找到符号

c++ - 为什么我在 QtCreator 中收到 undefined reference 错误?

Qt 5 为 XCB 使用 EGL 后端

c++ - 数组是如何分配的?

c++ - 转换为使用 typedef 创建的结构类型

c++ - SFML 不会画任何东西?

c++ - 我怎样才能得到 QObject 的 child ?

c++ - QML:如何将动态创建的组件与自定义的内部对象一起使用?

c++ - 如何在 C/C++ 中使用带有 OpenSSL 的静态链接