Qt之QProcess(一)运行cmd命令

2023-11-02

Qt提供了QProcess类,QProcess可用于完毕启动外部程序,并与之交互通信。

一、启动外部程序的两种方式:
(1)一体式:void QProcess::start(const QString & program, const QStringList & arguments, OpenMode mode = ReadWrite)
外部程序启动后。将随主程序的退出而退出。
(2)分离式:void QProcess::startDetached(const QString & program, const QStringList & arguments, const QString & workingDirectory = QString(), qint64 * pid = 0)
外部程序启动后,当主程序退出时并不退出。而是继续执行。

值得注意的是。当程序路径中含有空格的时候,仅设置程序路径program是无法被识别的。解决方法是再将程序路径传递给arguments。

比如:

//1-不带空格。能够启动
process->start("F:/AppInst/115/115com/115com.exe");

//2-带空格,无法启动
process->start("C:/Program Files/HaoZip/HaoZip.exe");

//3-带空格,使用带參模式。能够启动
process->start("C:/Program Files/HaoZip/HaoZip.exe", QStringList("C:/Program Files/HaoZip/HaoZip.exe"));

二、启动之前须要做的工作:
To start a process, pass the name and command line arguments of the program you want to run as arguments to start(). Arguments are supplied as individual strings in a QStringList.
启动一个外部程序,须要传递外部程序的路径和运行參数。參数用QStringList来带入。

(1)设置路径: void QProcess::setProgram(const QString & program)
(2)设置參数[可选]: void QProcess:: setArguments(const QStringList &
arguments)
(3)启动: void QProcess::start(OpenMode mode =
ReadWrite)

Qt运行cmd命令
界面上添加一个button,一个textedit,一个lineedit

void MainWindow::on_pushButton_clicked()
{
    ui->textEdit->clear();
    QProcess process(this);
    process.setProgram("cmd");
    QStringList argument;
    argument<<"/c"<<ui->lineEdit->text();
    process.setArguments(argument);
    process.start();
    process.waitForStarted(); //等待程序启动
    process.waitForFinished();//等待程序关闭
    QString temp=QString::fromLocal8Bit(process.readAllStandardOutput()); //程序输出信息
    ui->textEdit->setText(temp);
}

注意:直接Process.start(“cmd.exe”)跳不出cmd界面
Process.start(“regedit.exe”)能跳出注册表界面

知识点

  • QProcess进程的使用
    • process.start( 程序,参数指令 )
    • process.waitForStarted()
    • process.waitForFinished()
    • process.close()
  • cmd指令的使用
    • cmd /c 指令

功能

  • 运行选择的程序
  • 获取选择程序的pid
  • 通过taskkill关闭程序进程

开启程序

void MainWindow::on_pushButton_2_clicked()
{

QString file = QFileDialog::getOpenFileName(this,"select exe",QDir::homePath(),"(*.exe)");
qDebug()<<file;
QStringList arguments;
arguments<< "/c" << file;
QProcess cmd(this);
cmd.start("cmd.exe",arguments);
cmd.waitForStarted();
cmd.waitForFinished();
}

获取pid

void MainWindow::on_byngetpid_clicked()
{

//获取pid
QProcess cmd(this);
QStringList arguments;
arguments<< "/c" << "tasklist|findstr" << ui->labexe->text();
cmd.start("cmd.exe",arguments);//这种方式最好,使用cmd程序,运行命令
cmd.waitForStarted();//必须加waitForStarted
cmd.waitForFinished();
// QString temp=QString::fromLocal8Bit(cmd.readAllStandardOutput());//fromLocal8Bit()函数可以设置编码。处理中文等字符问题
QString temp = cmd.readAll();
qDebug()<<temp;
QStringList templist = temp.split(QRegExp("\\s+"));
//正则表达式'\s+'表示查询除去字符间所有空白后的单词,'\s'只除去单个空白
// for(auto i:templist) qDebug()<<i;
//"geany.exe" "1100" "Console" "1" "34,968" "K" ""
QString PID = templist.at(1);
ui->labpid->setText(PID);
}

杀死进程

void MainWindow::on_pushButton_clicked()
{

QStringList arguments;
arguments<< "/c" << "taskkill" << "/PID" << ui->labpid->text();
QProcess cmd(this);
cmd.start("cmd.exe",arguments);
cmd.waitForStarted();
cmd.waitForFinished();
}

界面:

整理后代码:

将执行代码整合进ExeCmd函数

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QProcess>
#include <QDebug>
#include <QFileDialog>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{

ui->setupUi(this);
}
MainWindow::~MainWindow()
{

delete ui;
}
QStringList MainWindow::ExeCmd(QStringList arguments,bool returnflag)
{

QProcess cmd(this);
cmd.start("cmd.exe",arguments);//这种方式最好,使用cmd程序,运行命令
cmd.waitForStarted();//必须加waitForStarted
cmd.waitForFinished();
if(returnflag == false) {
cmd.close();return QStringList();}
// QString temp=QString::fromLocal8Bit(cmd.readAllStandardOutput());//fromLocal8Bit()函数可以设置编码。处理中文等字符问题
QString temp = cmd.readAll();
QStringList templist = temp.split(QRegExp("\\s+"));//正则表达式'\s+'表示查询除去字符间所有空白后的单词,'\s'只除去单个空白
cmd.close();
return templist;
}
void MainWindow::on_byngetpid_clicked()
{

//获取pid
QStringList arguments;
arguments<< "/c" << "tasklist|findstr" << ui->labexe->text();
QStringList templist = ExeCmd(arguments,true);
// for(auto i:templist) qDebug()<<i;
//"geany.exe" "1100" "Console" "1" "34,968" "K" ""
QString PID = templist.at(1);
ui->labpid->setText(PID);
}
void MainWindow::on_pushButton_clicked()
{

QStringList arguments;
arguments<< "/c" << "taskkill" << "/PID" << ui->labpid->text();
ExeCmd(arguments);
arguments.clear();
arguments<< "/c" << "tasklist|findstr" << ui->labexe->text();
QStringList templist = ExeCmd(arguments,true);
//templist=="",内容长度为 1
if(templist.size()==1)qDebug("kill pid success");
}
void MainWindow::on_pushButton_2_clicked()
{

QString file = QFileDialog::getOpenFileName(this,"select exe",QDir::homePath(),"(*.exe)");
//截取执行的程序名称,找到最后一个'/',得到带.exe的程序名,这里使用section来分段
QString exename = file.section('/',-1,-1);
ui->labexe->setText(exename);
QStringList arguments;
arguments<< "/c" << file;
ExeCmd(arguments);
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt之QProcess(一)运行cmd命令 的相关文章

  • 在 Windows 上以 QML 播放 RTSP 视频

    我正在尝试将 QML 中的 RTSP 流播放到视频标签中 如下所示 Repeater model 8 Video Layout fillWidth true Layout fillHeight true fillMode VideoOutp
  • MSVC C4100:“应用程序”:未引用的形式参数警告

    使用 MSVC 编译时 以下代码会生成 C4100 警告 这怎么可能 显然引用了 应用程序 class ApplicationInfo public QObject Q OBJECT public static void initializ
  • qt 如何知道按钮被点击?

    我正在尝试编写一个程序 用声音进行一些操作 我的问题是我有 3 个播放按钮和 3 个标签 我希望无论我单击 播放 按钮 都应该播放按钮附近标签中名称的声音 我有一个没有任何参数的播放插槽 那么 如何分别连接到每个播放按钮和每个标签呢 实际上
  • QGraphicsSimpleTextItem“无效使用不完整类型”

    我的代码如下 指针部件 h QGraphicsSimpleTextItem text 指针控件 cpp void PointerWidget placeNumbers float spacing int currentTickNumber
  • qvariant 作为 qhash 中的键

    我想创建一个带有 QVariants 键的数据结构 它看起来像这样 QHash
  • 在 QML 中控制纹理 3D 对象的不透明度

    我对 QML 中的 Qt 3D 有点陌生 我正在尝试控制 Qt 3D 的不透明度textured3D 对象 我正在使用简单qml3d https github com tripolskypetr simpleqml3d测试项目来做到这一点
  • Qt - QProcess 不工作

    我尝试启动 Internet Explorer 所以我使用下面的代码 QProcess process new QProcess this QString temp C Program Files Internet Explorer iex
  • Qt - 意外的 GDB 退出

    我正在尝试开发一个应用程序 该应用程序创建图像并使用双线性插值填充颜色像素 然后显示它 到目前为止我的代码如下 include
  • Qt QML MenuItem iconSource不显示

    我有一个非常简单的设置只是为了说明问题 import QtQuick Controls 1 4 import QtQuick Window 2 2 ApplicationWindow visible true width 640 heigh
  • QtWebEngine Quicknano 在嵌入式 Linux 中没有声音

    我已将 QtWebEngine 编译到我的 i MX6 嵌入式设备中 当我尝试使用 Quicknanobrowser 播放 YouTube 视频时 视频会播放 但没有声音 事实上 当我尝试播放音频文件时没有声音hpr dogphilosop
  • QWebView等待加载

    bool MainWindow waitForLoad QWebView view QEventLoop loopLoad QTimer timer QObject connect view SIGNAL loadFinished bool
  • QGraphicsView 在完整布局中未最大化

    I have following GUI having four QGraphicView objects 正如您在每个视图下看到的那样 它有四个工具按钮 为了最大化视图 我连接了工具按钮的信号来隐藏其他三个视图的插槽 并将大小策略设置为扩
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 在 Qt 中用像素图画笔画一条线?

    一段时间以来 我正在使用 Qt C 开发一个简单的绘图和绘画应用程序 目前我正在使用 QPainter drawLine 进行绘制 并且工作正常 我想做的是用像素图画笔绘图 这是我可以做到的 我可以使用 QPainterPath 和 QPa
  • PyQt QFileDialog exec_ 很慢

    我正在使用自定义QFileDialog因为我想选择多个目录 但是exec 功能非常慢 我不明白为什么 我正在使用最新版本的 PyQt 代码片段 from PyQt4 import QtGui QtCore QtNetwork uic cla
  • 在未安装 Qt VS Tools 的情况下以 Qt/MsBuild 格式编译 Qt 项目

    我在 Visual Studio 中有很多 Qt 项目 使用新的 Qt MsBuild 格式 https blog qt io blog 2018 02 16 qt visual studio improving performance 由
  • 派生类在 PySide (Qt/PyQt) 中的错误线程中接收信号

    我在让派生类在 PySide 中正确接收信号时遇到问题 我在主 GUI 或命令行应用程序 线程的两个单独线程上使用发送器和接收器 线程是 QThread 对象 发送器和接收器在创建后立即使用 QObject moveToThread 移动到
  • 右键单击 QPushButton 上的 contextMenu

    对于我的应用程序 我在 Qt Designer 中创建了一个 GUI 并将其转换为 python 2 6 代码 关于一些QPushButton 与设计器创建 我想添加右键单击上下文菜单 菜单选项取决于应用程序状态 如何实现这样的上下文菜单
  • 第一个随机数始终小于其余随机数

    我碰巧注意到 在 C 中 使用 std rand 方法调用的第一个随机数大多数时候都明显小于第二个随机数 关于 Qt 实现 第一个几乎总是小几个数量级 qsrand QTime currentTime msec qDebug lt lt q
  • 如何从浮点数组创建新的 QImage

    我有一个代表图像的浮点数数组 列在前 我想在 QGraphicsSecene 上将图像显示为 QPixmap 为了做到这一点 我尝试使用 QImage 构造函数 QImage const uchar data int width int h

随机推荐

  • Git上传文件不能超过100M 解决方案

    文件上传git仓库时 文件限制大小解决方案 上传项目到Git上 当某个文件大小超过100M时 就会上传失败 因为默认的限制了上传文件大小不能超过100M 如果需要上传超过100M的文件 就需要我们自己去修改配置 首先 打开终端 进入项目所在
  • 【华为OD机试真题 JAVA】计算堆栈中的剩余数字

    JS版 华为OD机试真题 JS 计算堆栈中的剩余数字 标题 计算堆栈中的剩余数字 时间限制 1秒 内存限制 32768K 语言限制 不限 向一个空栈中依次存入正整数 假设入栈元素n 1 lt n lt 2 31 1 按顺序依次为nx n4
  • 图像边缘检测——一阶微分算子 Roberts、Sobel、Prewitt、Kirsch、Robinson

    图像为什么会有边缘 图像边缘一般指图像的灰度变化率最大的位置 成因主要如下 1 图像灰度在表面方向变化不连续 2 图像中物体在空间上的深度不一致 3 在光滑的表面上颜色不一致 4 图像中物体的光影 所以边缘检测指的是从图像中检测边缘点和边缘
  • ubuntu 16.04 安装 CUDA9.0 和 cuDNN7

    文章目录 ubuntu 16 04 安装 CUDA9 0 和 cuDNN7 1 英伟达驱动安装 1 1 方法一 ubuntu 系统自动安装 我只用过这个方法 1 2 方法二 命令行 1 3 查看是否安装成功 2 CUDA 2 1 下载 CU
  • Python机器视觉--OpenCV入门--机器视觉与OpencCV用途简介

    1 机器视觉介绍 现在说的机器视觉 Machine Vision 一般指计算机视觉 Computer Vision 简单来说就是研究如何使机器看懂东西 就是是指用摄影机和电脑代替人眼对目标进行识别 跟踪和测量等机器视觉 并进一步做图形处理
  • 从Java到Go的过渡:实现服务器自动化运维

    目录 Go语言基础 自动化运维 从Java到Go的过渡 在今天的博客中 我们将探讨如何使用Go语言进行服务器自动化运维 例如Ansible和Puppet 作为一名Java开发者 这是一个极好的机会来学习和理解Go语言 并开始你的Go语言开发
  • 华为OD机试 - 告警抑制(C & Python)

    题目描述 告警抑制 是指高优先级抑制低优先级告警的规则 高优先级告警产生后 低优先级告警不再产生 请根据原始告警列表和告警抑制关系 给出实际产生的告警列表 注意 1 不会出现循环抑制的情况 2 告警不会传递 比如 A gt B B gt C
  • 浅谈JDBC,JDBC实现的几大步骤

    前言 当我们学完数据库之后总觉得数据库和java之间是没有联系的 但是我们还是要去学数据库是为了什么呐 现在就来了 现在我就来给大家讲讲怎么将数据库和java进行联系 我们也可以用数据库代替以前的IO流来存东西了 JDBC 概述 JDBC
  • day04-数组

    1 数组 1 1什么是数组 理解 数组就是存储数据长度固定的容器 存储多个数据的数据类型要一致 1 2数组定义格式 记忆 1 2 1第一种 数据类型 数组名 示例 int arr double arr char arr 1 2 2第二种 数
  • 【正点原子FPGA连载】 第三十一章 交通灯实验-摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0

    1 实验平台 正点原子领航者ZYNQ开发板 2 平台购买地址 https item taobao com item htm id 606160108761 3 全套实验源码 手册 视频下载地址 http www openedv com th
  • 【MySQL调优】如何进行MySQL调优?一篇文章就够了!

    导航 Java笔记 踩坑汇总 Java基础 进阶 JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud 黑马旅游 谷粒商城 学成在线 MySQL高级篇 设计模式 常见面试题 源码 目录 一 监控报警 二 排查慢SQ
  • C#9.0新特性

    运行环境 NET 5 0 vs2019 16 8版本以上 目标类型推导 在这之前我们创建一个对象 Point p new Point x y 9 0中 进行了优化 Point p new x y Point ps new 1 2 new 5
  • java多线程-对象及变量的并发访问

    synchronized同步方法 该关键字可用来保障原子性 可见性和有序性 方法内的变量为线程安全 多个线程的情况下 各个线程的变量为其私有 互不影响 实例变量非线程安全问题与解决方案 在被调用方法前加synchronized关键字上锁 同
  • 高质量程序设计指南C++ C 代码规范

    这里只是搬运作者对 匈牙利 命名规则做合理简化之后的命名规则 比较适合于 Windows应用程序的开发 建议1 类型名和函数名均以大写字母开头的单词组合而成 例如 class Node 类名 class LeafNode 类名 void D
  • 修改镜像源和修改PATH

    ls a 显示所有文件夹 这里就有我们需要的bashrc 修改path 和condarc 修改镜像 vim bashrc or condarc 打开文件 直接摁i进入修改模式 进行修改 修改完以后esc wq 确认保存退出就好了
  • qt opengl 2d纹理数组

    2d纹理数组就是用一个纹理数组类型的变量保存数个纹理 这样就避免了使用多个单个的纹理对象 这再批处理一系列相同大小的纹理时 非常有用 我这里用到的场景是在点精灵中使用纹理数组使得每个精灵纹理上不同的图案 我用的图片有16张 当顶点为16个时
  • 单片机c51 单一外中断的应用

    1 在51单片机的P1接口上有8只LED 在外部中断0输入引脚P3 2 INT0 引脚接有一只按钮开关K1 程序要求将外部中断0设置成负跳沿触发 程序启动时 P1口上的8只LED亮 按一次开关按钮K1 使引脚接地 产生一个负跳沿触发的外部中
  • python os.walk读取路径下文件名

    import os dir path C for root dirs files in os walk dir path for file in files print os path join root file if file len
  • android自定义view之地图(一)

    最近参加了一个比赛 要用到自己做一个自定义的小地图 所以在网上查找了一些关于自定义view的有关资料 也了解了自定义控件的初步知识 效果图 第一阶段我画了一个自制的网格图 点哪个网格就会哪个网格就会显示 工作环境图 代码介绍 1 我们都知道
  • Qt之QProcess(一)运行cmd命令

    Qt提供了QProcess类 QProcess可用于完毕启动外部程序 并与之交互通信 一 启动外部程序的两种方式 1 一体式 void QProcess start const QString program const QStringLi