【发布时间】:2020-06-04 20:36:25
【问题描述】:
我正在使用QProcess 在我的Ubuntu 18.04 操作系统上启动应用程序。
在浏览了文档之后,我发现QProcess 是最好的方法。
问题我正在尝试在最小的 GUI 上通过 QPushButton 启动应用程序,但它不起作用,并且我从编译器得到的错误是:
启动 LIDAR APP [EXEC] 已完成:0 QProcess::NormalExit [EXEC] 缓冲数据:“roslaunch:无进程 找到\n/home/emanuele/catkin_docking_ws/src/lidarboatsproject/start_lidar_deck_rosbag.sh: 5: /home/emanuele/catkin_docking_ws/src/lidarboatsproject/start_lidar_deck_rosbag.sh: roslaunch: 未找到\n"
这是我正在尝试启动的启动文件start_lidar_deck_rosbag.sh:
#!/bin/bash
killall roslaunch && sleep 10
cd /home/emanuele/catkin_docking_ws/
roslaunch lidar_deck lidar_deck_rosbag.launch &
在最小的 GUI 下:
mainwindow.h
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void startLidar();
private slots:
void on_launchLidarROSBtn_clicked();
private:
Ui::MainWindow *ui;
QProcess *executeROSLidarApp;
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
startLidar();
}
MainWindow::~MainWindow()
{
delete ui;
}
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";
this->executeROSLidarApp->start(QStringLiteral("/bin/sh"), QStringList() << QStringLiteral("/home/emanuele/catkin_docking_ws/src/lidarboatsproject/start_lidar_deck_rosbag.sh"));
}
为了解决这个问题,我研究了很多可能的解决方案。 我咨询了this post 和this one。它们对于设置这个想法的主要部分很有用,但由于某些原因,我无法捕捉到这个过程似乎没有开始,我不明白为什么编译器会给出我上面提到的错误,如果我确定的话该文件 100% 存在。
请阐明并指出解决此问题的正确方向。
【问题讨论】:
-
进程 (
bin/sh) 正在启动和执行脚本。似乎脚本本身导致了问题。所以,你的 c++ 代码很好。