QProcess无法通过QPushButton执行终端线路命令



一旦我在 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;}

相关内容

  • 没有找到相关文章

最新更新