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

一、说明

  • 简单使用:在一个函数中,使用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();

相关推荐

  1. Qt之·QProcess

    2023-12-22 16:14:01       21 阅读
  2. qt QProcess学习

    2023-12-22 16:14:01       17 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-22 16:14:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-22 16:14:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-22 16:14:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-22 16:14:01       20 阅读

热门阅读

  1. adb 基本命令合集

    2023-12-22 16:14:01       37 阅读
  2. ubuntu云服务器定时重启

    2023-12-22 16:14:01       38 阅读
  3. springboot jpa json字段和实体转换

    2023-12-22 16:14:01       49 阅读
  4. 面向对象多态等其它内容

    2023-12-22 16:14:01       26 阅读
  5. SELinux 关闭修改

    2023-12-22 16:14:01       56 阅读
  6. 在Linux上安装CLion

    2023-12-22 16:14:01       35 阅读