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

一、说明

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

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

二、创建项目

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

12、Qt:用QProcess类启动外部程序:简单使用_第1张图片

更改项目名称和位置

12、Qt:用QProcess类启动外部程序:简单使用_第2张图片

选择编译器

12、Qt:用QProcess类启动外部程序:简单使用_第3张图片

默认

12、Qt:用QProcess类启动外部程序:简单使用_第4张图片

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

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

12、Qt:用QProcess类启动外部程序:简单使用_第5张图片

更改子项目名称

12、Qt:用QProcess类启动外部程序:简单使用_第6张图片

默认

12、Qt:用QProcess类启动外部程序:简单使用_第7张图片

选择编译器

12、Qt:用QProcess类启动外部程序:简单使用_第8张图片

默认,点击完成

12、Qt:用QProcess类启动外部程序:简单使用_第9张图片

在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 
#include 
#include 
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();
}

构建,生成可执行文件

12、Qt:用QProcess类启动外部程序:简单使用_第10张图片

四、调用可执行文件

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

12、Qt:用QProcess类启动外部程序:简单使用_第11张图片

选择“Application”、“Qt Widgets Application”

12、Qt:用QProcess类启动外部程序:简单使用_第12张图片

更改子项目名称

12、Qt:用QProcess类启动外部程序:简单使用_第13张图片

默认

12、Qt:用QProcess类启动外部程序:简单使用_第14张图片

点击完成

12、Qt:用QProcess类启动外部程序:简单使用_第15张图片

在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 
#include 
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,打印框输出如下内容

12、Qt:用QProcess类启动外部程序:简单使用_第16张图片

六、使用命令提示符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();

你可能感兴趣的:(Qt小功能,qt)