Qt5中如何执行多个QProcess

How to execute multiple QProcess in Qt5

我一直在努力研究如何使用 QProcess 执行多个进程。我能够执行单个进程,e.i。打开终端 window QProcess *openTerminal = new QProcess(this);,之后我想执行其他进程,但我找不到执行此操作的方法。我要实现的操作顺序是:

1) 打开一个 gnome 终端(这已解决并且可以在 QPushButton click 之后打开)

2) 导航到 cd ~

3) 转到首选目录cd catkin_docking_ws/

4) 启动正确的应用程序 roslaunch lidar_deck lidar_deck_rosbag.launch &

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    startLidar();
}

void MainWindow::startLidar()
{
    // Execution of the QProcess to make sure Lidar App Launcher opens:
    this->executeROSLidarApp = new QProcess(this);
    this->executeROSLidarApp->setProcessChannelMode(QProcess::MergedChannels);
    connect(this->executeROSLidarApp, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
            [script = this->executeROSLidarApp](int exitCode, QProcess::ExitStatus exitStatus){
            qDebug() << "[EXEC] FINISHED: " << exitCode << exitStatus;
            if(script->bytesAvailable() > 0) qDebug() << "[EXEC] buffered DATA:" << script->readAll();
    });
    connect(this->executeROSLidarApp, &QProcess::errorOccurred, [script = this->executeROSLidarApp](QProcess::ProcessError error) {
            qDebug() << "[EXEC] error on execution: " << error << script->errorString();
    });
}


void MainWindow::on_launchLidarROSBtn_clicked()
{
    qDebug() << "Launching LIDAR APP";
    QProcess *openTerminal = new QProcess(this);
    QProcess *cd = new QProcess(this);
    QProcess *cd_catkin = new QProcess(this);
    QProcess *roslaunch = new QProcess(this);

    openTerminal->start("gnome-terminal");
    openTerminal->waitForFinished();

    cd->start("cd ~", QStringList() << "cd ~");
    cd->waitForFinished();

    cd_catkin->start("cd catkin_docking_ws/", QStringList() << "cd catkin_docking_ws/");
    cd_catkin->waitForFinished();

    roslaunch->start("roslaunch lidar_deck lidar_deck_rosbag.launch &", QStringList() << "roslaunch lidar_deck lidar_deck_rosbag.launch &");
    roslaunch->waitForFinished();
}

为了解决this one, I used also this, this post等问题,我查阅了很多资料。但他们似乎都提供了令人困惑的信息,我正在寻找一个干净简单的过程。

我还深入研究了解决方案,this post advises to go for detachedProcess but I am not sure it is a good idea because this post 似乎遵循了一个非常有组织的结构。

我想要达到的最终结果是 this,但是,当然,通过上面的所有四个 QProcess

这可能吗?还是我要同时处理太多进程? 非常感谢您为解决这个问题指明了正确的方向。

每个 QProcess 代表一个新的会话,因此您不能使用多个 QProcess 对象来执行一个序列。最好的方法是创建一个 shell 脚本来执行您想要的操作,然后使用一个 QProcess 实例来执行该脚本。