【问题标题】:Qt Calling External Python ScriptQt 调用外部 Python 脚本
【发布时间】:2013-02-28 03:43:08
【问题描述】:

我正在尝试为我用 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 小部件。

点击按钮时,我为按钮分配了一个插槽。 on_pushButton_clicked() 方法在我调用 lsps 之类的实用程序时工作正常,并将这些命令的输出通过管道传输到 LineEdit 小部件,但是当我尝试调用 Python 脚本时,它没有显示任何内容LineEdit 小部件。

任何帮助将不胜感激。

【问题讨论】:

  • 我建议改用 PyQt,那样会更容易。
  • QPRocess 有 waitForStarted、waitForFinished() 的返回值,您可以读取 stderr 输出(类似于您读取 stdout 的方式),还有 QProcess::errorString()。先检查一下,看看出了什么问题。

标签: c++ qt qt4 qprocess


【解决方案1】:

您是否尝试过以下方法:

  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);
}

【讨论】:

  • 将文档中所述的参数作为 QStringList 传递 -> 你在哪里做这个?
【解决方案2】:

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();
}

【讨论】:

    【解决方案3】:

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

    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:您可以设置自己的路径
    command:您要在哪个程序中运行(在本例中为 python)
    params :你要执行的脚本
    &processID是在主窗口关闭时杀死进程

    【讨论】:

      猜你喜欢
      • 2021-12-23
      • 2022-11-10
      • 1970-01-01
      • 2012-07-21
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      • 1970-01-01
      • 2011-05-26
      相关资源
      最近更新 更多