【QT】 历程
QT 多历程复习 Linux-C 多历程
#include <sys/types.h>
#include <unistd.h>
//1.创建一个子进程
pid_tpid = fork();
if(pid == 0) //子进程
{
//加载程序文件
system("mplayer 1.avi");
}
//2.创建一个子进程
pid_tpid = 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_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
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() << "进程已停止";
}
https://i-blog.csdnimg.cn/direct/1a8034dba82f4edaad5f8c8835159058.gif#pic_center
✅ 实用场景:
[*]启动本地应用(如欣赏器、文本编辑器、终端等)。
[*]调用体系下令(如 ping、ls、dir)。
信号与槽
信号作用示例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.exeLinuxBash / 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_WIN
editor = "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/ 等挂载点;
[*]有些嵌入式体系文件体系是只读的,注意写权限;
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]