Qt外部调用进程类QProcess的使用

有的时候我们需要在自己程序运行过程中调用其他进程,那么就需要用到QProcess。

首先可以了解一些关于进程的相关知识:线程与进程,你真得理解了吗_进程和线程的区别-CSDN博客

进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配的基本单位,是操作系统结构的基础。 

如何查看系统中正在运行的进程以及如何杀死进程:

Windows:

启动进程:tasklist

杀死进程:taskkill /F /PID 4204(进程id) 

 

Linux:

查看进程:ps -ef

杀死进程:kill -9 4341(进程id)

 QProces的使用:

QProcess通过start和startDetached两个方法都可以启动进程,其中前者是一体式启动,即外部程序启动后,将随主程序的退出而退出。后者是分离式启动,即外部程序启动后,当主程序退出时并不退出,而是继续运行。

这次主要说start这个方法:
void 
start(const QString &program, const QStringList &arguments, QIODevice::OpenMode mode = ReadWrite) 

主要需要注意第一个参数和第二个参数,第一个参数是要执行的命令或者程序,第二个参数是这个程序的运行参数。关于这两个先看一个最简单的qt程序代码:

#include <QCoreApplication>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);return a.exec();
}

这个代码大家再熟悉不过来,就是一个最简单的qt控制台程序,不知道大家有没有注意过main函数的两个参数argc和argv[]。

  1. int argc:代表命令行参数的数量,即传递给程序的参数个数。通常情况下,argc至少为1,因为第一个参数通常是程序本身的名称。

  2. char *argv[]:是一个指向字符指针数组的指针,其中每个元素是一个指向表示一个命令行参数的C风格字符串的指针。argv[0]通常是程序的名称,后续元素是传递给程序的其他参数。

试着打印一下:

#include <QCoreApplication>
#include <QDebug>
int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);for (int i = 0; i < argc; ++i) {qDebug() << argv[i];}return a.exec();
}

编译运行查看打印:

打印了一个参数,即程序的名称。试着给这个控制台程序启动时加几个参数:

 

使用QtCreator传入运行参数也可以这样设置:

 

 运行查看结果:

 也可以使用QCoreApplication::arguments()打印参数:

#include <QCoreApplication>
#include <QDebug>
int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);for (int i = 0; i < argc; ++i) {qDebug() << argv[i];}QStringList args = QCoreApplication::arguments();for (const QString &arg : args) {qDebug() << arg;}return a.exec();
}

编译运行查看:

QProcess使用start传入对应参数,这是要启动的程序:

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);for (const QString &arg : QCoreApplication::arguments()) {ui->textEdit->append(arg);}
}MainWindow::~MainWindow() { delete ui; }

将程序参数显示到对应QTextEdit上:

#include <QCoreApplication>
#include <QDebug>
#include <QProcess>
int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QProcess *p = new QProcess;QStringList args;args << "1"<< "2"<< "3";p->start("G:\\qtprojects\\ConsoleP\\debug\\ConsoleP.exe", args);return a.exec();
}

编译查看运行结果:

QProcess通过processId来获取对应进程id。 

关于QProcess的信号:

 其中readyReadStandardError()与readyReadStandardOutput()收到对应信号后通过readAllStandardOutput()与readAllStandardError()来获取对应程序标准输出以及异常输出,进程运行完成后会触发finished()信号,进程状态改变会触发stateChanged信号。写一个例子:

头文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACEclass QProcess;
class MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:void appendLog(const QString &text);private slots:void on_open_clicked();void on_cmd_clicked();void on_clear_clicked();private:Ui::MainWindow *ui;QProcess *m_Process;
};
#endif // MAINWINDOW_H

源文件:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDateTime>
#include <QFileDialog>
#include <QProcess>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);m_Process = new QProcess;connect(m_Process, &QProcess::readyReadStandardOutput, [=]() {QByteArray output = m_Process->readAllStandardOutput();QString outputString = QString::fromLocal8Bit(output);appendLog("output:" + outputString);});connect(m_Process, &QProcess::readyReadStandardError, [=]() {QByteArray output = m_Process->readAllStandardError();QString outputString = QString::fromLocal8Bit(output);appendLog("error:" + outputString);});connect(m_Process, &QProcess::stateChanged,[=](QProcess::ProcessState newState) {appendLog("stateChanged:" + QString::number(newState));});connect(m_Process, &QProcess::errorOccurred,[=](QProcess::ProcessError error) {appendLog("errorOccurred:" + QString::number(error));});connect(m_Process,static_cast<void (QProcess::*)(int exitCode,QProcess::ExitStatus exitStatus)>(&QProcess::finished),[=](int exitCode, QProcess::ExitStatus exitStatus) {appendLog("finished:" + QString::number(exitCode) + ":" +QString::number(exitStatus));});
}MainWindow::~MainWindow() {delete ui;
}void MainWindow::appendLog(const QString &text) {ui->textEdit->append(QString("%1:program=%2:pid=%3:%4").arg(QDateTime::currentDateTime().toString("yyyy/MM/dd hh:mm:ss.zzz")).arg(m_Process->program()).arg(m_Process->processId()).arg(text));
}void MainWindow::on_open_clicked() {QString pragramName =QFileDialog::getOpenFileName(nullptr, nullptr, QString());ui->program->setText(pragramName);
}void MainWindow::on_cmd_clicked() {if (ui->program->text().isEmpty()) return;m_Process->setProgram(ui->program->text());QStringList arguments;arguments << ui->arguments->text();m_Process->setArguments(arguments);m_Process->start();
}void MainWindow::on_clear_clicked() {ui->textEdit->clear();
}

ui:

编译运行然后再对应输入框输入程序路径以及对应参数,以刚刚写的例子为例:

 然后关闭启动的进程:

可以看到关闭后触发了对应finished()信号,然后通过打印可以看到状态从打开到关闭的变化情况是:1(Starting)->2(Running)->0(NotRunning) 。并且触发finished()信号时由于进程已经关闭,所以获取不到对应的进程id,但是stateChanged(NotRunning)会先于finished(),并且这时进程没有完全关闭所有能获取到对应进程id。也可以输入一些cmd命令:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/716244.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java面试——Redis

优质博文&#xff1a;IT-BLOG-CN 一、Redis 为什么那么快 【1】完全基于内存&#xff0c;绝大部分请求是纯粹的内存操作&#xff0c;非常快速。数据存在内存中。 【2】数据结构简单&#xff0c;对数据操作也简单&#xff0c;Redis中的数据结构是专门进行设计的。 【3】采用单线…

【Vue3】全局切换字体大小

VueUse 先安装VueUse <template><header><div class"left">left</div><div class"center">center</div><div class"right">right</div></header><div><button click"cha…

飞天使-学以致用-devops知识点4-SpringBoot项目CICD实现(实验失败,了解大概流程)

文章目录 代码准备创建jenkins 任务测试推送使用项目里面的jenkinsfile 进行升级操作 文字版本流程项目构建 代码准备 推送代码到gitlab 代码去叩叮狼教育找 k8s 创建jenkins 任务 创建一个k8s-cicd-demo 流水线任务 将jenkins 里面构建时候的地址还有token&#xff0c; 给到…

azure devops工具实践分析

对azure devops此工具的功能深挖&#xff0c;结合jira的使用经验的分析 1、在backlog的功能描述&#xff0c;可理解为需求项&#xff0c;这里包括了bug&#xff0c;从开发的角度修复bug也是个工作项&#xff0c;所以需求的范围是真正的需求&#xff08;开发接收到的已经确认的…

【PDF技巧】网上下载的pdf文件怎么才能编辑

不知道大家有没有遇到过网上下载的PDF文件不能编辑的情况&#xff0c;今天我们来详细了解一下导致无法编辑的原因即解决方法有哪些。 第一种原因&#xff1a;PDF文件中的内容是否是图片&#xff0c;如果确认是图片文件&#xff0c;那么我们想要编辑&#xff0c;就可以先使用PD…

分享经典、现代以及前沿软件工程课程

https://www.icourse163.org/course/PKU-1003177002 随着信息技术的发展&#xff0c;软件已经深入到人类社会生产和生活的各个方面。软件工程是将工程化的方法运用到软件的开发、运行和维护之中&#xff0c;以达到提高软件质量&#xff0c;降低开发成本的目的。软件工程已经成为…

字符函数和字符串函数(下)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 目录 strncpy函数的使用 函数原型&#xff1a; strncpy的使用 strncat函数的使用 函数原型&#xff1a; strncat的使用 strncmp函数的使用 函…

Vue3快速上手(十六)Vue3路由传参大全

Vue3路由传参 一、传参的多种方式 1.1 拼接方式 这种方式适合传递单个参数的情况&#xff0c;比如点击查看详情&#xff0c;传个id这样的场景 传参&#xff1a; <RouterLink to"/person?id1" active-class"active">person</RouterLink> …

Unity - 相机画面为黑白效果

一、 在Hierarchy中创建一个Global Volume,并设置它为局部作用 二、 将场景出现的作用域范围缩小至相机所在位置&#xff0c;将相机包含即可。 三、添加覆盖组件Color Adjustments,并将Saturation直接拉为-100 。 此时&#xff0c;相机拍摄画面为黑白&#xff0c;场景视图中…

1、Linux-安装

一、Linux和Windows的一些区别 1、Linux严格区分大小写——【Windows创建文件夹时不区分大小写】 2、Linux中所有内容都以文件形式存储&#xff0c;包括硬件 3、Linux不靠拓展名区分文件类型&#xff0c;而是可以通过读取文件开头的一些字节来区分。 但是在实际使用中一般要…

MYSQL---日志

1.日志的概述 日志是MySQL数据库的重要组成部分。日志文件中记录着MySQL数据库运行期间发生的变化&#xff1b;也就是说用来记录MySQL数据库的客户端连接状况、SQL语句的执行情况和错误信息等。当数据库遭到意外的损坏时&#xff0c;可以通过日志查看文件出错的原因&#xff0…

C语言中的字符魔法:大小写转换的艺术

引言 在C语言的世界里&#xff0c;字符处理是一项基础且重要的任务。字符作为编程中最基本的元素之一&#xff0c;承担着信息展示、数据交互等多重角色。特别是在处理文本信息时&#xff0c;字符的转换和识别显得尤为重要。大小写字母的转换就是其中一个常见的需求&#xff0c…

电子电气架构——汽车DoIP诊断通信建立流程

电子电气架构——汽车DoIP诊断通信建立流程 我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 人们会在生活中不断攻击你。他们的主要武器是向你灌输对自己的怀疑:你的价值、你的能力、你的潜力。他们往往会…

4款塞纸条盲盒交友源码,可以对接公众号

一元盲盒交友源码/脱单盲盒源码/交友盲盒/恋爱盲盒公众号版 可以对接自己支付&#xff0c;全部自定义 没有任何bug版本&#xff0c;已经测试完全可以 免费源码&#xff0c;不包搭建指导 源码下载地址专业知识分享社区-专业知识笔记免费分享 (chaobiji.cn)

Globeland30米分辨率土地利用数据的下载

全国地理信息资源目录服务系统 先注册一下&#xff0c;登录 点击查询

国内chatgpt写作软件,chatgpt国内使用

随着人工智能技术的不断发展&#xff0c;国内涌现出了一些基于ChatGPT模型的写作软件&#xff0c;这些软件不仅能够实现智能化的文章写作&#xff0c;还支持批量生成各种类型的文章。本文将深入探讨国内ChatGPT写作软件&#xff0c;以及它们在批量文章创作方面的应用与优势。 C…

使用最新Hal库实现USART中断收发功能(STM32F4xx)

目录 概述 1 认识STM32F4XX的USART 1.1 USART 功能说明 1.2 USART的中断 1.3 USART 模式配置 1.4 USART的寄存器 2 使用STM32CubeMX 生成工程 2.1 配置参数 2.2 生成工程代码 3 实现软件功能 3.1 软件功能介绍 3.2 认识USART Hal库 3.2.1 初始化函数组 3.2.2 发送…

一周学会Django5 Python Web开发-Django5详细视图DetailView

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计28条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

vue+element模仿实现云码自动验证码识别平台官网

一、项目介绍 项目使用传统vue项目结构实现&#xff0c;前端采用element实现。 element官网&#xff1a;Element - The worlds most popular Vue UI framework 云码官网地址&#xff1a;云码-自动验证码识别平台_验证码识别API接口_免费验证码软件 项目截图&#xff0c;支持…

ios csr 证书创建

苹果Certificate证书创建 1.开始创建。 登录苹果开发者网站 选择Certificates旁边的 ✙按钮 选择你想要的证书类型&#xff0c;手机开发的话一般是iOS APP Development 跟 iOS Distribution&#xff08;App Store and Ad Hoc&#xff09;&#xff0c;如果要Mac和iOS都可以发…