qt-C++笔记之QProcess

2024-01-08 12:44
文章标签 c++ qt 笔记 qprocess

本文主要是介绍qt-C++笔记之QProcess,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

qt-C++笔记之QProcess

code review!

文章目录

  • qt-C++笔记之QProcess
    • 一.示例:QProcess来执行系统命令ls -l命令并打印出结果
      • 说明
    • 二.示例:QProcess来执行系统命令ls -l命令并打印出结果,代码进一步丰富
    • 三.示例:使用 QProcess 在 Qt 中执行 Bash 脚本并处理参数
    • 四.ChatGPT讲解
        • Including QProcess
        • Creating a QProcess Object
        • Starting a Process
        • Reading Output
        • Writing to the Process
        • Checking if the Process is Running
        • Waiting for the Process to Finish
        • Terminating the Process
        • Getting the Exit Status
        • Example Usage

请添加图片描述

一.示例:QProcess来执行系统命令ls -l命令并打印出结果

在这里插入图片描述
代码

#include <QCoreApplication>
#include <QProcess>
#include <QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);// 创建QProcess实例QProcess process;QString program_middle = "ls";QStringList middle_arguments;middle_arguments << "-l";// 启动进程执行命令process.start(program_middle, middle_arguments);// 等待进程结束process.waitForFinished();// 读取并打印进程的标准输出QByteArray result = process.readAllStandardOutput();qDebug() << result;return 0;
}

or

在这里插入图片描述

代码

#include <QCoreApplication>
#include <QProcess>
#include <QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);// 创建QProcess实例QProcess process;// 启动进程执行命令process.start("ls", QStringList() << "-l");// 等待进程结束process.waitForFinished();// 读取并打印进程的标准输出QByteArray result = process.readAllStandardOutput();qDebug() << result;return 0;
}

说明

这个简短的示例中:

  • 创建了QProcess对象。
  • 使用start方法执行了ls -l命令。
  • 使用waitForFinished方法等待命令执行完成(请注意,这会阻塞,直到外部命令执行完成)。
  • 读取了命令的标准输出,并使用qDebug打印到控制台。

此代码省略了错误处理和信号/槽连接,适用于简单的同步命令执行。如果你想要异步处理或更复杂的错误处理,你需要采用第一个例子中的更详细的方法。

二.示例:QProcess来执行系统命令ls -l命令并打印出结果,代码进一步丰富

代码应该具有清晰的命名,详细的注释,以及适当的输出信息。下面是修改后的示例:

在这里插入图片描述
代码

#include <QCoreApplication>
#include <QProcess>
#include <QDebug>int main(int argc, char *argv[]) {QCoreApplication app(argc, argv);// 设置要执行的命令QString listCommand = "ls";// 设置命令的参数,以列出/home目录的详细内容QStringList listArguments;listArguments << "-l" << "/home";// 创建一个QProcess对象来运行外部命令QProcess directoryLister;// 在控制台输出即将执行的命令和参数qDebug() << "Executing command:" << listCommand << "with arguments" << listArguments;// 使用指定的命令和参数启动外部进程directoryLister.start(listCommand, listArguments);// 等待进程完成,最多等待2000毫秒bool isFinished = directoryLister.waitForFinished(2000);// 检查进程是否在规定时间内完成if (isFinished) {// 如果完成,读取命令的标准输出QByteArray output = directoryLister.readAllStandardOutput();// 在控制台输出命令的结果qDebug() << "Directory listing for /home:\n" << output;} else {// 如果没有完成,输出超时消息qDebug() << "The process did not finish within the specified 2 seconds.";}// 获取并输出进程的退出码int exitCode = directoryLister.exitCode();qDebug() << "The process exited with code:" << exitCode;return 0;
}

在这个修改后的代码中:

  • 变量app代替了a,表示这是一个应用程序的实例。
  • 变量listCommandlistArguments直观地表示了将被执行的命令及其参数。
  • 对象directoryLister表示一个能够列出目录内容的进程。
  • 注释详细描述了代码的每一个部分,帮助理解每一行代码的作用。
  • 输出信息采用了更加清晰和教育性的语言,适合教科书风格。

三.示例:使用 QProcess 在 Qt 中执行 Bash 脚本并处理参数

1.运行
在这里插入图片描述

2.文件结构

在这里插入图片描述

3.cmd.sh

#!/bin/bash
# 这个脚本接受一个目录作为参数,并列出其内容DIR=$1if [ -z "$DIR" ]; thenecho "Usage: $0 <directory>"exit 1
fils $DIR

4.main.cpp
在这里插入图片描述

代码

#include <QCoreApplication>
#include <QDebug>
#include <QProcess>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);// 创建 QProcess 实例QProcess process;// 脚本文件的路径QString scriptPath = "/home/user/qt_cpp_test/qt_test/cmd.sh";// 获取目录参数QString directory = "/home/user/qt_cpp_test/qt_test";// 运行脚本并传递参数process.start(scriptPath, QStringList() << directory);// 等待进程结束if (!process.waitForFinished()) {qDebug() << "The process failed to finish.";return 1;}// 获取进程的输出QByteArray output = process.readAll();// 打印输出qDebug() << output;return a.exec();
}

5.qt_test.pro

QT += widgets core
TARGET = qt_test
TEMPLATE = app
SOURCES += main.cpp

四.ChatGPT讲解

QProcess is a class provided by the Qt framework to start external programs and communicate with them. It can be used to start, terminate, and communicate with external programs using standard input/output or through specific channels.

Here’s an overview of how you might use QProcess in a Qt application:

Including QProcess

Before using QProcess, you need to include the QProcess header:

#include <QProcess>
Creating a QProcess Object

You can create a QProcess object like any other object in Qt:

QProcess *process = new QProcess(parent);

The parent is a pointer to a parent QObject, which takes ownership of the QProcess object, ensuring that it will be deleted when the parent is.

Starting a Process

You can start a process by calling the start method, providing the command and arguments to run:

process->start("executable", QStringList() << "arg1" << "arg2");

Or if you just need to execute a command without arguments:

process->start("executable");
Reading Output

You can read the standard output and error of the process:

QObject::connect(process, &QProcess::readyReadStandardOutput, [=]() {QByteArray standardOutput = process->readAllStandardOutput();// Process standard output here
});QObject::connect(process, &QProcess::readyReadStandardError, [=]() {QByteArray standardError = process->readAllStandardError();// Process standard error here
});
Writing to the Process

You can write to the standard input of the process:

process->write("input data");
Checking if the Process is Running

You can check if the process is still running:

if (process->state() == QProcess::Running) {// Process is running
}
Waiting for the Process to Finish

You can wait synchronously for the process to finish:

process->waitForFinished(); // Waits until the process has finished
Terminating the Process

You can terminate the process:

process->terminate(); // Sends a terminate signal

Or kill the process:

process->kill(); // Kills the process immediately
Getting the Exit Status

Once the process has finished, you can get the exit status:

int exitCode = process->exitCode();
QProcess::ExitStatus exitStatus = process->exitStatus();
Example Usage

Here’s a simple example of using QProcess to run a command and print its output:

#include <QCoreApplication>
#include <QProcess>
#include <QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QProcess process;process.start("ls", QStringList() << "-l" << "/");if (!process.waitForStarted()) // Default timeout is 30 secondsreturn 1;if (!process.waitForFinished()) // Default timeout is 30 secondsreturn 2;qDebug() << process.readAllStandardOutput().trimmed();return a.exec();
}

This example runs the ls -l / command, which lists the contents of the root directory in a detailed format, then prints the output. Remember that the waitForStarted() and waitForFinished() methods are blocking calls; in a GUI application, you would typically connect the finished() signal to a slot to handle the process completion asynchronously.

这篇关于qt-C++笔记之QProcess的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/583497

相关文章

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝