Qt调用外部Python脚本

Qt Calling External Python Script

本文关键字:脚本 Python 外部 调用 Qt      更新时间:2023-10-16

我正在尝试为我用Python编写的命令行工具之一编写GUI包装器。
有人建议我应该使用Qt。

下面是我的项目的。cpp文件:

#include "v_1.h"
#include "ui_v_1.h"
#include<QtCore/QFile>
#include<QtCore/QTextStream>
#include <QProcess>
#include <QPushButton>
v_1::v_1(QWidget *parent) :
    QMainWindow(parent),ui(new Ui::v_1)
    {
        ui->setupUi(this);
    }
    v_1::~v_1()
    {
        delete ui;
    }
void v_1::on_pushButton_clicked()
{
    QProcess p;
    p.start("python script -arg1 arg1");
    p.waitForFinished(-1);
    QString p_stdout = p.readAllStandardOutput();
    ui->lineEdit->setText(p_stdout);
}

下面是我的项目头文件:

#ifndef V_1_H
#define V_1_H
#include <QMainWindow>
namespace Ui {
class v_1;
}
class v_1 : public QMainWindow
{
    Q_OBJECT   
public:
    explicit v_1(QWidget *parent = 0);
    ~v_1();
private slots:
    void on_pushButton_clicked();
private:
    Ui::v_1 *ui;
};
#endif // V_1_H

UI文件只是一个Push Button和一个LineEdit小部件。

当按钮被点击时,我给它分配了一个插槽。当我调用一些实用程序如lsps时,on_pushButton_clicked()方法工作得很好,并且它将这些命令的输出管道到LineEdit小部件,但是当我尝试调用Python脚本时,它没有在LineEdit小部件上显示任何内容。

您试过以下方法吗:

  1. 确保python在你的系统路径
  2. 按照文档中的QStringList传递参数
  3. 在测试时将readAllStandardOutput更改为readAll

void v_1::on_pushButton_clicked() 
{
    QProcess p;
    QStringList params;
    params << "script.py -arg1 arg1";
    p.start("python", params);
    p.waitForFinished(-1);
    QString p_stdout = p.readAll();
    ui->lineEdit->setText(p_stdout);
}

Hunor的回答对我也起了作用。但是我没有使用进程ID。我:

void MainWindow::on_pushButton_clicked()
{
   QString path = '/Somepath/mypath';
   QString  command("python");
   QStringList params = QStringList() << "script.py";
   QProcess *process = new QProcess();
   process->startDetached(command, params, path);
   process->waitForFinished();
   process->close();
}

对于我来说,下面的代码是有效的:

void MainWindow::on_pushButton_clicked()
{
    QString path = QCoreApplication::applicationDirPath();
    QString  command("python");
    QStringList params = QStringList() << "script.py";
    QProcess *process = new QProcess();
    process->startDetached(command, params, path, &processID);
    process->waitForFinished();
    process->close();
}

path:你可以设置自己的路径
命令:你想在哪个程序中运行(在这个例子中是python)
params:要执行的脚本
&processID表示在主窗口关闭时终止进程