【QT】 进程

目录

  • QT 多进程
    • 复习 Linux-C 多进程
    • QProcess 进程类
      • 常用方法
      • 简单示例
      • 信号与槽
      • 应用场景
  • 跨平台注意事项
    • 技巧:使用宏控制平台命令
  • QProcess 在嵌入式系统中的使用
      • 示例:调用 ALSA 播放音频
      • 示例:调用 arecord 录音
      • 示例:QProcess + Shell 脚本控制外设
      • 文件路径和权限注意事项

QT 多进程

复习 Linux-C 多进程

#include <sys/types.h> 
#include <unistd.h> //1.创建一个子进程 pid_t  pid = fork();if(pid == 0) //子进程 {//加载程序文件system("mplayer 1.avi");}//2.创建一个子进程   pid_t  pid = fork();if(pid == 0) //子进程 {//加载程序文件FILE *fp=popen("mplayer 1.avi","r+"); }

QProcess 进程类

Qt 提供 QProcess 作为 多进程管理 的主要类,用于 启动、监控、通信管理外部进程

QProcess的启动方式类似于Linux的fork+exec。但Qt 不直接支持 fork() + exec() 创建子进程,而是推荐使用 QProcess跨平台管理进程

常用方法

构造函数

//创建一个 未启动 的 QProcess 对象。
//需要调用 start() 或 startDetached() 启动进程。
QProcess();
//指定父对象,用于 Qt 资源管理(自动回收)。
//适用于 QWidget 界面程序,不需要手动 delete。
QProcess(QObject parent);
方法作用示例
start(program, args)启动进程(可传参数)process->start("ping", QStringList() << "www.baidu.com");
startDetached(program, args)后台运行进程QProcess::startDetached("notepad.exe");
kill()强制终止进程process->kill();
terminate()请求终止进程process->terminate();
waitForFinished(msecs)等待进程结束process->waitForFinished(5000);
readAllStandardOutput()读取标准输出(一次性读完全部)QString output = process->readAllStandardOutput();
read(qint64 maxSize)分块读取(同步读取)QByteArray output = process.read(100);
readAllStandardError()读取标准错误QString error = process->readAllStandardError();
write(data)向进程写入数据process->write("hello\n");
setWorkingDirectory(dir)设置进程工作目录process->setWorkingDirectory("/home/user");
state()获取进程状态if (process->state() == QProcess::Running) { ... }

QT 的进程的状态枚举值主要有三种

状态枚举值描述
NotRunningQProcess::NotRunning进程未运行(未启动或已退出)
StartingQProcess::Starting进程正在启动
RunningQProcess::Running进程正在运行

简单示例

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QProcess>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();private:Ui::MainWindow *ui;QProcess *process;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//创建一个未启动的进程对象process = new QProcess(this);
}MainWindow::~MainWindow()
{delete ui;
}//启动window记事本
void MainWindow::on_pushButton_clicked()
{process->start("notepad.exe");//启动记事本
}//关闭window记事本
void MainWindow::on_pushButton_2_clicked()
{process->kill();//强制终止线程process->waitForFinished();//等待进程结束qDebug() << "进程已停止";
}

在这里插入图片描述

适用场景

  • 启动本地应用(如浏览器、文本编辑器、终端等)。
  • 调用系统命令(如 pinglsdir)。

信号与槽

信号作用示例
started()进程启动后触发connect(process, &QProcess::started, this, &MyClass::onStarted);
finished(int exitCode, QProcess::ExitStatus status)进程结束后触发connect(process, &QProcess::finished, this, &MyClass::onFinished);
errorOccurred(QProcess::ProcessError error)进程错误connect(process, &QProcess::errorOccurred, this, &MyClass::onError);
readyReadStandardOutput()标准输出可读connect(process, &QProcess::readyReadStandardOutput, this, &MyClass::onReadOutput);

应用场景

【1】 远程服务器管理

场景:使用 Qt 应用远程 SSH 连接服务器,并执行命令。

QProcess *ssh = new QProcess(this);
ssh->start("ssh user@192.168.1.1");
ssh->write("ls -l\n");

<【2】调用 FFmpeg 进行视频处理

场景:通过 QProcess 运行 FFmpeg 命令行工具来处理视频文件。

QProcess *ffmpeg = new QProcess(this);
ffmpeg->start("ffmpeg", QStringList() << "-i" << "input.mp4" << "-vf" << "scale=1280:720" << "output.mp4");

【3】 Qt + Python 交互

场景:Qt 作为 GUI 前端,通过 QProcess 调用 Python 处理数据。

QProcess *pyProcess = new QProcess(this);
pyProcess->start("python", QStringList() << "script.py" << "arg1" << "arg2");

跨平台注意事项

Qt 本身是一套跨平台框架,可以在 Windows、Linux、macOS 等系统上编写一次、编译多平台运行。但当你使用 QProcess 调用系统命令或外部程序时,这部分就和平台密切相关了。

不同操作系统的终端命令不一样,路径也不一样:

操作系统命令风格常见路径文件后缀
Windowscmd.exe / PowerShellC:\Windows\System32.exe
LinuxBash / Shell/bin, /usr/bin
macOSBash / Zsh/usr/bin, /opt/homebrew/bin

为了提高跨平台的兼容性,此时我们可以使用 QT 提供的宏平台控制

技巧:使用宏控制平台命令

Qt 提供了一组宏判断编译平台,你可以这样使用:

#ifdef Q_OS_WIN
// Windows 平台命令
#elif defined(Q_OS_LINUX)
// Linux 平台命令
#elif defined(Q_OS_MAC)
// macOS 平台命令
#endif

完整示例:

QString editor;
#ifdef Q_OS_WINeditor = "notepad.exe";
#elif defined(Q_OS_LINUX)editor = "gedit";
#elif defined(Q_OS_MAC)editor = "open -a TextEdit";
#endif
process->start(editor);

QProcess 在嵌入式系统中的使用

在嵌入式 Linux 系统中(如 ARM 开发板、树莓派、瑞芯微、全志平台等),QProcess 是非常常用的外部控制手段,可用于:

  • 控制底层音视频工具(如 aplay, ffmpeg, arecord
  • 启动或关闭外部服务(如 hostapd, wpa_supplicant
  • 调用系统命令(如 ifconfig, iwconfig, gpio, i2c-tools 等)
  • 启动 Python 脚本、shell 脚本等处理程序

示例:调用 ALSA 播放音频

你可以用 QProcess 启动 aplay 播放一个音频文件(WAV 格式):

QProcess *process = new QProcess(this);
process->start("aplay", QStringList() << "/mnt/data/audio/test.wav");

⚠️注意事项:

  • 要保证 aplay 可执行文件存在并可执行
  • 音频文件路径要使用开发板可读路径
  • 音频设备需正确配置(使用 aplay -L 可查看)

示例:调用 arecord 录音

QProcess *record = new QProcess(this);
record->start("arecord", QStringList() << "-d" << "5" << "-f" << "cd" << "/tmp/test.wav");

含义说明:

  • -d 5:录 5 秒
  • -f cd:采样格式为 CD(16bit,44100Hz)
  • /tmp/test.wav:输出文件路径

示例:QProcess + Shell 脚本控制外设

有些 GPIO 控制、WIFI 开关等操作直接写 shell 脚本,然后用 QProcess 调用:

QProcess *gpio = new QProcess(this);
gpio->start("/home/root/scripts/led_on.sh");

如果需要 sudo:

gpio->start("sh", QStringList() << "-c" << "echo 1 > /sys/class/gpio/gpio17/value");

文件路径和权限注意事项

  • 嵌入式系统通常运行在 root 用户下,路径以 / 开头;
  • 推荐音频文件放置在 /home/root/, /mnt//data/ 等挂载点;
  • 有些嵌入式系统文件系统是只读的,注意写权限;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/76295.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

原子操作(cpp atomic)

目录 一.原子操作 1.原子操作的概念 2.原子变量 二.原子性 1.中间状态描述 2.单处理器单核 3.多处理器或多核的情况下 4.cache&#xff08;高速缓冲器的作用&#xff09; 5.在cpu cache基础上,cpu如何读写数据&#xff1f;&#xff1f;&#xff1f; 6.为什么会有缓存…

Unet网络的Pytorch实现和matlab实现

文章目录 一、Unet网络简介1.1 输入图像1.2 编码器部分&#xff08;Contracting Path&#xff09;1.3 解码器部分&#xff08;Expanding Path&#xff09;1.4 最后一层&#xff08;输出&#xff09;1.5 跳跃连接&#xff08;Skip Connections&#xff09; 二、Unet网络的Pytorc…

记录一次JVM调优过程1

如何通过jmap 诊断&#xff0c;服务运行一段时间后内存使用量飙升的问题 通过 jmap 诊断服务运行一段时间后内存使用量飙升的问题&#xff0c;需结合堆转储分析、对象分布统计及工具链配合。以下是具体操作步骤和关键方法&#xff1a; 一、实时监控与初步分析 获取进程 PID 使…

接口自动化学习五:mock工具使用

Moco简介&#xff1a; Mock是一个简单搭建模拟服务器的框架&#xff0c;可以用来模拟http、https、socket等协议。 原理&#xff1a; Mock会根据一些配置&#xff0c;启动一个真正的HTTP服务&#xff08;会监听本地的某个端口&#xff09;,当发起的请求满足某个条件时&#xf…

若依 前后端部署

后端&#xff1a;直接把代码从gitee上拉去到本地目录 (https://gitee.com/y_project/RuoYi-Vue ) 注意下redis连接时password改auth 后端启动成功 前端&#xff1a;运行前首先确保安装了node环境&#xff0c;随后执行&#xff1a; &#xff01;&#xff01;一定要用管理员权限…

Adaptive AUTOSAR 状态管理和转换——ActionItemList

在AUTOSAR的状态转换管理(STM,State Transition Manager) 框架中,ActionItemList 是连接 状态机状态(State Machine State) 与 功能组状态(Function Group States) 的核心配置元素。 以下是其关系与作用的详细解释: 1. 核心概念 状态机状态(State Machine State) 表…

一个基于ragflow的工业文档智能解析和问答系统

工业复杂文档解析系统 一个基于ragflow的工业文档智能解析和问答系统,支持多种文档格式的解析、知识库管理和智能问答功能。 系统功能 1. 文档管理 支持多种格式文档上传(PDF、Word、Excel、PPT、图片等)文档自动解析和分块处理实时处理进度显示文档解析结果预览批量文档…

linux系统下如何提交git和调试

我们默认的ubuntu20.04镜像是没有Git提交的工具&#xff0c;我们需要配置安装包。 安装和更新git的命令 sudo apt update //用于更新软件包索引sudo apt install git //用于安装git版本控制工具 git --version //检查git版本,确认是否安装成功 随便进入linux系统下的一…

轻量级爬虫框架Feapder入门:快速搭建企业级数据管道

一、目标与前置知识 1. 目标概述 本教程的主要目标是&#xff1a; 介绍轻量级爬虫框架 Feapder 的基本使用方式。快速搭建一个采集豆瓣电影数据的爬虫&#xff0c;通过电影名称查找对应的电影详情页并提取相关信息&#xff08;电影名称、导演、演员、剧情简介、评分&#xf…

spring mvc的拦截器HandlerInterceptor 接口详解

HandlerInterceptor 接口详解 1. 接口方法说明 方法作用执行时机返回值/注意事项preHandle请求处理前拦截在控制器方法执行前调用返回 false 中断后续流程&#xff1b;返回 true 继续执行postHandle控制器方法执行后拦截在控制器方法返回结果后&#xff0c;视图渲染前调用无返…

数据可视化 —— 柱形图应用(大全)

一、案例一&#xff1a;单柱形图 1.导入库 import matplotlib.pyplot as plt import pandas as pd import numpy as np 2.给窗口名称和画布大小 plt.figure(num单柱形图, figsize(6, 4), facecolorw) 3.定义x、y轴的数据 # range(0-4) x np.arange(5) # 创建数组 y1 np.a…

apijson 快速上手

apijson是强大的工具&#xff0c;简化了CRUD的操作&#xff0c;只要有数据库表&#xff0c;就能自动生成RESTFUL接口。但初次上手也是摸索了很长时间&#xff0c;尤其是部署与使用上&#xff0c;这里尝试以初学者角度来说下&#xff1a; 一、好处 1、对于简单的应用&#xff…

V4L2杂谈

V4L2的开发手册 在做v4l2的开发的时候&#xff0c; 可以使用v4l2-ctl命令协助调试和软件开发。关于linux多媒体开发可以参考链接&#xff1a;https://www.linuxtv.org/wiki/index.php/Main_Page关于v4l2的api接口开发可以参考&#xff1a;https://linuxtv.org/docs.php在linux…

(五)深入了解AVFoundation-播放:多音轨、字幕、倍速播放与横竖屏切换

引言 在之前的博客中&#xff0c;我们已经实现了一个相对完整的播放器&#xff0c;具备了基本功能&#xff0c;如播放、暂停、播放进度显示和拖拽快进等。这为我们提供了一个坚实的基础。接下来&#xff0c;我们将进一步扩展播放器的功能&#xff0c;使其更具灵活性和实用性&a…

3ds Max 2016的版本怎么处理 按键输入被主程序截断 C#winform窗体接受不到英文输入

3ds Max 2016的版本怎么处理 按键输入被主程序截断 C#winform窗体接受不到英文输入 如果窗体失去焦点应该取消 全局监听事件 解决方案&#xff1a;在窗体失去焦点时取消全局键盘钩子 为了确保 WinForms 窗体失去焦点时不再拦截键盘事件&#xff08;避免影响 3ds Max 或其他程…

华为手机或平板与电脑实现文件共享

1.手机或平板与电脑在同一个网络 2.打开手机或平板端&#xff0c;设置---更多连接----快分享或华为分享打开此功能-----开启共享至电脑 3.打开电脑&#xff0c;网络中就可看到手机端分享的用户名称 4. 登陆就可访问手机 5.常见问题 5.1 电脑未发现本机 5.2 修改了访问密码后再…

elemenPlus中,如何去掉el-input中 文本域 textarea自带的边框和角标

1、去掉角标 :deep(.el-textarea__inner) {resize: none !important; // 去除右下角图标 }2、去除边框&#xff0c;并自定义背景色 <el-inputref"textareaRef"v-model"tempContent":style"{--el-border-color: rgba(255,255,255,0.0),--el-input-…

xv6-labs-2024 lab2

lab-2 0. 前置 课程记录 操作系统的隔离性&#xff0c;举例说明就是&#xff0c;当我们的shell&#xff0c;或者qq挂掉了&#xff0c;我们不希望因为他&#xff0c;去影响其他的进程&#xff0c;所以在不同的应用程序之间&#xff0c;需要有隔离性&#xff0c;并且&#xff0…

MCU控制4G模组(标准AT命令),CatM的最大速率?

根据3GPP标准&#xff0c;Cat M1的上行峰值速率大约是1 Mbps&#xff0c;下行大约是1 Mbps。但实际速率会受到多种因素影响&#xff0c;比如网络条件、信号强度、模块配置等。 考虑使用AT命令时的开销。每次发送数据都需要通过AT命令&#xff0c;比如ATQISEND&#xff0c;会引…

JavaScript(JS进阶)

目录 00闭包 01函数进阶 02解构赋值 03通过forEach方法遍历数组 04深入对象 05内置构造函数 06原型 00闭包 <!-- 闭包 --><html><body><script>// 定义&#xff1a;闭包内层函数&#xff08;匿名函数&#xff09;外层函数的变量&#xff08;s&…