我正在尝试为我用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文件只是一个按钮和一个LineEdit小部件。
单击按钮时,我将按钮分配了一个插槽。当我调用on_pushButton_clicked()
或ls
之类的实用程序时,ps
方法工作正常,并且它将这些命令的输出传递给LineEdit小部件,但是当我尝试调用Python脚本时,它没有在LineEdit小部件上显示任何内容。
非常感谢任何帮助。
答案 0 :(得分:2)
您是否尝试过以下操作:
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);
}
答案 1 :(得分:0)
对我来说,以下代码有效:
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)
params :您要执行的脚本
&amp; processID 用于在主窗口关闭时终止进程
答案 2 :(得分:0)
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();
}