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 实例来执行该脚本。
我一直在努力研究如何使用 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 实例来执行该脚本。