Qt通过QProcess启动进程并传递命令行参数

news2024/11/15 19:46:58

目录

  • QProcess
    • 启动外部程序的两种方式
      • 依赖式
      • 分离式:
    • 启动进程前的预处理
      • 设置启动路径
      • 设置启动命令参数
    • 启动的状态
    • 更多说明
      • Public Functions
      • Signals
  • 设计一个拉起进程的程序
    • 基本设计思路
    • 效果图
    • 核心代码
      • 控件对象
      • header file(头文件)
      • member variable(成员变量)
      • 【选择应用】按钮的槽函数
      • 【拉起进程】按钮的槽函数
      • 【杀死进程】按钮的槽函数
      • UI布局
      • 组织架构
    • 测试效果
  • Qt解析命令行参数
    • 命令说明
    • 增加命令
    • 解析命令
  • 设计一个后台进程的程序
    • 组织架构
    • 核心代码
    • 通过Cmd进行测试命令行参数
    • 文件输出
    • 后续


QProcess

用于完成启动外部程序,并与其交互通信。

启动外部程序的两种方式

依赖式

外部程序启动后,将随主程序的退出而退出。

void start(const QString & program,const QStringList &arguments,OpenMode mode = ReadWrite)

分离式:

外部程序启动后,当主程序退出时并不退出,而是继续运行。

void startDetached(const QString & program,const QStringList & arguments,const QString&workingDirectory=QString(),qint64 *pid =0)

启动进程前的预处理

设置启动路径

可以提前设置启动路径,也可以在start方法中进行设置。

void setProgram(const QString & program)

设置启动命令参数

可以提前设置启动命令参数也可以不设置(非必须),也可以在start方法中进行设置。

void setArguments(const QStringList & arguments)

启动的状态

1、外部程序未启动时,状态是NotRunning;
2、外部程序启动时,状态是Starting
3、外部程序启动之后,状态是Running,并发出started()信号,此时可对QProcess进行RW操作;
4、外部程序退出时,状态是NotRunning,并发出finished()信号。finished()信号会包含退出码退出状态信息,可通过exitCode()exitStatus()来获得。
5、外部程序发生错误时,Qprocess会发出一个error()信号,可通过error()来获得其错误类型,通过state()获得当前程序的状态。

更多说明

有更多想了解Qprocess类的信息,可阅读Qt 助手。 下面列出了,所有可调用的方法。

Public Functions

 QProcess(QObject *parent = nullptr)
 virtual ~QProcess()
 QStringList arguments() const
 std::function<void ()> childProcessModifier() const
 void closeReadChannel(QProcess::ProcessChannel channel)
 void closeWriteChannel()
 QProcess::CreateProcessArgumentModifier createProcessArgumentsModifier() const
 QProcess::ProcessError error() const
 int exitCode() const
 QProcess::ExitStatus exitStatus() const
 QProcess::InputChannelMode inputChannelMode() const
 QString nativeArguments() const
 QProcess::ProcessChannelMode processChannelMode() const
 QProcessEnvironment processEnvironment() const
 qint64 processId() const
 QString program() const
 QByteArray readAllStandardError()
 QByteArray readAllStandardOutput()
 QProcess::ProcessChannel readChannel() const
 void setArguments(const QStringList &arguments)
 void setChildProcessModifier(const std::function<void ()> &modifier)
 void setCreateProcessArgumentsModifier(QProcess::CreateProcessArgumentModifier modifier)
 void setInputChannelMode(QProcess::InputChannelMode mode)
 void setNativeArguments(const QString &arguments)
 void setProcessChannelMode(QProcess::ProcessChannelMode mode)
 void setProcessEnvironment(const QProcessEnvironment &environment)
 void setProgram(const QString &program)
 void setReadChannel(QProcess::ProcessChannel channel)
 void setStandardErrorFile(const QString &fileName, QIODeviceBase::OpenMode mode = Truncate)
 void setStandardInputFile(const QString &fileName)
 void setStandardOutputFile(const QString &fileName, QIODeviceBase::OpenMode mode = Truncate)
 void setStandardOutputProcess(QProcess *destination)
 void setWorkingDirectory(const QString &dir)
 void start(const QString &program, const QStringList &arguments = {}, QIODeviceBase::OpenMode mode = ReadWrite)
 void start(QIODeviceBase::OpenMode mode = ReadWrite)
 void startCommand(const QString &command, QIODeviceBase::OpenMode mode = ReadWrite)
 bool startDetached(qint64 *pid = nullptr)
 QProcess::ProcessState state() const
 bool waitForFinished(int msecs = 30000)
 bool waitForStarted(int msecs = 30000)
 QString workingDirectory() const

Signals

 void errorOccurred(QProcess::ProcessError error)
 void finished(int exitCode, QProcess::ExitStatus exitStatus = NormalExit)
 void readyReadStandardError()
 void readyReadStandardOutput()
 void started()
 void stateChanged(QProcess::ProcessState newState)

设计一个拉起进程的程序

基本设计思路

1、点击【选择应用】按钮,即可打开文件资源管理器。选择需要拉起的应用,即可在后面的label中显示绝对路径。然后在【添加命令行参数】区域下方添加已注册好的命令以及期望值(这个命令行参数将会在后面介绍)。
2、然后点击右上区域的【拉起进程】按钮,然后会在【日志输出】区域输出拉起成功与否的日志说明和PID号等。最后可以通过【杀死进程】来结束该进程。

效果图

在这里插入图片描述

核心代码

控件对象

【添加命令行参数】区域的控件对象为:textEdit
【日志输出】区域的控件对象为:textEdit_2
【选择应用】按钮的控件对象为:pushButton
【拉起进程】按钮的控件对象为:pushButton_3
【杀死进程】按钮的控件对象为:pushButton_2

header file(头文件)

#include <QFileDialog>
#include <QProcess>

member variable(成员变量)

QProcess* m_Process;

【选择应用】按钮的槽函数

void MainWindow::on_pushButton_clicked()
{
    QString fileName = QFileDialog::getOpenFileName(this,"选择应用程序","./","Txt files(*.exe)");

    ui->lineEdit->setText(fileName);
}

【拉起进程】按钮的槽函数

void MainWindow::on_pushButton_3_clicked()
{
    if(nullptr != m_Process)
    {
        m_Process->close();
        delete m_Process;
        m_Process = nullptr;
        ui->textEdit_2->append(QString("杀死已存在的进程!"));
    }

    m_Process = new QProcess(this);

    QString fileName = ui->lineEdit->text();
    QStringList args = ui->textEdit->toPlainText().split("\n");

    m_Process->start(fileName, args);

    if(m_Process->waitForStarted(3000))
    {
        qint64 PID =m_Process->processId();
        ui->textEdit_2->append(QString("进程拉起成功!PID = %1").arg(PID));
    }
    else
    {
        ui->textEdit_2->append(QString("error:进程拉起失败!"));
    }

}

【杀死进程】按钮的槽函数

void MainWindow::on_pushButton_2_clicked()
{
    if(nullptr != m_Process)
    {
        m_Process->close();
        ui->textEdit_2->append(QString("进程杀死成功!"));
    }
}

UI布局

在这里插入图片描述

组织架构

在这里插入图片描述

测试效果

在这里插入图片描述

Qt解析命令行参数

Qt可以通过QCommandLineParserQCommandLineOption类可以对命令行进行解析。

命令说明

 * 单字符的命令通常以“-” 开头:-h
 * 多字符的命令通常以“--”开头:--help
 * 注意 :通常情况下 -abc 会被等同于 -a;-b;-c
 * 命令后面还可以附带值 例如 -h=45454

增加命令

    QCommandLineParser parser;

    /*
     *对于有期望值的命令 需要设置Value(setValue) 否则会报错
     */
    QList<QCommandLineOption> ops;

    // 带有期望值的open命令
    QCommandLineOption op("open");
    op.setValueName("string");


    // 带有期望值的h命令
    QCommandLineOption op2("h");
    op2.setValueName("double");

    /*
     *  这里需要添加所有的命令  类似于注册效果
     */
    ops << op << op2;
    parser.addOptions(ops);

    // 处理用户给出的实际命令
    parser.process(a);

解析命令

    // 解析注册过的命令
    if(parser.isSet(op))
    {
        parser.value(op);
    }

设计一个后台进程的程序

组织架构

在这里插入图片描述

核心代码

#include <QCoreApplication>

#include <QCommandLineParser>

#include <QFile>
#include <string>
#include <QDebug>

#include <iostream>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    /*
     * 单字符的命令通常以“-” 开头:-h
     * 多字符的命令通常以“--”开头:--help
     *
     * 注意 :通常情况下 -abc 会被等同于 -a;-b;-c
     */

    QCommandLineParser parser;

    /*
     *对于有期望值的命令 需要设置Value(setValue) 否则会报错
     */
    QList<QCommandLineOption> ops;

    // 带有期望值的open命令
    QCommandLineOption op("open");
    op.setValueName("string");


    // 带有期望值的h命令
    QCommandLineOption op2("h");
    op2.setValueName("double");

    /*
     *  这里需要添加所有的命令  类似于注册效果
     */
    ops << op << op2;
    parser.addOptions(ops);

    // 处理用户给出的实际命令
    parser.process(a);

    QFile file("e://1.txt");
    file.open(QIODevice::Append);
    if(!file.isOpen())
    {
        exit(EXIT_FAILURE);
    }

    // 解析注册过的命令
    if(parser.isSet(op))
    {
        std::string log = "open:" + parser.value(op).toStdString() + "\n";
        file.write(log.c_str());
        std::cout << log;//<< std::endl;
    }
    if(parser.isSet(op2))
    {
        std::string log = "h:" + parser.value(op2).toStdString() + "\n";
        file.write(log.c_str());
        std::cout << log;//<< std::endl;
    }
    file.close();
    return a.exec();
}

通过Cmd进行测试命令行参数

在这里插入图片描述

文件输出

在这里插入图片描述

后续

这时其实还不能完整调用,因为部分环境还没有。所以还需要对这个程序进行打包发布。后续将会介绍Qt自带的打包工具。本文内容太多了,就下一篇文中介绍吧。

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

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

相关文章

java比较器

一、说明: Java中的对象&#xff0c;正常情况下&#xff0c;只能进行比较: 或 ! 。不能使用 >或 如何实现? 使用两个接口中的任何一个: Comparable 或 Comparator 二、Comparable的使用(自然排序) 1.Comparable接口的使用举例: 1.像string、包装类等实现了Comparable接口…

智能优化算法:协作搜索算法-附代码

智能优化算法&#xff1a;协作搜索算法 摘要&#xff1a;协作搜索算法( Cooperation search algorithm &#xff0c;CSA)是 Zhong-kai Feng等 于 2021 年提出的一种新型元启发式优化算法 。 该算法受现代企业团队协作行为的启发&#xff0c;具有寻优能力强&#xff0c;收敛速度…

Seata-AT模式数据源代理-JDBC中的关键知识点

背景 Seata 对业务无侵入是通过数据源代理实现的&#xff0c;从下图中可看出&#xff0c;数据源代理的实现涉及到 DataSource、Connection 以及 Statement&#xff0c;这几个关键知识属于 JDBC 的范畴&#xff0c;所以本篇从 JDBC 的视角对他们进行介绍。 一、JDBC 概述 JDBC…

【算法】面试题 - 回溯算法解题套路框架

回溯算法解题套路框架前言回溯算法的框架排列&#xff08;元素无重不可复选&#xff09;46. 全排列解析子集&#xff08;元素无重不可复选&#xff09;78. 子集解析组合&#xff08;元素无重不可复选&#xff09;77. 组合解析子集/组合&#xff08;元素可重不可复选&#xff09…

免费PDF转Word?有这几个网站就够了

如果您想使用 Word 文档&#xff0c;您可能需要将PDF 转换为 Word&#xff0c;以便您可以随意使用该文档。将 PDF 转换为 Word 的过程需要一个好的 PDF 转换器。在本文中&#xff0c;您将探索可用的 5个免费转换器&#xff0c;其中包括 奇客PDF 和PDF2Go。 最好的 6 个 PDF 转 …

【unity笔记】图解Vector3.SignedAngle()方法的返回值

首先看一下官方文档的说明&#xff1a; public static float SignedAngle (Vector3 from, Vector3 to, Vector3 axis); from测量角度差的源向量。to测量角度差的目标向量。axis一个向量&#xff0c;其他向量将绕其旋转。返回 from 与 to 之间的有符号角度&#xff08;以度为单…

CodeQL 源代码漏洞扫描

目录 1、下载配置 codeql 1.1 配置 codeql 1.2 配置 maven 2、测试 codeql 漏洞检测 2.1 构建 codeql 查询数据库 2.2 漏洞检测 测试环境&#xff1a;centos7 jdk11 maven 1、下载配置 codeql 1.1 配置 codeql 下载安装 codeql-cli: https://github.com/github/code…

大数据系列——什么是Flink?Flink有什么用途?

目录 一、基本概念 批与流 数据可以作为无界流或有界流处理 二、什么是Flink&#xff1f; 三、Flink有什么用途&#xff1f; 四、适用场景 五、flink事件驱动 六、flink拥有分层API flink sql 七、fllink企业级使用 一、基本概念 批与流 批处理的特点是有界、持久、大…

被误认为是外国人开发的4款软件,功能强大到离谱,且用且珍惜

国外的月亮不一定比国内圆&#xff0c;随着国内互联网飞速发展&#xff0c;国内研发出许多实用又良心的软件&#xff0c;由于偏见&#xff0c;功能强大的它们却被误认为是外国佬研发的。 1、Foxit PDF用系统自带的Adobe实在难用&#xff0c;Foxit这款PDF阅读器实在太强大&#…

unity使用RenderTexture可以渲染粒子特效

一&#xff0c;使用UIRawImage,创建材质球&#xff0c;把Shader给材质球&#xff0c;放到RawImage的Material上&#xff0c; // Upgrade NOTE: replaced mul(UNITY_MATRIX_MVP,*) with UnityObjectToClipPos(*)Shader "UI/Default No-Alpha" {Properties{[PerRende…

基于文本和图像的网络舆情分析方法研究

基于文本和图像的网络舆情分析方法研究 一、舆情分析技术 &#xff08;1&#xff09;舆情数据采集与提取技术&#xff1b; &#xff08;2&#xff09;自动文摘技术&#xff1b; &#xff08;3&#xff09;事件发现与追踪技术&#xff1b; &#xff08;4&#xff09;舆情情感分…

【虚幻引擎UE】UE5 模型描边的三个方法

一、后期处理法 1、创建描边材质&#xff0c;方法很多种&#xff0c;主要有设置深度、法线描边等 可以参考现有文章制作或直接下载材质资源使用。 参考文章&#xff1a; 1、【UE4】几种后处理描边的方法&#xff0c;效果及效率 2、UE4之物体描边 3、【UE4_001】后期处理轮廓…

第002课 - 项目整体效果展示

文章目录 基础篇高级篇流量控制:alibaba sentinel注册中心链路追踪高可用集群篇CICD这个章节是进行项目效果的演示。 基础篇 第一个就是基础篇。 这是我们的后台管理系统。 围绕电商的管理系统做一个整套的增删改查逻辑。 这个商品系统都会教给大家来编写的。 这个是使用前…

网站报错:PHP Fatal error: Allowed memory size of 134217728 bytes exhausted的处理方法

原因分析 内存已耗尽&#xff0c;这关系到PHP的memory_limit的设置问题&#xff0c;根据自己的需要及参考本机的内存大小修改php内存限制。 解决方案 1、修改php.ini &#xff08;改配置&#xff09; memory_limit 128 这种方法需要重启服务器&#xff0c;很显然&#xff0c…

向Linux内核添加驱动的步骤详解

1、获取驱动源码 (1)驱动源码一般都是从设备厂商处获取&#xff1b; (2)设备厂商给的驱动源码大体上是没有问题的&#xff0c;能加载但是效果不一定好&#xff0c;需要根据自己的板子进行适配&#xff1b; 2、驱动在内核中的两种形式 (1)直接编译进内核&#xff1a;内核启动时自…

ubuntu下编译opencv

目录 1. 下载opencv和opencv-contrib 2. 安装依赖 3. cmake 4. make 5. 安装 6. 配置opencv的路径 7. 测试 后续 1. 下载opencv和opencv-contrib https://github.com/opencv/opencv/archive/refs/tags/4.6.0.zip https://github.com/opencv/opencv_contrib/archive/re…

python两种方式实现读写航拍影像JPG图片的GPS坐标

写入坐标效果 读取坐标效果 1、写入JPG坐标数据 1.1、准备数据 gps坐标文件 图片 可以查看它的属性中目前并没有坐标信息 1.2、执行脚本 第一种方法(piexif) writegps2jpg_piexif.py import csv,os import

KubeEdge云原生边缘计算公开课04——云原生边缘计算学术研究现状与趋势

KubeEdge云原生边缘计算公开课04——云原生边缘计算学术研究现状与趋势Ding Yin & 徐飞&#xff1a;KubeEdge架构与技术解读1. 边缘计算的形态定义与关键挑战2. 云原生边缘计算的优势与挑战3. KubeEdge核心架构4. KubeEdge关键技术5. KubeEdge社区介绍Ding Yin & 徐飞&…

JavaSE笔记——流式编程

文章目录前言一、从外部迭代到内部迭代二、实现机制三、常用的流操作1.collect(toList())2.map3.filter4.flatMap5.max和min6.reduce四、多次调用流操作五、高阶函数总结前言 流是一系列与特定存储机制无关的元素——实际上&#xff0c;流并没有 “存储” 之说。利用流&#x…

火山引擎 DataTester:如何做 A/B 实验的假设检验作者:字节跳动数据平台

A/B 实验的核心统计学理论是&#xff08;双样本&#xff09;假设检验&#xff0c;是用来判断样本与样本、样本与总体的差异是由 抽样误差 引起还是 本质差别 造成的一种统计推断方法。 假设检验&#xff0c;顾名思义&#xff0c;是一种对自己做出的假设进行数据验证的过程。通…