深入解析:开源 C++ QT QML 开发(十四)进程用途

news/2025/11/6 18:23:10/文章来源:https://www.cnblogs.com/gccbuaa/p/19197354

           文章的目的为了记录使用QT QML开发学习的经历。开发流程和要点有些记忆模糊,赶紧记录,防止忘记。

 相关链接:

开源 C++ QT QML 开发(一)基本介绍

开源 C++ QT QML 开发(二)工程结构

开源 C++ QT QML 开发(三)常用控件

开源 C++ QT QML 开发(四)复杂控件--Listview

开源 C++ QT QML 开发(五)复杂控件--Gridview

开源 C++ QT QML 开发(六)自定义控件--波形图

开源 C++ QT QML 开发(七)自定义控件--仪表盘

推荐链接:

开源 C# 快速开发(一)基础知识

开源 C# 快速开发(二)基础控件

开源 C# 快速开发(三)复杂控件

开源 C# 快速开发(四)自定义控件--波形图

开源 C# 快速开发(五)自定义控件--仪表盘

开源 C# 快速开发(六)自定义控件--圆环

开源 C# 快速开发(七)通讯--串口

开源 C# 快速开发(八)通讯--Tcp服务器端

开源 C# 快速开发(九)通讯--Tcp客户端

开源 C# 快速开发(十)通讯--http客户端

开源 C# 快速开发(十一)线程

开源 C# 快速开发(十二)进程监控

开源 C# 快速开发(十三)进程--管道通讯

开源 C# 快速开发(十四)进程--内存映射

开源 C# 快速开发(十五)进程--windows消息

开源 C# 快速开发(十六)数据库--sqlserver增删改查

本章节主要内容是:使用进程进行进程的监控,进程调用,命令的执行,演示进程的作用。

1.代码分析

2.所有源码

3.效果演示

一、代码分析

二、所有源码

三、效果演示

可以显示当前进程,打开记事本,执行dir命令,演示进程的三种功能。

1. C++ 后台代码分析
ProcessManager 类头文件 (processmanager.h)

class ProcessManager : public QObject
{
    Q_OBJECT  // Qt的元对象系统宏,启用信号槽机制


作用:继承自QObject,使类能够使用Qt的信号槽机制

构造函数

explicit ProcessManager(QObject *parent = nullptr) : QObject(parent) {}


作用:简单的构造函数,调用父类QObject的构造函数

showCurrentProcess() 函数

void showCurrentProcess()
{
    qDebug() << "当前进程PID:" << QCoreApplication::applicationPid();
    emit processInfoReady("当前进程PID: " + QString::number(QCoreApplication::applicationPid()));
}


详细分析:

QCoreApplication::applicationPid():获取当前应用程序的进程ID

qDebug():在控制台输出调试信息

emit processInfoReady():发射信号,将信息传递到QML界面

功能:显示当前Qt应用程序自身的进程ID


openNotepad() 函数

void openNotepad()
{
    QProcess *process = new QProcess(this);  // 创建QProcess对象,this指定父对象用于自动内存管理
    // 连接进程结束信号到lambda表达式
    connect(process, QOverload::of(&QProcess::finished),
            [process](int exitCode, QProcess::ExitStatus exitStatus) {
        qDebug() << "记事本进程结束,退出码:" << exitCode;
        process->deleteLater();  // 安全删除进程对象
    });
#ifdef Q_OS_WIN
    process->start("notepad.exe");  // Windows系统启动记事本
#else
    process->start("gedit");  // Linux系统启动gedit
#endif
    if (process->waitForStarted()) {  // 等待进程启动,超时时间默认30秒
        emit processInfoReady("记事本已启动");
    } else {
        emit processInfoReady("启动记事本失败");
    }
}


详细分析:

QProcess *process = new QProcess(this):创建进程对象,指定父对象实现自动内存管理

connect(... finished ...):连接进程结束信号,使用lambda表达式处理

QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished):处理重载信号的正确连接方式

process->deleteLater():在事件循环中安全删除对象

预处理指令 #ifdef Q_OS_WIN:实现跨平台兼容

process->start():启动外部程序

process->waitForStarted():阻塞等待进程启动,返回布尔值表示是否成功


executeDirCommand() 函数

void executeDirCommand()
{
    QProcess *process = new QProcess(this);
    // 连接标准输出信号
    connect(process, &QProcess::readyReadStandardOutput, [process, this]() {
        QString output = QString::fromLocal8Bit(process->readAllStandardOutput());
        emit commandOutputReady(output);
    });
    // 连接标准错误信号
    connect(process, &QProcess::readyReadStandardError, [process, this]() {
        QString error = QString::fromLocal8Bit(process->readAllStandardError());
        emit commandOutputReady("错误: " + error);
    });
    // 连接进程结束信号
    connect(process, QOverload::of(&QProcess::finished),
            [process, this](int exitCode, QProcess::ExitStatus exitStatus) {
        emit commandOutputReady("\n命令执行完成,退出码: " + QString::number(exitCode));
        process->deleteLater();
    });
#ifdef Q_OS_WIN
    process->start("cmd", QStringList() << "/c" << "dir");  // Windows执行dir命令
#else
    process->start("ls", QStringList() << "-l");  // Linux执行ls -l命令
#endif
    if (!process->waitForStarted()) {
        emit commandOutputReady("启动命令失败");
    }
}


详细分析:

readyReadStandardOutput:当进程有标准输出时触发

readyReadStandardError:当进程有错误输出时触发

readAllStandardOutput():读取所有标准输出数据

QString::fromLocal8Bit():将本地8位编码转换为QString

QStringList() << "/c" << "dir":创建参数列表,/c表示执行后终止cmd

使用三个独立的connect来分别处理输出、错误和结束事件

信号声明

signals:
    void processInfoReady(const QString &info);
    void commandOutputReady(const QString &output);


作用:定义两个信号,用于C++到QML的通信


2. main.cpp 分析

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);  // 启用高DPI缩放
    QGuiApplication app(argc, argv);  // 创建GUI应用程序对象
    ProcessManager processManager;  // 创建进程管理器实例
    QQmlApplicationEngine engine;  // 创建QML引擎
    // 将C++对象注册为QML上下文属性
    engine.rootContext()->setContextProperty("processManager", &processManager);
    // 从qrc资源文件加载QML
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())  // 检查QML是否加载成功
        return -1;
    return app.exec();  // 进入主事件循环
}


3. QML 界面详细分析
ApplicationWindow

ApplicationWindow {
    id: window
    width: 800
    height: 600
    visible: true
    title: "Qt进程管理示例"


作用:创建主应用程序窗口

背景渐变

Rectangle {
    anchors.fill: parent
    gradient: Gradient {
        GradientStop { position: 0.0; color: "#2c3e50" }
        GradientStop { position: 1.0; color: "#3498db" }
    }
}


作用:创建从深蓝色到浅蓝色的垂直渐变背景

按钮组件分析

Button {
    Layout.fillWidth: true
    text: "显示当前进程"
    font.pixelSize: 16
    background: Rectangle {
        color: parent.down ? "#27ae60" : "#2ecc71"  // 按下时变深色
        radius: 8  // 圆角
    }
    contentItem: Text {
        text: parent.text
        font: parent.font
        color: "white"
        horizontalAlignment: Text.AlignHCenter
        verticalAlignment: Text.AlignVCenter
    }
    onClicked: {
        processManager.showCurrentProcess()  // 调用C++函数
    }
}


详细分析:

Layout.fillWidth: true:在布局中填充宽度

background:自定义按钮背景,实现按下状态颜色变化

contentItem:自定义按钮文本样式

onClicked:按钮点击事件处理器,调用C++函数


输出显示区域

ScrollView {
    anchors.fill: parent
    anchors.margins: 5
    TextArea {
        id: outputArea
        readOnly: true  // 只读
        wrapMode: Text.Wrap  // 自动换行
        color: "#ecf0f1"  // 文字颜色
        font.pixelSize: 12
        font.family: "Courier New"  // 等宽字体,适合显示命令输出
        background: null  // 透明背景
        placeholderText: "命令输出将显示在这里..."
    }
}


Connections 组件

Connections {
    target: processManager  // 连接的C++对象
    onProcessInfoReady: {  // 处理processInfoReady信号
        infoArea.text = info + "\n" + infoArea.text  // 新信息添加到顶部
    }
    onCommandOutputReady: {  // 处理commandOutputReady信号
        outputArea.text = output + outputArea.text
    }
}


作用:建立C++信号到QML的连接,实现数据传递

二、所有源码

processmanager .h文件源码

#ifndef PROCESSMANAGER_H
#define PROCESSMANAGER_H
#include 
#include 
#include 
#include 
class ProcessManager : public QObject
{Q_OBJECT
public:explicit ProcessManager(QObject *parent = nullptr) : QObject(parent) {}
public slots:// 显示当前进程信息void showCurrentProcess(){qDebug() << "当前进程PID:" << QCoreApplication::applicationPid();emit processInfoReady("当前进程PID: " + QString::number(QCoreApplication::applicationPid()));}// 打开记事本void openNotepad(){QProcess *process = new QProcess(this);// 进程结束时自动删除connect(process, QOverload::of(&QProcess::finished),[process](int exitCode, QProcess::ExitStatus exitStatus) {qDebug() << "记事本进程结束,退出码:" << exitCode;process->deleteLater();});
#ifdef Q_OS_WINprocess->start("notepad.exe");
#elseprocess->start("gedit");  // Linux系统使用gedit
#endifif (process->waitForStarted()) {emit processInfoReady("记事本已启动");} else {emit processInfoReady("启动记事本失败");}}// 执行cmd dir命令void executeDirCommand(){QProcess *process = new QProcess(this);connect(process, &QProcess::readyReadStandardOutput, [process, this]() {QString output = QString::fromLocal8Bit(process->readAllStandardOutput());emit commandOutputReady(output);});connect(process, &QProcess::readyReadStandardError, [process, this]() {QString error = QString::fromLocal8Bit(process->readAllStandardError());emit commandOutputReady("错误: " + error);});connect(process, QOverload::of(&QProcess::finished),[process, this](int exitCode, QProcess::ExitStatus exitStatus) {emit commandOutputReady("\n命令执行完成,退出码: " + QString::number(exitCode));process->deleteLater();});
#ifdef Q_OS_WINprocess->start("cmd", QStringList() << "/c" << "dir");
#elseprocess->start("ls", QStringList() << "-l");  // Linux系统使用ls -l
#endifif (!process->waitForStarted()) {emit commandOutputReady("启动命令失败");}}
signals:void processInfoReady(const QString &info);void commandOutputReady(const QString &output);
};
#endif // PROCESSMANAGER_H

main.qml文件源码

import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
ApplicationWindow {id: windowwidth: 800height: 600visible: truetitle: "Qt进程管理示例"// 背景渐变Rectangle {anchors.fill: parentgradient: Gradient {GradientStop { position: 0.0; color: "#2c3e50" }GradientStop { position: 1.0; color: "#3498db" }}}ColumnLayout {anchors.fill: parentanchors.margins: 20spacing: 15// 标题Text {Layout.alignment: Qt.AlignHCentertext: "进程管理演示"font.pixelSize: 28font.bold: truecolor: "white"}// 按钮区域RowLayout {Layout.fillWidth: truespacing: 15// 显示当前进程按钮Button {Layout.fillWidth: truetext: "显示当前进程"font.pixelSize: 16background: Rectangle {color: parent.down ? "#27ae60" : "#2ecc71"radius: 8}contentItem: Text {text: parent.textfont: parent.fontcolor: "white"horizontalAlignment: Text.AlignHCenterverticalAlignment: Text.AlignVCenter}onClicked: {processManager.showCurrentProcess()}}// 打开记事本按钮Button {Layout.fillWidth: truetext: "打开记事本"font.pixelSize: 16background: Rectangle {color: parent.down ? "#2980b9" : "#3498db"radius: 8}contentItem: Text {text: parent.textfont: parent.fontcolor: "white"horizontalAlignment: Text.AlignHCenterverticalAlignment: Text.AlignVCenter}onClicked: {processManager.openNotepad()}}// 执行Dir命令按钮Button {Layout.fillWidth: truetext: "执行Dir命令"font.pixelSize: 16background: Rectangle {color: parent.down ? "#c0392b" : "#e74c3c"radius: 8}contentItem: Text {text: parent.textfont: parent.fontcolor: "white"horizontalAlignment: Text.AlignHCenterverticalAlignment: Text.AlignVCenter}onClicked: {processManager.executeDirCommand()outputArea.text = "执行命令中..."}}}// 信息显示区域Rectangle {Layout.fillWidth: trueLayout.preferredHeight: 100color: "#34495e"radius: 8border.color: "#7f8c8d"border.width: 2ScrollView {anchors.fill: parentanchors.margins: 5TextArea {id: infoAreareadOnly: truewrapMode: Text.Wrapcolor: "#ecf0f1"font.pixelSize: 14background: nullplaceholderText: "进程信息将显示在这里..."}}}// 命令输出区域Rectangle {Layout.fillWidth: trueLayout.fillHeight: truecolor: "#2c3e50"radius: 8border.color: "#7f8c8d"border.width: 2ScrollView {anchors.fill: parentanchors.margins: 5TextArea {id: outputAreareadOnly: truewrapMode: Text.Wrapcolor: "#ecf0f1"font.pixelSize: 12font.family: "Courier New"background: nullplaceholderText: "命令输出将显示在这里..."}}}// 状态栏Rectangle {Layout.fillWidth: trueLayout.preferredHeight: 30color: "#1abc9c"radius: 5Text {anchors.centerIn: parenttext: "Qt 5.12 进程管理示例 - 使用QProcess类"color: "white"font.pixelSize: 12}}}// 连接C++信号到QMLConnections {target: processManageronProcessInfoReady: {infoArea.text = info + "\n" + infoArea.text}onCommandOutputReady: {outputArea.text = output + outputArea.text}}
}

main.cpp文件源码

#include 
#include 
#include 
#include "processmanager.h"
int main(int argc, char *argv[])
{QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);QGuiApplication app(argc, argv);// 注册进程管理器到QMLProcessManager processManager;QQmlApplicationEngine engine;// 将C++对象暴露给QMLengine.rootContext()->setContextProperty("processManager", &processManager);// 加载QML文件engine.load(QUrl(QStringLiteral("qrc:/main.qml")));if (engine.rootObjects().isEmpty())return -1;return app.exec();
}

三、效果演示

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

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

相关文章

各种扩展模块

各种扩展模块S7-1200 系列提供了各种模块和插入式板, 用于通过附加 I/O 或其它通信协议来扩展 CPU 的功能。 CM 通信模块 通信模块(CM)和通信处理器(CP)将增加 CPU 的通信选项,例如 PROFIBUS或 RS232/RS485 的连接性…

2025年冷冻式干燥机标杆厂家最新推荐:凌宇机械,冷冻式压缩空气干燥机/风冷高温冷冻式干燥机/水冷高温冷冻式干燥机/吸附式干燥机/以高效节能与全场景方案树立行业新标准

随着工业自动化程度的不断深化及企业对能耗管控、生产稳定性要求的日益提高,作为核心气源净化设备的压缩空气干燥机,其重要性愈发凸显。2025年,在制造业持续升级与“双碳”目标的双重驱动下,市场对干燥设备的节能效…

2025全日制艺考生文化课机构推荐榜:全日制艺考生文化课,小众优质机构精准适配需求

随着艺考生文化课要求逐步提高,“复习周期短、基础不均衡、需求个性化” 成为普遍困扰。为帮助艺考生筛选适配的学习平台,本文聚焦全日制教学模式,规模适中、专注度高的机构,其中深圳得到教育凭借扎实的教学体系位…

2025艺术涂料厂家推荐榜:进口艺术涂料、意大利进口艺术涂料、意大利艺术涂料厂家,装修选品不踩坑

在消费升级与家居美学需求提升的双重驱动下,艺术涂料凭借独特的装饰质感与环保性能,成为装修市场的热门选择。为帮助消费者精准筛选优质品牌,本文结合品牌底蕴、产品实力、市场口碑等维度,整理出 2025 年艺术涂料推…

2025济南艺考文化课培训推荐榜:艺考文化课培训,艺考文化课培训机构适配不同艺考生需求

艺考生专业统考结束后,文化课冲刺成为关键环节。为帮助艺考生精准选择适配机构,结合济南本地培训市场口碑、教学成效及学员反馈,整理出 2025 年优质艺考文化课培训机构推荐榜,兼顾基础巩固、技巧提升等多元需求。 …

For xinye666

#include <stdio.h> #include <iostream> #define int long long // 开 long long !!! #define con putchar_unlocked( ) #define ent putchar_unlocked(\n) #define op(c) putchar_unlocked(c) #define …

从手写周报到智能生成:PandaCoder如何让你的工作汇报效率提升10倍

从手写周报到智能生成:PandaCoder如何让你的工作汇报效率提升10倍"在我们的工作中,最浪费的不是机器的时间,而是人的时间。" —— 弗雷德里克泰勒📊 开篇:每周五下午的"噩梦" 每到周五下午,…

2025优质媒体服务商推荐榜:媒体邀约靠谱平台助力品牌高效传播

在信息传播多元化的当下,优质媒体服务商成为品牌连接用户的重要桥梁。2025 年行业竞争加剧,合规性、专业性与服务适配性成为筛选核心。本文结合行业洞察与用户反馈,值得关注的媒体服务商推荐榜,为需求方提供参考。…

2025大连汽车凹陷修复厂家推荐榜:震城汽车领衔,汽车数据修复厂家靠谱机构守护原厂漆质感

随着汽车保有量持续攀升,轻微碰撞、冰雹侵袭带来的车身凹陷成为车主高频困扰。2025 年汽车凹陷修复行业迈向标准化发展,无损修复技术因保留原厂漆、保值性强等优势备受青睐。这份大连本地优质机构推荐榜,结合技术实…

详细介绍:iBizModel 实体主状态(PSDEMAINSTATE)及主状态逻辑(PSDELOGIC`MAINSTATELOGIC`)模型详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025氮化硼陶瓷推荐榜:福维科(山东)五星领跑,氮化硼陶瓷高温绝缘体/坩埚/套管/基板/高温构件/耐腐蚀构件优质厂家赋能产业升级

随着工业制造向精密化、高温化推进,氮化硼陶瓷凭借耐高温、强绝缘、高导热的特性,成为电子、新能源、高温加工等领域的关键材料。2025 年优质企业推荐榜聚焦核心需求,精选 5 家实力企业,其中福维科新材料科技发展(…

Maui 实践:JavaScript 动态生成集合属性的 get/set 代理

Maui 实践:JavaScript 动态生成集合属性的 get/set 代理 原创 夏群林 2025.11.6 一、背景 在我的数独项目的 SudokuFound 类中,需要管理 8 个集合属性,每个集合都需要:「读」:返回副本(避免外部直接修改内部数据…

2025小王子亚麻籽薯片工厂推荐榜:小王子亚麻籽薯片厂家实力派承包休闲时光

追剧解馋、露营分享、办公加餐,一款口感出众又兼顾品质的薯片总能点亮日常。2025 年休闲食品市场更看重 “品质溯源、工艺创新、健康适配”,结合市场口碑、技术实力与品质认证,整理出这份高性价比薯片推荐榜,帮你轻…

2025大连养老院机构推荐榜:养老院中心、社区养老院守护舒心晚年

2随着养老需求的多元化发展,选择一家环境适宜、服务贴心的养老院成为许多人的关注重点。2025 年大连甘井子区养老机构推荐榜新鲜出炉,辛寨子社区养老服务中心凭借社区嵌入式优势登顶,另有两家机构凭借特色服务入选,…

Apache是干嘛用的?Apache服务器搭建教程

Apache 是一款开源的 HTTP 服务器软件。简而言之,它是一种帮助计算机向互联网上的其他计算机发送和接收网页的程序。试想一下,Apache 就像是一位餐厅的服务员,负责把菜单(网页)从厨房(服务器)端到桌子(用户的浏…

ewomail docker搭建

docker部署ewomail遇到的一个问题。使用docker部署ewomail,部署中途遇到了域不允许的问题。在网上搜索的到都是配置本地 hosts 就可以解决域不允许问题,但是我配置了无法解决,通过如下方式解决。 docker run -d \-h…

Playwright为什么老是跑不稳?12个坑踩完我终于懂了!

关注 霍格沃兹测试学院公众号,回复「资料」, 领取人工智能测试开发技术合集 周五傍晚,理想的状态是测试报告全绿、CI顺利完成、泡杯咖啡享受下班时光。 如果你的 Playwright 测试套件老是慢、莫名失败、生成一堆无用…

阿里云微服务引擎 MSE 及 API 网关 2025 年 10 月产品动态

阿里云微服务引擎 MSE 及 API 网关 2025 年 10 月产品动态点击此处,了解微服务引擎 MSE 产品详情。

2025年厂房降温设备厂家新推荐排行榜白皮书,厂房降温设备哪个厂家好

2025年工业制造领域持续向绿色高效转型,厂房降温设备作为保障车间生产环境、提升员工效率的核心配套设施,已成为机械加工、物流仓储、食品加工等行业的刚需。然而当前市场中,厂房降温设备厂家数量繁杂且技术实力分化…