当前位置: 首页 > article >正文

C# 基于 Windows 系统与 Visual Studio 2017 的 Messenger 消息传递机制详解:发布-订阅模式实现

在这里插入图片描述

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用,熟悉DICOM医学影像及DICOM协议,业余时间自学JavaScript,Vue,qt,python等,具备多种混合语言开发能力。撰写博客分享知识,致力于帮助编程爱好者共同进步。欢迎关注、交流及合作,提供技术支持与解决方案。\n技术合作请加本人wx(注明来自csdn):xt20160813

在这里插入图片描述

C# 基于 Windows 系统与 Visual Studio 2017 的 Messenger 消息传递机制详解:发布-订阅模式实现

在 C# 开发中,特别是在 Windows 平台的客户端应用程序开发中,Messenger 是一种基于发布-订阅模式(Publish-Subscribe Pattern)的消息传递机制,广泛应用于 MVVM(Model-View-ViewModel)架构,如 WPF 应用程序。它通过 Messenger.Default.SendMessenger.Default.Register 实现松耦合的模块间通信,特别适合复杂 UI 交互和跨组件协作场景。本文基于 Windows 系统Visual Studio 2017,结合历史对话中提到的代码示例(如 Messenger.Default.Send<string>("Recovery", "fanxuan")),详细解析 Messenger 的实现原理、配置环境、应用场景及完整代码示例,确保内容准确、具体且可直接应用于 Windows 开发。


一、引言

在 Windows 平台的 C# 开发中,MVVM 架构常用于构建可维护、可测试的应用程序。Messenger 作为 MVVM 框架(如 MVVM Light、Prism)的核心组件,通过发布-订阅模式实现模块间通信,避免直接耦合。历史对话中的代码展示了 Messenger 在医学影像系统(DICOM 相关)中用于触发恢复按钮状态的场景,例如通过 ESC 键发送 "Recovery" 消息。本文将从 Windows 系统和 Visual Studio 2017 的开发环境出发,深入剖析 Messenger 的工作机制,提供配置指南、完整代码示例,并结合实际应用场景(如 UI 状态恢复)进行说明。


二、发布-订阅模式与 Messenger 概述

1. 发布-订阅模式

发布-订阅模式是一种解耦设计模式,核心组件包括:

  • 发布者(Publisher):发送消息,不关心接收者。
  • 订阅者(Subscriber):注册对特定消息的兴趣,处理接收到的消息。
  • 消息中介(Broker):管理消息分发,通过消息类型或令牌(Token)过滤。

优点

  • 松耦合:模块间无需直接引用,降低依赖。
  • 一对多通信:支持多个订阅者处理同一消息。
  • 线程安全:结合 Windows 的 Dispatcher 机制,确保 UI 操作在主线程执行。
2. Messenger 的功能

Messenger 是 MVVM 框架(如 MVVM Light)提供的消息传递工具,核心方法包括:

  • 发送消息Messenger.Default.Send<T>(message, token),发送类型为 T 的消息,可指定令牌 token
  • 注册订阅Messenger.Default.Register<T>(recipient, token, action),注册处理特定类型和令牌的消息。
  • 令牌机制:通过 token(如字符串 "fanxuan")实现定向消息传递。
  • 线程支持:结合 WPF 的 Dispatcher 确保线程安全。

在历史对话中,Messenger.Default.Send<string>("Recovery", "fanxuan") 用于发送恢复命令,目标是注册了 "fanxuan" 令牌的订阅者,通常用于 UI 状态重置或 DICOM 数据操作。


三、Windows 系统与 Visual Studio 2017 环境配置

1. 系统与工具要求
  • 操作系统:Windows 10(推荐 64 位,支持 Visual Studio 2017)。
  • 开发工具:Visual Studio 2017(Community、Professional 或 Enterprise 版本)。
  • 框架:.NET Framework 4.6.1 或更高版本(WPF 项目常用)。
  • NuGet 包:MVVM Light(MvvmLightLibs)。
2. 配置 MVVM Light

在 Visual Studio 2017 中安装 MVVM Light:

  1. 打开 NuGet 包管理器
    • 在 Visual Studio 2017 中,点击 工具 > NuGet 包管理器 > 管理解决方案的 NuGet 包
  2. 搜索并安装 MVVM Light
    • 搜索 MvvmLightLibs,选择 GalaSoft.MvvmLight,点击 安装
    • 安装完成后,项目引用中将包含 GalaSoft.MvvmLight.dll
  3. 验证环境
    • 创建一个 WPF 项目,添加以下 using 语句:
      using GalaSoft.MvvmLight;
      using GalaSoft.MvvmLight.Messaging;
      
    • 确保无编译错误。
3. 项目设置
  • 创建 WPF 项目
    • 在 Visual Studio 2017 中,选择 文件 > 新建 > 项目 > Visual C# > Windows 经典桌面 > WPF 应用
    • 项目命名为 MessengerDemo
  • 添加 ViewModel
    • 创建 ViewModels 文件夹,添加 MainViewModel.csButtonViewModel.cs
  • 配置 Dispatcher
    • WPF 项目默认包含 Dispatcher,无需额外配置。若需自定义 Dispatcher,可使用 Application.Current.Dispatcher

四、Messenger 的核心方法

1. Messenger.Default.Send

签名

void Send<T>(T message, object token = null);
  • 参数
    • message:消息内容(如字符串 "Recovery")。
    • token:可选的令牌,用于过滤接收者(如 "fanxuan")。
  • 作用:将消息广播给匹配 token 和类型 T 的订阅者。
  • 示例
    Messenger.Default.Send<string>("Recovery", "fanxuan");
    
2. Messenger.Default.Register

签名

void Register<T>(object recipient, object token, Action<T> action);
  • 参数
    • recipient:订阅者对象(通常为 this)。
    • token:与发送端匹配的令牌。
    • action:收到消息后的回调函数。
  • 作用:注册处理特定类型和令牌的消息。
  • 示例
    Messenger.Default.Register<string>(this,"fanxuan",message => { /* 处理逻辑 */ }
    );
    
3. 消息传递流程
graph LRA[Send: Messenger.Default.Send<string>("Recovery", "fanxuan")] --> B[Messenger 中介]B --> C[查找匹配 "fanxuan" 和 string 的订阅者]C --> D[Register: Messenger.Default.Register<string>(this, "fanxuan", ...)]D --> E[执行回调: Dispatcher.Invoke(button1_Click)]

五、Messenger 实现原理

Messenger 基于单例模式(Messenger.Default),内部维护订阅者列表。核心逻辑包括:

  1. 订阅管理
    • Register 方法将 {recipient, token, action} 存储在字典中,键为消息类型 Ttoken
  2. 消息分发
    • Send 方法遍历订阅者列表,匹配 Ttoken,调用对应的 action
  3. 线程安全
    • 在 WPF 中,Dispatcher.Invoke 确保 UI 操作在主线程执行。
  4. 令牌匹配
    • 令牌通过 Equals 方法比较(如字符串的哈希比较),实现高效过滤。

六、Messenger 在历史对话中的应用

历史对话中的代码展示了 Messenger 在医学影像系统中的应用,用于触发 UI 恢复:

发送端
case ItCallBackMSG.Recovery: // 通过 ESC 键触发恢复
{Messenger.Default.Send<string>("Recovery", "fanxuan");break;
}
  • 场景:用户按 ESC 键触发 ItCallBackMSG.Recovery,发送 "Recovery" 消息到 "fanxuan" 通道。
  • 目的:通知订阅者执行 UI 按钮状态恢复或 DICOM 数据重置。
接收端
Messenger.Default.Register<string>(this,"fanxuan",message => DcmOperateDispatcher.Invoke(new Onclick(button1_Click), null, null)
);
  • 场景:某个类(可能是 ViewModel 或 View)注册 "fanxuan" 通道,收到消息后调用 button1_Click
  • 线程安全DcmOperateDispatcher.Invoke 确保回调在 UI 线程执行。
  • 改进建议:添加消息内容判断(如 if (message == "Recovery"))以提高特异性。

七、完整代码示例

以下是一个基于 WPF 的完整示例,展示 Messenger 在 Windows 系统中的应用,模拟 ESC 键触发按钮状态恢复。

1. 项目结构
  • MainWindow.xaml:主窗口,包含一个按钮。
  • MainViewModel.cs:发送恢复消息。
  • ButtonViewModel.cs:接收消息并处理按钮状态。
2. XAML(MainWindow.xaml)
<Window x:Class="MessengerDemo.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="Messenger Demo" Height="200" Width="300"><Grid><Button Content="Recover State" Width="100" Height="30"Command="{Binding RecoverCommand}"/></Grid>
</Window>
3. MainViewModel.cs
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using GalaSoft.MvvmLight.Messaging;public class MainViewModel : ViewModelBase
{public RelayCommand RecoverCommand { get; private set; }public MainViewModel(){// 初始化命令,模拟 ESC 键触发RecoverCommand = new RelayCommand(SendRecoveryCommand);}private void SendRecoveryCommand(){// 发送恢复消息到 "fanxuan" 通道Messenger.Default.Send<string>("Recovery", "fanxuan");}
}
4. ButtonViewModel.cs
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Messaging;
using System.Windows;public class ButtonViewModel : ViewModelBase
{public ButtonViewModel(){// 注册 "fanxuan" 通道的消息Messenger.Default.Register<string>(this,"fanxuan",message =>{if (message == "Recovery"){// 在 UI 线程执行恢复逻辑Application.Current.Dispatcher.Invoke(() =>{RecoverButtonState();});}});}private void RecoverButtonState(){// 模拟恢复按钮状态MessageBox.Show("Button state recovered!");// 实际逻辑:重置 UI 或 DICOM 数据}
}
5. 主程序(App.xaml.cs)
using GalaSoft.MvvmLight.Messaging;
using System.Windows;public partial class App : Application
{protected override void OnStartup(StartupEventArgs e){base.OnStartup(e);// 初始化 ViewModelvar mainViewModel = new MainViewModel();var buttonViewModel = new ButtonViewModel();// 设置主窗口var mainWindow = new MainWindow{DataContext = mainViewModel};mainWindow.Show();}
}
6. 运行结果
  • 点击窗口中的“Recover State”按钮,触发 RecoverCommand,发送 "Recovery" 消息。
  • ButtonViewModel 捕获消息,显示提示框“Button state recovered!”。
  • 实际应用中,可在 RecoverButtonState 中实现 UI 重置或 DICOM 数据恢复逻辑。

八、在 Windows 系统中的开发注意事项

  1. Visual Studio 2017 配置

    • 确保安装 .NET Framework 4.6.1 或更高版本。
    • 使用 NuGet 包管理器安装 MvvmLightLibs(版本 5.4.1 兼容 VS2017)。
    • 若网络受限,可下载离线 NuGet 包:
      nuget install MvvmLightLibs -Version 5.4.1 -OutputDirectory .\Packages
      
  2. 调试技巧

    • 在 Visual Studio 2017 中设置断点,检查 Messenger.Default.SendRegister 的执行流程。
    • 使用 即时窗口查看 Messenger 订阅者列表(需自定义 Messenger 实现)。
    • 验证 Dispatcher.Invoke 是否正确切换到 UI 线程。
  3. 性能优化

    • 避免频繁注册/注销订阅者,建议在 ViewModel 构造时注册,析构时注销:
      public override void Cleanup()
      {Messenger.Default.Unregister(this);base.Cleanup();
      }
      
    • 使用具体 token(如 "fanxuan")减少消息广播开销。
  4. DICOM 集成

    • 在医学影像系统中,Messenger 可用于通知 UI 更新 DICOM 参数(如 FOV、TR)。
    • 示例:发送 DICOM 文件加载完成消息:
      Messenger.Default.Send<string>("DICOMLoaded", "fanxuan");
      

九、常见问题与解决方案

问题解决方案
消息未被接收确认 SendRegistertoken 和消息类型一致。
UI 更新失败使用 Application.Current.Dispatcher.Invoke 确保回调在 UI 线程执行。
NuGet 安装失败离线下载 MvvmLightLibs 包,导入项目:nuget install MvvmLightLibs
消息误触发Register 的回调中添加条件判断:if (message == "Recovery")

十、总结

Messenger.Default.SendMessenger.Default.Register 是 C# 中基于发布-订阅模式的强大消息传递机制,特别适合 Windows 平台的 WPF 开发。基于 Visual Studio 2017 环境,本文提供了完整的配置指南和代码示例,展示了 Messenger 在 UI 状态恢复(如历史对话中的 ESC 键触发)中的应用。核心特点:

  1. 松耦合:通过 token 实现定向通信。
  2. 线程安全:结合 Dispatcher 确保 UI 操作安全。
  3. 易用性:MVVM Light 提供简单 API,适合快速开发。

在 Windows 系统和 Visual Studio 2017 中,开发者可通过 NuGet 快速集成 MVVM Light,结合 WPF 的 Dispatcher 机制实现高效通信。建议在实际开发中添加消息内容验证和订阅者管理,以提高代码健壮性。


参考资料

  • MVVM Light 文档:http://www.mvvmlight.net/
  • Visual Studio 2017 文档:https://docs.microsoft.com/en-us/visualstudio/
  • C# 委托与事件:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/events/

相关文章:

C# 基于 Windows 系统与 Visual Studio 2017 的 Messenger 消息传递机制详解:发布-订阅模式实现

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…...

ComfyUI+阿里Wan2.1+内网穿透技术:本地AI视频生成系统搭建实战

文章目录 前言1.软件准备1.1 ComfyUI1.2 文本编码器1.3 VAE1.4 视频生成模型 2.整合配置3. 本地运行测试4. 公网使用Wan2.1模型生成视频4.1 创建远程连接公网地址 5. 固定远程访问公网地址总结 前言 各位技术爱好者&#xff0c;今天为您带来一组创新性的AI应用方案&#xff01…...

腾讯云开发者社区文章内容提取免费API接口教程

接口简介&#xff1a; 提取指定腾讯云开发者社区文章内容。本接口仅做内容提取&#xff0c;未经作者授权请勿转载。 请求地址&#xff1a; https://cn.apihz.cn/api/caiji/tencent.php 请求方式&#xff1a; POST或GET。 请求参数&#xff1a; 【名称】【参数】【必填】【说…...

利用海外代理IP,做Twitter2026年全球趋势数据分析

近年来&#xff0c;社交媒体趋势分析逐渐成为品牌监控、市场洞察和消费者研究的必备工具。而当谈到全球趋势数据分析&#xff0c;很多人都会立即想到 Twitter趋势&#xff08;逼近连美丽国的总统都喜欢在上面发表自己的看法- -!!!&#xff09;。Twitter趋势&#xff0c;即Twitt…...

OpenLayers 图形交互编辑

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 图形要素包括属性信息和几何信息&#xff0c;在实际应用中&#xff0c;不仅需要修改样式信息&#xff0c;也需要修改图形几何信息。在OpenLayers中&…...

pikachu靶场通关笔记06 XSS关卡02-反射型POST

目录 一、XSS 二、反射型XSS 三、POST型报文 四、GET型与POST型区别 五、代码审计 五、渗透实战 1、渗透方法1 2、渗透方法2 本系列为通过《pikachu靶场通关笔记》的XSS关卡(共10关&#xff09;渗透集合&#xff0c;通过对XSS关卡源码的代码审计找到XSS风险的真实原因&…...

SQLiteStudio - 免费开源、轻量高效,跨平台的 SQLite 数据库管理工具,代替 Navicat for SQLite

管理 SQLite 数据库就用这款软件&#xff0c;真的早该摒弃破解和盗版的 Navicat 了。 SQLiteStudio 是一款专注于管理 SQLite 数据库 的桌面软件&#xff0c;用于浏览和编辑 SQLite 数据库文件。软件的作者是来自波兰的开发者 Paweł Salawa&#xff0c;他是一位拥有 20 年 Ja…...

Prometheus + Grafana + Cadvisor:构建高效企业级服务监控体系

在现代软件开发和运维领域&#xff0c;容器化技术的应用越来越广泛&#xff0c;其中 Docker 作为最受欢迎的容器化解决方案之一&#xff0c;其容器的监控管理变得至关重要。本文将详细介绍如何使用 cadvisor、Prometheus 和 Grafana 来监控 Docker 容器的状态。 一、安装镜像 …...

WEBSTORM前端 —— 第3章:移动 Web —— 第2节:空间转换、转化

目录 一、空间转换 1.空间转换 2.空间转换 – 平移 3.视距 perspective 4.空间 – 旋转 ③空间旋转——Z轴代码与效果视频 ④空间旋转——X轴代码与效果视频 ⑤空间旋转——Y轴代码与效果视频 5.立体呈现 – transform-style 案例 – 3D 导航 6.空间转换 – 缩放 …...

Java研学-MongoDB(一)

一 MongoDB 简介 MongoDB是一种高性能、开源的NoSQL数据库&#xff0c;采用面向文档的存储模型&#xff0c;以BSON&#xff08;Binary JSON&#xff09;格式存储数据&#xff0c;具有灵活的数据模型、强大的扩展性和丰富的功能特性&#xff0c;广泛应用于各类现代应用程序的数据…...

【AI面试秘籍】| 第25期:RAG的关键痛点及解决方案深度解析

今天我们来聊聊大模型领域一个非常火热的技术——RAG&#xff08;Retrieval Augmented Generation&#xff09;。RAG通过引入外部知识库&#xff0c;有效地缓解了大型语言模型&#xff08;LLM&#xff09;在处理知识密集型任务时可能出现的幻觉、知识过时等问题。然而&#xff…...

OpenGL、GLUT、freeGLUT 与 GLFW 的区别

在图形编程中&#xff0c;OpenGL 是最核心的渲染 API&#xff0c;但仅靠它本身无法完成窗口创建、事件处理等任务。因此&#xff0c;开发者通常会借助一些辅助库来简化开发流程。常见的库包括 GLUT、freeGLUT 和 GLFW。 本文将详细讲解这些技术之间的区别&#xff0c;并提供每…...

服务器带宽线路的区别(GIA、CN2、BGP、CMI等)

服务器带宽线路的区别&#xff08;GIA、CN2、BGP、CMI等&#xff09; 一、BGP线路 1. 定义与技术特点 BGP&#xff08;Border Gateway Protocol&#xff0c;边界网关协议&#xff09;是一种用于不同自治系统&#xff08;AS&#xff09;之间交换路由信息的协议&#xff0c;属…...

ppt一键制作:ai自动生成PPT,便捷高效超级精美!

深夜的台灯下&#xff0c;你对着杂乱的 PPT 内容反复刷新灵感&#xff0c;鼠标在字体、配色选项间来回穿梭&#xff0c;好不容易拼凑出的页面&#xff0c;却总透着浓浓的 “廉价感”&#xff1b;汇报在即&#xff0c;逻辑混乱的大纲改了又改&#xff0c;每一页感觉合适又不搭&a…...

多方法解决MNIST数字识别

全连接层 import torch from torchvision import datasets, transforms import torch.nn as nn import torch.optim as optim from tqdm import tqdm # 用于进度条显示 import os# 定义数据预处理(标准化+Tensor转换) transform = transforms.Compose([transforms.ToTensor…...

Maven(黑马)

Maven 是一个强大的项目管理和构建自动化工具&#xff0c;主要用于 Java 项目的构建、依赖管理和文档生成。它通过使用 POM&#xff08;Project Object Model&#xff09;文件来管理项目的配置和依赖关系&#xff0c;从而实现项目的自动化构建和管理。以下是 Maven 的一些核心概…...

CppCon 2014 学习:ODB, Advanced Weapons and Tactics

#Schema Evolution 是数据库持久化技术中的一个重要概念&#xff0c;特别是在使用像 ODB 这样的 C ORM 框架时。 展示的代码片段正是 ODB 支持的**模式演化&#xff08;Schema Evolution&#xff09;**语法示例。 什么是 Schema Evolution&#xff1f; Schema Evolution 指的…...

将手机网络经USB数据线和本地局域网共享给华为AP6050DN无线接入点

引言 由于最近装毕的新家所在的小区未能及时通宽带,于是家中各类无线设备如何上网就成了首要要解决的问题。 鉴于家中要联网的设备多、类型杂、支持频段也不一,总是开手机热点不是回事儿,于是就想着把手机网络引至华为AP6050DN无线接入点中,让家中所有的无线设备都能快速高…...

【论文解读】Deformable DETR | Deformable Transformers for End-to-End Object Detection

论文地址&#xff1a;https://arxiv.org/pdf/2010.04159 代码地址&#xff1a;https://github.com/fundamentalvision/Deformable-DETR 摘要 DETR最近被提出&#xff0c;旨在消除物体检测中许多手工设计的组件的需求&#xff0c;同时展示出良好的性能。然而&#xff0c;由于T…...

android 图片背景毛玻璃效果实现

图片背景毛玻璃效果实现 1 依赖 // Glide implementation("com.github.bumptech.glide:glide:4.16.0") kapt("com.github.bumptech.glide:compiler:4.16.0") implementation("jp.wasabeef:glide-transformations:4.3.0") 2 布局<com.googl…...

机器学习----决策树

一、决策树简介 from sklearn.tree import DecisionTreeClassifier from sklearn.tree import plot_tree 决策树是一种树形结构&#xff0c;树中每个内部节点表示一个特征上的判断&#xff0c;每个分支代表一个判断结果的输出&#xff0c;每个叶子节点代表一种分类结果。 决…...

LabVIEW输血袋字符智能检测系统

针对医疗行业输血袋字符检测需求&#xff0c;基于 LabVIEW 图形化开发平台与基恩士&#xff08;KEYENCE&#xff09;机器视觉硬件&#xff0c;构建高精度、高可靠性的字符在线识别系统。通过选用基恩士工业相机、光源及 NI 数据采集设备等硬件&#xff0c;结合 LabVIEW 强大的图…...

数据结构测试模拟题(3)

1、两个有序链表序列的合并 #include<bits/stdc.h> using namespace std;struct node{int num;node* next; };// 创建链表 node* CreatList(){int x;node *head new node(); // 创建头节点head->next NULL;node *tail head; // 尾指针初始指向头节点while…...

理解频域滤波

1 频域滤波基础 对一幅数字图像&#xff0c;基本的频率滤波操作包括&#xff1a; 1&#xff09;将图像变换到频率域&#xff1b; 2&#xff09;根据需要修改频率域数值&#xff1b; 3&#xff09;反变换到图像域。 使用公式表达为 &#xff0c; H(u,v) 为滤波器&#xff08;滤…...

Telerik生态整合:Kendo UI for Angular组件在WinForms应用中的深度嵌入(一)

Telerik DevCraft包含一个完整的产品栈来构建您下一个Web、移动和桌面应用程序。它使用HTML和每个.NET平台的UI库&#xff0c;加快开发速度。Telerik DevCraft提供完整的工具箱&#xff0c;用于构建现代和面向未来的业务应用程序&#xff0c;目前提供UI for ASP.NET MVC、Kendo…...

古老的传说(Player、Stage)是否还能在蓝桥云课ROS中重现-250601(失败)

古老的传说是否还能在蓝桥云课ROS中重现-250601 经典复现何其难&#xff0c;百分之二就凉凉&#xff01; 古老的传说 那是很久很久以前的故事……上个世纪的一个机器人项目 Player、Stage这个项目最早起源于1999年&#xff0c;由美国南加州大学机器人研究实验室开发&#xff0…...

InfluxQL 数据分析实战:聚合、过滤与关联查询全解析

InfluxQL 作为时序数据库的专用查询语言&#xff0c;在处理时间序列数据时展现出独特优势。本文深入探讨 聚合计算、数据过滤和跨测量关联 三大核心操作&#xff0c;通过真实代码示例展示如何从海量时序数据中提取关键洞察。文中涵盖从基础平均值计算到复杂多维度分析的完整流程…...

Qt font + ToolTip + focusPolicy + styleSheet属性(5)

文章目录 font属性API接口直接在Qt Designer编辑图形化界面通过纯代码的方式修改文字属性 ToolTip属性API接口代码演示 focusPolicy属性概念理解API接口通过编辑图形化界面演示 styleSheet属性概念理解通过编辑图形化界面展示代码 图形化界面的方式展示&#xff08;夜间/日间模…...

APM32主控键盘全功能开发实战教程:软件部分

APM32主控键盘全功能开发实战教程&#xff1a;从零基础到RGB矩阵高级玩法 &#x1f525; 前言&#xff1a;随着机械键盘DIY风潮兴起&#xff0c;国产APM32芯片因其高性价比和与STM32的完美兼容性&#xff0c;正逐渐成为键盘开发主控的新宠。本文将手把手带你从最基础的环境搭建…...

docker 部署 gin

编译与执行 ✅「静态编译语言 生成原生二进制文件 操作系统直接执行」 Go 语言之所以在工程部署场景中大受欢迎的核心优势&#xff1a;它直接编译成原生二进制可执行文件&#xff08;binary executable&#xff09;。 &#x1f527; Go 是“静态编译语言”&#xff08;编译型…...