一旦我在 gui 上推送QPushButton
,我就会尝试使用QProcess
执行命令行。问题所在我有的是.sh
可执行文件永远不会执行。
我尝试执行的脚本非常简单,报告如下:
#!/bin/bash
echo "try one two three"
rostopic echo -b LaserScan_PointCloud2_test.bag -p /scan > laserScan_test_1.csv
在激活按钮的功能下方:
filterpcdinterface.h
private slots:
void on_executeScriptBtn_clicked();
private:
QProcess *executeBash;
Filterpcd接口.cpp
FilterPCDInterface::FilterPCDInterface(QNode *node, QWidget *parent) :
qnode(node),
QMainWindow(parent),
ui(new Ui::FilterPCDInterface)
{
ui->setupUi(this);
executeBash = new QProcess;
executeBash->setProcessChannelMode(QProcess::MergedChannels);
connect(executeBash, &QProcess::readyReadStandardOutput, [this] {
qDebug() << "This is the output from the process: ";
on_executeScriptBtn_clicked();
});
}
void FilterPCDInterface::on_executeScriptBtn_clicked()
{
executeBash->waitForFinished();
QString script("/home/emanuele/Desktop/bags/test.sh");
executeBash->start("sh",QStringList() << script);
if(!executeBash->waitForStarted()) //default wait time 30 sec
qWarning() << " cannot start process ";
int waitTime = 60000 ; //60 sec
if (!executeBash->waitForFinished(waitTime))
qWarning() << "timeout .. ";
executeBash->setProcessChannelMode(QProcess::MergedChannels);
QString str(executeBash->readAllStandardOutput());
}
到目前为止,我一直在咨询几个帖子,但没有一个帮助我解决问题。 我遇到了这个,也遇到了这个,我实际上从中得到了这个想法。
作为口译员,我尝试了"/bin/sh"
和"sh"
,但没有一个给出预期的结果。 准确地说,我尝试了这两个:
executeBash->start("sh",QStringList() << script);
和
executeBash->start("/bin/sh",QStringList() << script);
但什么也没发生。
我终于遇到了这个非常有用的帖子,它实际上帮助我设置了整个按钮功能,但是当需要执行脚本时,这次也没有发生任何事情。
我不确定这种奇怪的行为是否是由构造函数中的connect
函数引起的。问题还在于,qDebug()
声明也从未达成。
官方文档提到了使用startDetached
语句的可能性,但我不确定它是否与我想要实现的目标完全相关。 官方文档始终在此处报告以下声明
Unix:启动的进程将在自己的会话中运行,并像 守护 进程。
因此,我认为有一个流程会话在工作,可以执行,但事实并非如此。
结论:我一直在研究问题可能是什么,但我总是错过一些我没有看到的东西。请指出正确的方向来帮助解决此问题,因为任何人都碰巧遇到同样的问题。
试试这个:
页眉:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QProcess>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_executeScriptBtn_clicked();
private:
Ui::MainWindow *ui;
QProcess * executeBash;
};
#endif // MAINWINDOW_H
源:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->executeBash = new QProcess(this);
this->executeBash->setProcessChannelMode(QProcess::MergedChannels);
connect(this->executeBash, &QProcess::readyReadStandardOutput, [script = this->executeBash](){
qDebug() << "[EXEC] DATA: " << script->readAll();
});
connect(this->executeBash, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
[script = this->executeBash](int exitCode, QProcess::ExitStatus exitStatus){
qDebug() << "[EXEC] FINISHED: " << exitCode << exitStatus;
if(script->bytesAvailable() > 0)qDebug() << "[EXEC] buffered DATA:" << script->readAll();
});
connect(this->executeBash, &QProcess::errorOccurred, [script = this->executeBash](QProcess::ProcessError error){
qDebug() << "[EXEC] error on execution: " << error << script->errorString();
});
}
void MainWindow::on_executeScriptBtn_clicked()
{
qDebug() << "Button clicked!"; // if you don't see this message check your SIGNAL/SLOT connections!
//this->executeBash->execute(...) // <- will wait till script is finished and block main thread
this->executeBash->start(QStringLiteral("/bin/sh"), QStringList() << QStringLiteral("/home/emanuele/Desktop/bags/test.sh")); //will start new process without blocking
}
MainWindow::~MainWindow(){delete ui;}