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的端到端测试框架SeleniumBase使用解读

《Python的端到端测试框架SeleniumBase使用解读》:本文主要介绍Python的端到端测试框架SeleniumBase使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录SeleniumBase详细介绍及用法指南什么是 SeleniumBase?SeleniumBase

Qt 设置软件版本信息的实现

《Qt设置软件版本信息的实现》本文介绍了Qt项目中设置版本信息的三种常用方法,包括.pro文件和version.rc配置、CMakeLists.txt与version.h.in结合,具有一定的参考... 目录在运行程序期间设置版本信息可以参考VS在 QT 中设置软件版本信息的几种方法方法一:通过 .pro

Java继承映射的三种使用方法示例

《Java继承映射的三种使用方法示例》继承在Java中扮演着重要的角色,它允许我们创建一个类(子类),该类继承另一个类(父类)的所有属性和方法,:本文主要介绍Java继承映射的三种使用方法示例,需... 目录前言一、单表继承(Single Table Inheritance)1-1、原理1-2、使用方法1-

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

SpringBoot中使用Flux实现流式返回的方法小结

《SpringBoot中使用Flux实现流式返回的方法小结》文章介绍流式返回(StreamingResponse)在SpringBoot中通过Flux实现,优势包括提升用户体验、降低内存消耗、支持长连... 目录背景流式返回的核心概念与优势1. 提升用户体验2. 降低内存消耗3. 支持长连接与实时通信在Sp

Conda虚拟环境的复制和迁移的四种方法实现

《Conda虚拟环境的复制和迁移的四种方法实现》本文主要介绍了Conda虚拟环境的复制和迁移的四种方法实现,包括requirements.txt,environment.yml,conda-pack,... 目录在本机复制Conda虚拟环境相同操作系统之间复制环境方法一:requirements.txt方法

Nginx 重写与重定向配置方法

《Nginx重写与重定向配置方法》Nginx重写与重定向区别:重写修改路径(客户端无感知),重定向跳转新URL(客户端感知),try_files检查文件/目录存在性,return301直接返回永久重... 目录一.try_files指令二.return指令三.rewrite指令区分重写与重定向重写: 请求

MySQL 打开binlog日志的方法及注意事项

《MySQL打开binlog日志的方法及注意事项》本文给大家介绍MySQL打开binlog日志的方法及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、默认状态二、如何检查 binlog 状态三、如何开启 binlog3.1 临时开启(重启后失效)

python使用库爬取m3u8文件的示例

《python使用库爬取m3u8文件的示例》本文主要介绍了python使用库爬取m3u8文件的示例,可以使用requests、m3u8、ffmpeg等库,实现获取、解析、下载视频片段并合并等步骤,具有... 目录一、准备工作二、获取m3u8文件内容三、解析m3u8文件四、下载视频片段五、合并视频片段六、错误