在Qt中,如何用QProcess快速实现外部程序调用

本文详细介绍了Qt中的QProcess类如何启动并管理外部程序。主要讨论了execute()、start()和startDetached()三个接口的区别,以及如何通过QStringList传递参数。在使用startDetached()时需要注意,该方法可能导致主程序无法正常接收到外部程序的反馈信息。此外,还展示了如何通过相对路径调用外部EXE文件,并提供了相应的代码示例。
摘要由CSDN通过智能技术生成

Qt系列文章目录

前言

QProcess类是Qt中专门用于启动一个外部程序进程并与主程序通信的。此类中包含多个静态函数和信号,可以方便地通过信号与槽机制实现信息互通。

我们要实现快速调用外部程序,常用的有三个接口函数:

QProcess::execute(): 此函数是以阻塞的方式打开外部程序,只有外部程序执行完成后,主程序才会继续执行。外部程序的标准输出、标准错误都是重定向到主程序的标准输出和标准错误的。
QProcess::start(): 此函数是以子进程的 方式打开外部程序的,外部进程与主程序互不干扰,但外部进程的父进程就是主程序。
QProcess::startDetached(): 此函数是以分离的方式打开外部程序的,外部程序与主程序互不干扰,外部进程的父进程是系统的init进程。
上面三个接口函数中,execute()和startDetached()为静态成员函数,start()函数为普通成员函数。 另外,值得注意的是,使用start() 函数打开外部进程时,外部进程启动后,将随主程序的退出而退出,使用回调即可以正常接收信息;使用startDetached() 函数打开外部进程时,外部进程启动后,不会随主程序的退出而退出,使用回调无法正常接收到信息。

一、QProcess::startDetached():

QProcess::startDetached():,上述是非阻塞调用exe文件,但是非阻塞调用有个坏处,执行最后的删除B.exe文件时会失败,导致会在你当前路径下创建个B.exe文件且不会被删除,好处是你的主程序仍然在运行,事件之类的仍然可以运行。
另外两种是阻塞式调用,好处是你的主程序会被卡在这里,直到cmd指令框被退出。

oid HeatW::infraShow()
{
	QProcess::startDetached("E:/osg/work/DP_SDK_v8395/Bin/infrared/x64/InfraDemo.exe", 	     QStringList());
}

在这里插入图片描述

二、第二个参数:QStringList

QStringList list;
list<< “-t” << “-s” << “3600”;
QProcess::startDetached(“Shutdown.exe”,list);
// QProcess::execute(“Shutdown.exe”,list);

2.通过相对路径调用外部EXE文件

第1种方式是将外部exe嵌入到你自己的qt程序内,有好处也有坏处,好处是最终只需要一个exe的包就行,坏处是这个exe的包相对较大,因为包含了你外部的那个exe文件。
这第二种方式就是调用外部相对路径的exe文件。
还是假设吧,假设需要调用的外部EXE文件名为A.exe,我们正在写的qt的exe文件为B.exe
1.我们需要设定好我们要调用的A.exe文件相对于我们的B.exe的位置,相信看官们都知道文件路径是个什么玩意,就不多解释相对路径是个什么概念了。
既然要调用相对路径的A.exe,那么我们就得直到我们的B.exe在哪,贴代码:

QString str = QApplication::applicationDirPath();
str内就是你当前的B.exe所在的路径,但是我们要调用的是A.exe,假设我把A.exe和B.exe放在了一个路径下,那就如下:

QString str = QApplication::applicationDirPath();
str += “/firmware_upgrade_v1.0.0.exe”;
直接加上当前路径下的B.exe就行,之后很简单啦,process走起,完整代码:

QProcess process(this);
QString str = QApplication::applicationDirPath();
str += “/firmware_upgrade_v1.0.0.exe”;
process.startDetached(str);
当然 ,你想吧A.exe放在其他文件夹下也行,不过程序也要改,也就是说你的B.exe程序内写的路径决定了A.exe文件必须相对B.exe放在哪。OK有问题评论区扣我,可能说的不是特别细。写下此博文也是记录生活怕自己以后忘了,看官们相互建议哈。

参考

SXD_SJJ
武三郎

### 回答1: 在Qt编程,要实现点击按钮调用外部程序,可以使用QtQProcess类。 首先,我们需要在Qt工程创建一个按钮,并在相应的槽函数编写调用外部程序的代码。 在点击按钮的槽函数,我们可以创建一个QProcess对象,并通过QProcess的start方法来启动外部程序。 下面是一个简单的示例代码: ```cpp void MainWindow::on_button_clicked() { // 创建QProcess对象 QProcess *process = new QProcess(this); // 设置要调用外部程序路径 QString program = "C:/path/to/external/program"; // 设置外部程序的命令行参数(如果有的话) //QStringList arguments; //arguments << "argument1" << "argument2"; // 启动外部程序 process->start(program); // 或者使用 process->startDetached(program) 来在后台运行程序 // 检查是否启动成功 if (!process->waitForStarted()) { // 启动失败,显示错误信息 QString error = process->errorString(); QMessageBox::critical(this, "Error", "Failed to start external program: " + error); } } ``` 在上述代码,按钮点击事件的槽函数为`on_button_clicked()`,在这个函数我们首先创建了一个QProcess对象process,然后设置要调用外部程序的路径和命令行参数(如果有的话),最后调用process的start方法来启动外部程序启动之后,我们可以通过waitForStarted()函数来等待程序是否成功启动,如果启动失败,可以通过errorString()获取错误信息并进行处理。 这样,当我们点击按钮时,就会调用外部程序。 ### 回答2: 在Qt编程,要实现点击按钮调用外部程序,可以使用Qt的信号与槽机制。 首先,需要在Qt的工程文件(*.pro文件)添加一个外部程序的路径,例如: LIBS += -L/path/to/external/program -lexternalProgram 接下来,在代码创建一个按钮,并连接按钮的"clicked"信号与一个槽函数。 然后,在槽函数使用QProcess类来执行外部程序QProcess提供了启动外部程序并与其进行交互的功能。 以下是一个示例代码: ```cpp // 头文件 #include <QPushButton> #include <QProcess> class MyWidget : public QWidget { Q_OBJECT public: MyWidget(QWidget *parent = nullptr) : QWidget(parent) { QPushButton *button = new QPushButton("调用外部程序", this); connect(button, &QPushButton::clicked, this, &MyWidget::startExternalProgram); } private slots: void startExternalProgram() { QProcess *process = new QProcess(this); process->start("/path/to/external/program"); // 启动外部程序,传入路径 process->waitForFinished(); // 等待外部程序执行完毕 } }; ``` 以上代码,当按钮被点击时,会调用startExternalProgram槽函数。该函数创建一个QProcess对象,并调用其start函数来启动外部程序。waitForFinished函数会阻塞当前线程,直到外部程序执行完毕。 注意,路径"/path/to/external/program"应替换为真实的外部程序的路径。另外,在使用QProcess时,还可以通过信号与槽机制来处理外部程序的输出、错误信息等。 通过上述方法,就可以在Qt编程实现点击按钮调用外部程序的功能。 ### 回答3: 在Qt编程,我们可以使用QProcess类来实现点击按钮调用外部程序QProcessQt提供的用于启动外部进程的类。 首先,在Qt Creator创建一个新的项目,并在主窗口设计一个按钮(如"调用外部程序"),并关联一个槽函数。 接下来,我们需要在相关的槽函数内部编写代码来实现调用外部程序的功能。具体步骤如下: 1. 在槽函数内部创建一个QProcess对象。 ```cpp QProcess process; ``` 2. 设置要调用外部程序路径。 ```cpp QString programPath = "外部程序路径"; process.setProgram(programPath); ``` 3. 可选:如果需要传递参数给外部程序,可以使用setArguments()函数。 ```cpp QStringList arguments; arguments << "参数1" << "参数2"; process.setArguments(arguments); ``` 4. 启动外部程序。 ```cpp process.start(); ``` 以上就是实现点击按钮调用外部程序的基本步骤。需要注意的是,外部程序的路径需要根据实际情况进行设置,同时还可以根据需要设置参数传递给外部程序。另外,点击按钮之前,需要确保外部程序已经正确安装并设置了正确的路径。 希望以上回答对您有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值