如何在Qt5中执行多个QProcess?

问题描述 投票:0回答:1

我一直在苦恼如何使用以下方法执行多个进程 QProcess. 我能够执行一个单一的进程,即打开一个终端窗口。QProcess *openTerminal = new QProcess(this);之后,我想执行更多的进程,但我找不到办法。我想实现的操作顺序是。

1) 打开一个gnome-terminal(这个问题已经解决了,并且能够在打开gnome-terminal之后打开 QPushButton 点击)

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();
}

为了解决这个问题,我查阅了很多资料,如 这个我还用了 这个, 此职位. 但所有的人似乎都给出了混乱的信息,正在寻找一个干净和简单的过程。

此外,我还深入研究了解决方案和 此职位 建议去 detachedProcess 但我不确定这是不是一个好主意,因为 此职位 似乎遵循一个相当有组织的结构。

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

是可能的,还是我试图总共处理太多的进程?非常感谢你指出解决这个问题的正确方向。

c++ qt qt5 ros qprocess
1个回答
1
投票

每个QProcess代表一个新的会话,所以不能使用多个QProcess对象来执行一个序列。最好的方法是创建一个shell脚本,做你想做的事情,然后使用一个QProcess实例来执行该脚本。

© www.soinside.com 2019 - 2024. All rights reserved.