【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.pswp.cn/pingmian/76295.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76295.shtml
英文地址,請注明出處:http://en.pswp.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&…