一. 前言
最近遇到了一个很冲突的问题,我想让比如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好,还有很多其他的功能有待学习与应用。