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.

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

5

Решение

Вы пробовали следующее:

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

Другие решения

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

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 предназначен для уничтожения процесса, если главное окно закрыто

0

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

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();
}
0
По вопросам рекламы [email protected]