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