13、Qt:用QProcess类启动外部程序:复杂使用

一、说明

  • 简单使用:在一个函数中,使用QProcess类的临时对象调用可执行文件exe,只有这个exe执行完了,这个函数才往下执行,一次性打印出exe所有输出信息;
  • 复杂使用:创建QProcess类的全局对象,在一个函数中,调用可执行文件exe,不用等exe执行完,这个函数就可以往下执行,实时打印输出相关信息;

注:此文讲解复杂使用方式,简单使用方式见上一篇。

二、添加复杂使用项目

在简单使用的基础上创建复杂使用项目

右击项目名称,选择“新子项目”

选择项目模板

更改项目名

默认

默认,点击“完成”

在ComplexUse.pro中添加如下代码,更改可执行文件生成位置

CONFIG(debug , debug | release) {
win32:!wince{
    DESTDIR = $$PWD/../bin_debug
}
unix {
    DESTDIR = $$PWD/../bin_debug_linux
}
} else {
win32:!wince{
    DESTDIR = $$PWD/../bin_release
}
unix {
    DESTDIR = $$PWD/../bin_release_linux
}
}

在mainwindow.ui界面上添加一个QPushButton,并转到槽

更改maincppwindow.h中的代码

#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 = nullptr);
    ~MainWindow();

private slots:

    void showResult();  //进程输出数据

    void showState(QProcess::ProcessState); //进程运行状态

    void showError(QProcess::ProcessError); //进程运行错误

    void showFinished(int, QProcess::ExitStatus); //进程完成情况

    void showReadyReadStandardErro(); //被调用程序里的错误

    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;

    QProcess m_process;
};

#endif // MAINWINDOW_H

更改mainwindow.cpp中的代码

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QTextCodec>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    connect(&m_process, &QProcess::readyRead, this, &MainWindow::showResult);
    connect(&m_process, &QProcess::stateChanged, this, &MainWindow::showState);
    connect(&m_process, &QProcess::errorOccurred, this, &MainWindow::showError);
    connect(&m_process, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(showFinished(int,QProcess::ExitStatus)));
    connect(&m_process, &QProcess::readyReadStandardError, this, &MainWindow::showReadyReadStandardErro);
}

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

/**
* @brief MainWindow::on_pushButton_clicked 点击按钮,用进程调用其他的exe
*/
void MainWindow::on_pushButton_clicked()
{
    QString program = QApplication::applicationDirPath() + "/test.exe";
    QStringList argument;
    argument << "11" << "22" << "33";
    m_process.start(program, argument); //此程序关闭,program程序也关闭

   //此程序关闭,program程序仍然可以执行
   //m_pProcess.startDetached(program, argument);
}

/**
* @brief MainWindow::showResult 进程输出数据
*/
void MainWindow::showResult()
{
    QTextCodec* codec = QTextCodec::codecForLocale();
    qDebug() << "showResult: " << endl << codec->toUnicode(m_process.readAll());
}

/**
* @brief MainWindow::showState 进程运行状态
* @param state
*/
void MainWindow::showState(QProcess::ProcessState state)
{
    qDebug() << "showState: ";

    if(state == QProcess::NotRunning)
    {
        qDebug() << "Not Running";
    }
    else if(state == QProcess::Starting)
    {
        qDebug() << "Starting";
    }
    else
    {
        qDebug() << "Running";
    }
}

/**
* @brief MainWindow::showError 运行错误
*/
void MainWindow::showError(QProcess::ProcessError er)
{
    switch (er)
    {
    case QProcess::FailedToStart:
        qDebug() << "QProcess::FailedToStart";
        break;
    case QProcess::Crashed:
        qDebug() << "QProcess::Crashed";
        break;
    case QProcess::Timedout:
        qDebug() << "QProcess::Timedout";
        break;
    case QProcess::WriteError:
        qDebug() << "QProcess::WriteError";
        break;
    case QProcess::ReadError:
        qDebug() << "QProcess::ReadError";
        break;
    case QProcess::UnknownError:
        qDebug() << "QProcess::UnknownError";
        break;
    }
}

/**
* @brief MainWindow::showFinished 进程完成情况
* @param exitCode
* @param exitStatus
*/
void MainWindow::showFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
    qDebug() << "showFinished: " << endl << exitCode << exitStatus;
}

/**
* @brief MainWindow::showReadyReadStandardErro 被调用程序里的错误
*/
void MainWindow::showReadyReadStandardErro()
{
    qDebug() << "showReadyReadStandardErro: " << endl <<     m_process.readAllStandardError();
}

三、运行测试

运行ComplexUse程序,点击pushButton,输出如下

  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值