【Qt】使用QProcess调用其它程序或脚本

大概试了一下,还是不错的,不过字符编码问题还不太好解决:

代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QProcess>
#include <QTextCodec>
#include <QCloseEvent>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("KOI8-R"));
    ui->progressBar->setValue(0);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    process = new QProcess(this);
    QStringList str;
    str << "";

    if (ui->pushButton->text() == "stop")
    {
        process->write("quit");
        process->kill();
        return;
    }

    QString exe = QApplication::applicationDirPath().append("/test.bat");

    connect(process, SIGNAL(started()), this, SLOT(start_process()));
    connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(start_read_output()));
    connect(process, SIGNAL(readyReadStandardError()), this, SLOT(start_read_err_output()));
    connect(process, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(finish_process(int, QProcess::ExitStatus)));

    process->start(exe);
    if (false == process->waitForStarted())
    {
        ui->textBrowser->append("this process can not be called.");
    }

    ui->pushButton->setText("stop");
}

void MainWindow::start_process()
{
    ui->progressBar->setVisible(true);
    ui->progressBar->setValue(0);
    //QMessageBox::information(this, "ok", "ok", QMessageBox::Ok);
    ui->textBrowser->append(tr("process start"));
}

void MainWindow::finish_process(int exitCode, QProcess::ExitStatus exitStatus)
{
    if (exitStatus == QProcess::NormalExit)
    {
        ui->textBrowser->append(tr("process exit normal"));
    }
    else
    {
        ui->textBrowser->append(tr("process exit crash"));
    }
    ui->progressBar->setValue(100);
    ui->textBrowser->append("process finised");
    ui->pushButton->setText("ok");
}

void MainWindow::start_read_output()
{
    QByteArray ba = process->readAllStandardOutput();
    ui->textBrowser->append(ba);
}

void MainWindow::start_read_err_output()
{
    QByteArray ba = process->readAllStandardError();
    ui->textBrowser->append("error: " + ba);
}

void MainWindow::closeEvent(QCloseEvent *event)
{
    process->write("quit");
    process->kill();
    if(!process->waitForFinished(100))
        return;
    event->accept();
}

头文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QProcess>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    QProcess* process;

protected:
    void closeEvent(QCloseEvent *);

private slots:
    void on_pushButton_clicked();
    void start_process();
    void start_read_output();
    void start_read_err_output();
    void finish_process(int exitCode, QProcess::ExitStatus exitStatus);

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

最后执行结果:

原文地址:https://www.cnblogs.com/kernel0815/p/3923608.html