Qt вызывает внешний скрипт Python

Я пытаюсь написать оболочку с графическим интерфейсом для одного из моих инструментов командной строки, написанных на Python.
Мне было предложено использовать 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

Файл пользовательского интерфейса — это просто кнопка и виджет LineEdit.

Я выделил кнопке слот, когда она нажата. Метод on_pushButton_clicked() отлично работает, когда я вызываю некоторые утилиты, такие как ls или ps, и он направляет вывод этих команд в виджет LineEdit, но когда я пытаюсь вызвать скрипт Python, он ничего не показывает мне в виджете LineEdit.

Любая помощь будет принята с благодарностью.


person devoidfeast    schedule 28.02.2013    source источник
comment
Вместо этого я бы предложил использовать PyQt, так будет проще.   -  person paulm    schedule 28.02.2013
comment
QPRocess возвращает значения для waitForStarted, waitForFinished(), вы можете прочитать вывод stderr (аналогично тому, как вы читаете stdout), есть QProcess::errorString(). Сначала проверьте их, чтобы увидеть, что происходит не так.   -  person Frank Osterfeld    schedule 28.02.2013


Ответы (3)


Ответ Хунора сработал и для меня. Но я не использовал идентификатор процесса. Я сделал:

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();
}
person Hailey Yoon    schedule 22.02.2018

Для меня работал следующий код:

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

путь: вы можете установить свой собственный путь
команда: какую программу вы хотите запустить (в данном случае python)
параметры: скрипт, который вы хотите выполнить
&processID, предназначен для завершения процесса, если главное окно закрыто

person Orbán Hunor    schedule 09.02.2018

person    schedule
comment
Передайте параметры, как указано в документации, как QStringList -> где вы это делаете? - person Kev1n91; 29.06.2020