如何在 Qt5 中执行多个 QProcess



我一直在为如何使用QProcess执行多个进程而苦恼。我能够执行单个进程,即打开终端窗口QProcess *openTerminal = new QProcess(this);,之后我想执行其他进程,但我找不到一种方法来做到这一点。我试图实现的操作顺序是:

1(打开一个侏儒终端(这已经解决了,点击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

这可能还是我试图处理太多流程? 非常感谢您指出解决此问题的正确方向。

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

相关内容

  • 没有找到相关文章

最新更新