当前位置: 首页 > news >正文

【QT代码控制Linux开发板】QT控制嵌入式Linux开发板运行shell脚本

一. 前言

最近遇到了一个很冲突的问题,我想让比如qt代码控制传感器读取的数值大于某个阈值时控制板子的灯亮进行报警。

但是当我在Linux开发板上./运行交叉编译后的qt文件时,想运行开发板的其他shell语句必须先退出qt代码的执行,当然开发板是支持多线程的一种方法就是

./your_qt_application & ./your_script.sh &

但是以上这个情况只能同时运行这两个文件,不能等待某个”时机“运行shell语言,这就很不方便。有没有一种方法可以实现我把想执行的shell脚本语言(或功能)融合进qt代码,当qt代码运行到相应位置时也会同时执行shell脚本?

答案是当然有,而且相当方便嘞!QProcess闪亮登场!

可不敢小瞧它,它可是进程之间通信的利器!具体的用法我就不赘述啦,参考下面两篇文章,讲得很清楚(比笔者专业多了)。

https://blog.csdn.net/lizhong2008/article/details/136840521

https://blog.csdn.net/MrHHHHHH/article/details/135490531

二. 上代码

我就直接上例子了,主要解决的问题就是我开头提到的当传感器超过某个阈值时,进行报警的功能。

(1)首先就是在mainwindow.cpp代码中包含QProcess类

#include <QProcess>

(2)第二步就是创建对象同时在mainwindow.h进行QProcess初始化

QProcess *process; // QProcess对象指针

(3)第三步是直接调用函数,注意我这里是直接调用静态函数execute,所以可以直接调用而无需创建QProcess对象,

else if (risk_level >= 0.6 && risk_level < 0.8) {riskText = "中度风险";color = "orange";QProcess::execute("/bin/sh", QStringList() << "/home/set_led.sh");//ledScriptExecuted = true;  // 标记脚本已执行}

QProcess::execute会在调用时阻塞当前的线程,直到进程完成。也就是说,程序会等待Shell脚本执行完毕后再继续执行后面的代码。

/bin/sh是Unix系统上一个通用的Shell(通常是Bourne Shell或与之兼容的Shell),可以用来执行Shell脚本或直接输入的命令。

同理如果要运行Python脚本

QProcess::execute("python3", QStringList() << "/home/demo.py");

三. 注意事项

(1)因为是采用的静态的execute函数,如果你的脚本代码比较复杂运行时间较长可能会使qt代码界面无响应哦(可以考虑使用QProcess的异步方式来执行脚本),所以比较适用于脚本语言简单,对qt代码实时性要求不高的情况下。下面给出异步方式的示例代码,具体情况需要具体分析。

// 在头文件中包含 QProcess 头文件
#include <QProcess>// 在需要执行脚本的地方创建 QProcess 对象
QProcess *process = new QProcess(this);// 连接信号槽来处理进程结束后的操作(可选)
connect(process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),this, [](int exitCode, QProcess::ExitStatus exitStatus){qDebug() << "Process finished with exit code:" << exitCode;});// 启动 Python3 脚本,使用异步方式
process->start("python3", QStringList() << "/home/demo.py");// 检查进程是否启动成功
if (!process->waitForStarted()) {qDebug() << "Failed to start process";
}

以上程序可以实现qt程序继续执行,不必等待脚本进程的执行结果。

(2)使用QProcess前提下是保证想要运行的脚本有可执行权限(特别是/目录下的文件,往往需要手动赋予可执行权限)

首先查看文件权限

ls -l /home/set_led.sh

如果没有可执行权限修改权限

chmod +x /home/set_led.sh

以上就是这个问题的全部内容啦,不得不说QT的水是真的深,年少不知QT好,还有很多其他的功能有待学习与应用。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 证书学习(二)搞懂 keystore、jks、p12、pfx、crt、csr、pem文件的区别
  • ResNet网络学习
  • 幂等性是什么意思?
  • 基于Shader实现的UGUI描边解决方案遇到的bug
  • UE基础 —— 打包项目
  • leetcode47. 全排列 II有重复元素的全排列,深度优先搜索
  • 【022】字符串的处理(输出,分割,删除,新增,替换,查找,长度)_#VBA
  • c++11异常
  • Linux驱动入门实验班——DHT11、DS18B20模块驱动(附百问网视频链接)
  • 如何在 Android 智能手机上恢复已删除的图片
  • C++前向声明简介
  • 【Dash】Dash中@callback() 回调函数的Output() 参数
  • 【OpenCV】SIFT(尺度不变特征变换)算法?
  • [000-01-022].第03节:RabbitMQ环境搭建
  • RPC 运行时,第二次:发现新的漏洞
  • 【译】理解JavaScript:new 关键字
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • Android单元测试 - 几个重要问题
  • Android开源项目规范总结
  • Android优雅地处理按钮重复点击
  • Angular6错误 Service: No provider for Renderer2
  • input的行数自动增减
  • iOS 系统授权开发
  • Javascripit类型转换比较那点事儿,双等号(==)
  • JAVA并发编程--1.基础概念
  • js算法-归并排序(merge_sort)
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • MySQL的数据类型
  • opencv python Meanshift 和 Camshift
  • vue总结
  • Web Storage相关
  • 诡异!React stopPropagation失灵
  • 区块链共识机制优缺点对比都是什么
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 设计模式(12)迭代器模式(讲解+应用)
  • Linux权限管理(week1_day5)--技术流ken
  • puppet连载22:define用法
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #14vue3生成表单并跳转到外部地址的方式
  • #ifdef 的技巧用法
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (六)Hibernate的二级缓存
  • (转)创业的注意事项
  • (转)四层和七层负载均衡的区别
  • (轉貼) UML中文FAQ (OO) (UML)
  • .NET单元测试使用AutoFixture按需填充的方法总结
  • @EnableConfigurationProperties注解使用
  • @Transactional 详解
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • [3300万人的聊天室] 作为产品的上游公司该如何?
  • [AIGC] 如何建立和优化你的工作流?
  • [Android]使用Retrofit进行网络请求