Ubuntu下Qt使用QProcess执行shell脚本并实时输出的标准方法

2023-10-24 05:20

本文主要是介绍Ubuntu下Qt使用QProcess执行shell脚本并实时输出的标准方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Ubuntu下Qt使用QProcess执行shell脚本并实时输出的标准方法

Qt中执行终端命令和执行shell脚本文件是一个常见需求,一般可以在c++中直接调用system()实现执行终端命令,shell脚本同样也可以,但是会阻塞程序。实际上更推荐使用Qt中提供的QProcess,高度封装好的功能,拥有非阻塞的优点。

但是我在网上看了很多博客,内容大多数互相转载搬运甚至抄袭,如果跟着大多数博客去使用QProcess的话,分分钟踩坑和浪费时间调试。


常见踩坑,见到避开

很多方法都是教人这么用QProcess,基本会程序阻塞,而且得不到想要的输出结果。

 	QProcess process;process.start(bash);process.write("hello.sh");process.waitForFinished();		//或者用waitForStarted()函数QByteArray output = process.readAllStandardOutput();qDebug()<<output;ui->paintText->appendPlainText(output);

看到这种直接使用waitForFinished的或者waitForStarted函数的方法的,请及时避雷。

有的方法会使用lambda去写connect连接信号和槽,同样不好用,不是标准的使用方法。


QProcess标准使用方法就是老老实实连接信号与槽

想真正非阻塞地使用QProcess,老老实实按照连接信号与槽的方法去使用。下面介绍标准使用流程:

  1. 首先在MainWindow类里创建QProcess;
class MainWindow : public QMainWindow
{public:...private:QProcess* process;		//创建私有Qprocess变量,供MainWindow内部调用
}
  1. 并且记得在构造函数中new QPrcess;
MainWindow::MainWindow
{...process = new QProcess();...
}
  1. 在MainWindow中声明槽函数;
class MainWindow : public QMainWindow
{public:...public slots:void processOuptutSlot();private:...
}
  1. 实现槽函数(想要执行命令后有什么功能就在此实现);
void MainWindow::processOuptutSlot()
{//输出终端信息qDebug()<<process->readAllStandardOutput();
}
  1. 在构造函数中连接信号与槽
MainWindow::MainWindow
{...//readyReadStandardOutput是QProcess提供的信息,具体查阅QT助手QObject::connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(processOutputSlot()));...
}
  1. 使用QProcess然后触发readyReadStandardOutput信号
//通常在某个按钮的槽函数或者某个函数中调用process执行命令
{...process->start("bash");process->write("./home/hello.sh\n");	//使用sh脚本的路径,结尾必须加上\n,代表回车//或者尝试使用别的命令//prcess->write("ls\n");
}

只要命令有输出,就会不断激活readyReadStandardOutput信号(通常不止一次),然后执行槽函数输出信息,输出信息完结了就不会激活readyReadStandardOutput信号了。整个过程非阻塞

这篇关于Ubuntu下Qt使用QProcess执行shell脚本并实时输出的标准方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python依赖库的几种离线安装方法总结

《Python依赖库的几种离线安装方法总结》:本文主要介绍如何在Python中使用pip工具进行依赖库的安装和管理,包括如何导出和导入依赖包列表、如何下载和安装单个或多个库包及其依赖,以及如何指定... 目录前言一、如何copy一个python环境二、如何下载一个包及其依赖并安装三、如何导出requirem

Tomcat的下载安装与使用教程

《Tomcat的下载安装与使用教程》本文介绍了Tomcat的下载、安装和使用方法,包括在本机和云服务器上部署Tomcat的过程,以及解决启动失败问题的方法... 目录Tomcat的下载安装与使用Tomcat的下载与安装Tomcat在本机运行使用Tomcat在php云服务器上的使用总结Tomcat的下载安装与

通过Python脚本批量复制并规范命名视频文件

《通过Python脚本批量复制并规范命名视频文件》本文介绍了如何通过Python脚本批量复制并规范命名视频文件,实现自动补齐数字编号、保留原始文件、智能识别有效文件等功能,听过代码示例介绍的非常详细,... 目录一、问题场景:杂乱的视频文件名二、完整解决方案三、关键技术解析1. 智能路径处理2. 精准文件名

Python使用PIL库将PNG图片转换为ICO图标的示例代码

《Python使用PIL库将PNG图片转换为ICO图标的示例代码》在软件开发和网站设计中,ICO图标是一种常用的图像格式,特别适用于应用程序图标、网页收藏夹图标等场景,本文将介绍如何使用Python的... 目录引言准备工作代码解析实践操作结果展示结语引言在软件开发和网站设计中,ICO图标是一种常用的图像

C++ Primer 标准库vector示例详解

《C++Primer标准库vector示例详解》该文章主要介绍了C++标准库中的vector类型,包括其定义、初始化、成员函数以及常见操作,文章详细解释了如何使用vector来存储和操作对象集合,... 目录3.3标准库Vector定义和初始化vector对象通列表初始化vector对象创建指定数量的元素值

使用Java发送邮件到QQ邮箱的完整指南

《使用Java发送邮件到QQ邮箱的完整指南》在现代软件开发中,邮件发送功能是一个常见的需求,无论是用户注册验证、密码重置,还是系统通知,邮件都是一种重要的通信方式,本文将详细介绍如何使用Java编写程... 目录引言1. 准备工作1.1 获取QQ邮箱的SMTP授权码1.2 添加JavaMail依赖2. 实现

MyBatis与其使用方法示例详解

《MyBatis与其使用方法示例详解》MyBatis是一个支持自定义SQL的持久层框架,通过XML文件实现SQL配置和数据映射,简化了JDBC代码的编写,本文给大家介绍MyBatis与其使用方法讲解,... 目录ORM缺优分析MyBATisMyBatis的工作流程MyBatis的基本使用环境准备MyBati

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

使用Python实现表格字段智能去重

《使用Python实现表格字段智能去重》在数据分析和处理过程中,数据清洗是一个至关重要的步骤,其中字段去重是一个常见且关键的任务,下面我们看看如何使用Python进行表格字段智能去重吧... 目录一、引言二、数据重复问题的常见场景与影响三、python在数据清洗中的优势四、基于Python的表格字段智能去重

Spring AI集成DeepSeek实现流式输出的操作方法

《SpringAI集成DeepSeek实现流式输出的操作方法》本文介绍了如何在SpringBoot中使用Sse(Server-SentEvents)技术实现流式输出,后端使用SpringMVC中的S... 目录一、后端代码二、前端代码三、运行项目小天有话说题外话参考资料前面一篇文章我们实现了《Spring