12、Qt:用QProcess类启动外部程序:简单使用

发布时间:2023年12月21日

一、说明

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

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

二、创建项目

新建一个Qt项目,选择“其他项目”、“子目录项目”,点击“Choose”

更改项目名称和位置

选择编译器

默认

三、创建被调用的可执行文件

点击上一步的“完成&添加子项目”,完成项目创建,并开始创建子项目,弹出界面,选择“Application”、“Qt Console Application”

更改子项目名称

默认

选择编译器

默认,点击完成

在test.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
}
}

更改main.cpp中的代码

#include <QCoreApplication>
#include <iostream>
#include <QThread>
using namespace std;

/*
* argc:表示传入main函数的数组元素个数
* argv:表示传入main函数的指针数组
* 第一个数组元素argv[0]:程序名称
*/
/**
* @brief main 主函数
* @param argc 传入main函数的参数个数(argv的数量)
* @param argv 传入main函数的参数数组,第一个数组元素argv[0]:程序名称
* @return
*/
int main(int argc, char *argv[])
{
    //QCoreApplication a(argc, argv);

    for(int i = 0; i < argc; i++)
    {
       cout << argv[i] << endl;
       QThread::msleep(1);
    }
    return 0;
    //return a.exec();
}

构建,生成可执行文件

四、调用可执行文件

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

选择“Application”、“Qt Widgets Application”

更改子项目名称

默认

点击完成

在SimpleUse.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,并转到槽

更改mainwindow.cpp中的代码

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QProcess>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

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

void MainWindow::on_pushButton_clicked()
{
    QProcess p;
    QString program = QApplication::applicationDirPath() + "/test.exe"; //要运行的外部程序
    QStringList argument;
    argument << "11" << "22" << "33";  //给外部程序传递的参数
    p.start(program, argument);

    if(!p.waitForStarted()) //等待程序启动
    {
       qDebug() << "程序启动失败" << program << p.readAllStandardOutput(); //程序输出信息
       p.close();
       return;
    }

    if(!p.waitForFinished(100000))//等待10000ms程序未结束,返回false
    {
       qDebug() << "程序结束失败:" << p.readAllStandardOutput(); //程序输出信息
       p.close();
       return;
    }

    qDebug() << "程序结束:" << p.readAllStandardOutput(); //程序输出信息
    p.close();
}

五、运行测试

运行SimpleUse程序,点击pushButton,打印框输出如下内容

六、使用命令提示符cmd调用可执行文件

    QProcess p;
    p.setProgram("cmd");
    QString program = QApplication::applicationDirPath() + "/test.exe";
    QStringList argument;
    argument<<"/c"<< program << "11" << "22" << "33";
    p.setArguments(argument);
    p.start();
    if(!p.waitForStarted()) //等待程序启动
    {
       qDebug() << "程序启动失败" << program << p.readAllStandardOutput(); //程序输出信息
       p.close();
       return;
    }

    if(!p.waitForFinished(100000))//等待10000ms程序未结束,返回false
    {
       qDebug() << "程序结束失败:" << p.readAllStandardOutput(); //程序输出信息
       p.close();
       return;
    }
    qDebug() << "程序结束:" << p.readAllStandardOutput(); //程序输出信息
    p.close();
文章来源:https://blog.csdn.net/Viciower/article/details/135139630
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。