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

《突破控件限制:用Qt绘图API解锁高级界面定制能力》

一、基本概念

虽然 Qt 已经内置了很多的控件,但是不能保证现有控件就可以应对所有场景。很多时候我们需要更强的 “自定制” 能力。

Qt 提供了画图相关的 API,允许我们在窗口上绘制任意的图形形状来完成更复杂的界面设计

  • 所谓的 “控件” 本质上也是通过画图的方式画上去的。

  • 画图 API 和控件之间的关系,可以类比成机器指令和高级语言之间的关系。

  • 控件是对画图 API 的进一步封装,画图 API 是控件的底层实现。

【绘图 API 核心类】

说明
QPainter“绘画者” 或者 “画家” ==> 用来绘图的对象,提供了一系列 drawXXX 方法,可以允许我们绘制各种图形.
QPaintDevice“画板” ==> 描述了 QPainter 把图形画到哪个对象上. 像咱们之前用过的 QWidget 也是一种 QPaintDevice (QWidget 是 QPaintDevice 的子类).
QPen“画笔” ==> 描述了 QPainter 画出来的线是什么样的.
QBrush“画刷” ==> 描述了 QPainter 填充一个区域是什么样的.

绘图 API 的使用一般不会在 QWidget 的构造函数中使用,而是要放到 paintEvent 事件中,在这里进行调用

paintEvent 会在以下情况下被触发:

  • 控件首次创建。

  • 控件被遮挡,再解除遮挡。

  • 窗口最小化,再恢复。

  • 控件大小发生变化时。

  • 主动调用 repaint() 或者 update() 方法(这两个方法都是 QWidget 的方法)。

二、绘制各种形状

1. 绘制线段

void drawLine(const QPoint &p1, const QPoint &p2); 
参数:p1:绘制起点坐标p2:绘制终点坐标void drawLine ( int x1, int y1, int x2, int y2 ); 
参数:x1,y1:绘制起点坐标x2,y2:绘制终点坐标    

【案例】

在 “widget.h” 头文件中声明绘图事件,然后在 “widget.cpp” 文件中重写 paintEvent() 方法,代码如下:

void Widget::paintEvent(QPaintEvent *event)
{(void) event;// 绘图工作就会放到这里来执行.QPainter painter(this);// 画一个线段.painter.drawLine(20, 20, 200, 20);painter.drawLine(QPoint(20, 100), QPoint(200, 100));painter.drawLine(20, 20, 100, 300);
}

实现效果如下:

image-20250203151128560

2. 绘制矩形

void QPainter::drawRect(int x, int y, int width, int height);    
参数:x:窗口横坐标;y:窗口纵坐标;width:所绘制矩形的宽度;height:所绘制矩形的⾼度;

【案例】:和绘制线段操作类似,代码如下:

void Widget::paintEvent(QPaintEvent *event)
{(void) event;QPainter painter(this);// 画一个矩形.painter.drawRect(100, 100, 300, 200);
}

运行程序,如下:

image-20250203151352877

3. 绘制圆形

void QPainter::drawEllipse(const QPoint &center, int rx, int ry) 
参数:center:中⼼点坐标rx:横坐标ry:纵坐标

【案例】:和上面类似,如下:

// 画圆形.
painter.drawEllipse(200, 200, 400, 100);

运行程序,如下:

image-20250203151454098

4. 绘制文本

🔥 QPainter 类中不仅提供了绘制图形的功能,还可以使用 QPainter::drawText() 函数来绘制文字,也可以使用 QPainter::setFont() 设置字体等信息。

【案例】:基于上面类似操作

QFont font("微软雅黑", 24);
painter.setFont(font);
// 绘制文本.
painter.drawText(0, 100, "hello");
  • 注意理解 drawText 中的坐标位置
  • 此处的 0 横坐标:表示 文字 最左侧位置
  • 此处 100 纵坐标:表示 文字 基线位置(英语单词本上四线格从上往下的第三根线)

运行程序,如下:

image-20250203151851081

  • 但是看到这,绘制的形状外貌信息还是太过单调,因此就需要用 画笔 调节

5. 设置画笔

💢 QPainter 在绘制时,是有一个默认的画笔的。在使用时也可以自定义画笔。在 Qt 中,QPen 类中定义了 QPainter 应该如何绘制形状、线条和轮廓。同时通过 QPen 类可以设置画笔的线宽、颜色、样式、画刷等。

画笔的颜色可以在实例化画笔对象时进行设置,画笔的宽度是通过 setWidth() 方法进行设置,画笔的风格是通过 setStyle() 方法进行设置,设置画刷主要是通过 setBrush() 方法。

  • 设置画笔颜色:QPen::QPen(const QColor &color) 画笔的颜色主要是通过 QColor 类设置;
  • 设置画笔宽度:void QPen::setWidth(int width)
  • 设置画笔风格:void QPen::setStyle(Qt::PenStyle style)

画笔的风格有:
img

【案例】:基于之前操作

QPen pen;
// 设置成红色的线条
pen.setColor(QColor(255, 0, 0));
// 设置线条的粗细.
pen.setWidth(5);
// 设置线条的风格
pen.setStyle(Qt::DashLine);// 让 painter 对象应用 pen 对象
painter.setPen(pen);
// 画圆形.
painter.drawEllipse(200, 200, 400, 100);

运行程序,如下:

image-20250203152720652

6. 绘制画刷

在 Qt 中,画刷是使用 QBrush 类来描述,画刷大多用于填充。

  • QBrush 定义了 QPainter 的填充模式,具有样式、颜色、渐变以及纹理等属性。

  • 画刷的格式中定义了 填充 的样式

使用 Qt::BrushStyle 枚举,默认值是 Qt::NoBrush,也就是不进行任何填充

可以通过 Qt 助手查找画刷的格式。如下图示:
img

设置画刷主要通过 void QPen::setBrush(const QBrush &brush) 方法,其参数为画刷的格式。

【案例】:基于之前操作

QBrush brush;
brush.setColor(QColor(0, 255, 0));
brush.setStyle(Qt::SolidPattern);
brush.setStyle(Qt::CrossPattern);
painter.setBrush(brush);// 画圆形.
painter.drawEllipse(200, 200, 400, 100);

运行程序,如下:

image-20250203153024386

三、绘制图片

Qt 提供了四个类来处理图像数据:QImage、QPixmap、QBitmap 和 QPicture

  • 其中QImage主要用来进行 I/O 处理,它对 I/O 处理操作进行了优化,而且可以用来直接访问和操作像素

  • QPixmap 主要用来在屏幕上显示图像,它对屏幕上的显示图像进行优化;

  • QBitmap 是 QPixmap 的子类,用来 处理颜色深度为 1 的图像,即只能显示黑白两种颜色

  • QPicture 用来记录并重演 QPainter 命令。

1. 绘制简单图片

新建项目,并且创建 qrc 文件,引入图片,如下:

image-20250203155201045

在 “widget.h” 头文件中声明绘图事件,然后在 “widget.cpp” 文件中重写 paintEvent() 方法,代码如下:

void Widget::paintEvent(QPaintEvent *event)
{(void) event;QPainter painter(this);//画图片QPixmap pixmap(":/tree.jpg");painter.drawPixmap(100, 100, pixmap); // 位置是相对于左上角
}

运行程序,结果如下:

image-20250203155808583

2. 平移图片

平移图片实际是通过改变坐标来实现。QPainter 类中提供了 *translate()* 函数来实现坐标原点的改变。

painter.translate(100,100);

3. 缩放图片

painter.drawPixmap(0, 0, 400, 300, pixmap);

运行程序,结果如下:

image-20250203155959659

4. 旋转图片

图片的旋转使用的是 QPainter 类中的 rotate() 函数,它默认是 以原点为中心 进行旋转的。如果要改变旋转的中心,可以使用 translate() 函数完成。

img

// 图片旋转:本质是把 QPainer 对象进行旋转,这样绘制内容也发生旋转
painter.rotate(180);
painter.translate(-800, -600);
painter.drawPixmap(100, 100, 400, 300,pixmap);

四、其他设置

1. 移动画家位置

有时候在绘制多个图形时,想使用同一坐标位置,那么绘制出来的图形肯定会重合,此时,可以通过移动画家的位置来使图形不发生重合。

【案例】:

代码如下:

void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);painter.drawEllipse(QPoint(100, 200), 50, 50);painter.translate(100, 100); // 让画家移动painter.drawEllipse(QPoint(100, 200), 50, 50);
}

image-20250203161848456

2. 保存 / 加载画家的状态

在绘制图形的过程中,可以通过 save() 函数来保存画家的状态,使用 restore() 函数还原画家状态。

save() 函数原型如下:

img

restore() 函数原型如下:

img

【案例】如下:

image-20250203162617317

💡说明:

在画第三个圆之前,由于还原了画家的状态,所以此时画家的位置坐标会移动到画家状态保存的地方,所以在绘制第三个圆的位置时实际是和第二个圆发生了 重叠

五、特殊的绘图设备

前面的代码中我们是使用 QWidget 作为绘图设备,在 Qt 中还存在下列三个比较特殊的绘图设备。

  • QPixmap 用于在显示器上显示图片
  • QImage 用于对图片进行像素级修改
  • QPicture 用于对 QPainter 的一系列操作进行存档

1. QPixmap

QPixmap 核心特性:

  • 使用 QPainter 直接在上面进行绘制图形。

  • 通过文件路径加载并显示图片。

  • 搭配 QPainter 的 drawPixmap() 函数,可以把这个图片绘制到⼀个 QLabel、QPushButton 等控件上。

  • 和系统 / 显示设备强相关,不同系统 / 显示设备下,QPixmap 的显示可能 会有所差别

代码如下:

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QPixmap pix(500, 500);QPainter painter(&pix);painter.setPen(Qt::red); // 设置画笔颜色painter.drawEllipse(QPoint(100, 100),100, 100); // 画圆pix.save("D:/C++/qt-learning/Scode/learn9-Painter-tools/pix.png");
}

实现效果:

image-20250203163129239

2. QImage

QImage 的核心特性:

  • 使用 QPainter 直接在上面进行绘制图形。
  • 通过文件路径加载并显示图片。
  • 能够针对图片进行像素级别的操作(操作某个指定的像素)。
  • 独立于硬件的绘制系统,能够在不同系统之上提供一致的显示。

【QImage 作为绘图设备的使用】

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QImage img(500, 500, QImage::Format_RGB32);img.fill(Qt::white); // 填充色:白色,默认为黑色QPainter painter(&img);painter.drawEllipse(QPoint(100, 100),100, 100); // 画圆img.save("D:/C++/qt-learning/Scode/learn9-Painter-tools/img.jpg");
}

实现效果:

image-20250203163857305

【QImage 绘图时对像素的修改】

#include "widget.h"
#include <QPainter>Widget::Widget(QWidget *parent): QWidget(parent)
{
}void Widget::paintEvent(QPaintEvent *)
{QPainter painter(this); // 实例化画家对象QImage img;img.load(":/pic.jpg"); // 加载图片// 修改像素点for(int i = 100; i < 200; i++){for(int j = 100; j < 200; j++){QRgb rgb = qRgb(0, 0, 255);img.setPixel(i, j, rgb);}}painter.drawImage(0, 0, img);
}
  • 通过 setPixel 设置某个像素的颜色值
  • 使用 qRgb 表示一个具体的颜色

3. QPicture

QPicture 核心特性:

  1. 使用 QPainter 直接在上面进行绘制图形。
  2. 通过文件路径加载并显示图片。
  3. 能够记录 QPainter 的操作步骤。
  4. 独立于硬件的绘制系统,能够在不同系统之上提供⼀致的显示。

注意 :QPicture 加载的必须是自身的存档文件,而不能是任意的 png, jpg 等图片文件

如果要记录下 QPainter 的命令

  • 首先要使用 QPainter::begin() 函数,将 QPicture 实例作为参数传递进去,以便告诉系统开始记录
  • 记录完毕后使用 QPainter::end() 命令终止。

img

在这里插入图片描述

相关文章:

《突破控件限制:用Qt绘图API解锁高级界面定制能力》

一、基本概念 虽然 Qt 已经内置了很多的控件&#xff0c;但是不能保证现有控件就可以应对所有场景。很多时候我们需要更强的 “自定制” 能力。 Qt 提供了画图相关的 API&#xff0c;允许我们在窗口上绘制任意的图形形状来完成更复杂的界面设计 所谓的 “控件” 本质上也是通…...

MyBatis-Plus 中BaseMapper接口是如何加速微服务内部开发的?

假设我们有一个简单的微服务项目&#xff0c;需要对 User 实体进行基本的数据库操作。 场景一&#xff1a;使用原生 MyBatis 的开发流程 (作为对比) 定义实体类 (Entity): // package com.yourcompany.usermicroservice.entity; public class User {private Long id;private S…...

AIGC-十款数据分析类智能体完整指令直接用(DeepSeek,豆包,千问,Kimi,GPT)

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列AIGC(GPT、DeepSeek、豆包、千问、Kimi)👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资…...

鸿蒙应用(医院陪诊系统)开发篇1·主页面的tabs布局

引言&#xff1a; 首先可在鸿蒙开发者官网找到DevEco Studio的安装教程。 安装好了之后&#xff0c;我们开始开发。 知识点&#xff1a; tabs布局&#xff0c;鸿蒙官方文档地址&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-contai…...

【大模型】DeepSeek + Coze 打造个人专属AI智能体使用详解

目录 一、前言 二、AI智能体介绍 2.1 什么是AI智能体 2.2 AI智能体核心能力 2.3 AI智能应用场景 三、coze 介绍 3.1 coze是什么 3.1.1 平台概述 3.1.2 平台适用人群 3.2 平台核心功能 3.3 coze可以做什么 3.4 为什么选择coze 四、coze 搭建AI智能体操作实践 4.1 搭…...

7.(vue3.x+vite)弹性布局(flex布局)

1:效果截图 2:代码实现 <template><span style="font-size: 20px">右边固定,左边自适应</span><div class=<...

Python基础总结(五)之字典

文章目录 一、字典的格式二、字典的操作2.1 增加项2.1.1 直接增加项2.1.1 formkeys方法 2.2 删除项2.2.1 clear()方法2.2.2 pop()方法 2.3 修改项2.3.1 直接修改2.3.2 update()方法 2.4 查找项2.4.1 get()方法2.4.2 直接查询2.4.3 items()方法2.4.4 keys()方法2.4.5 values()方…...

MCP简介:重构人机交互底层逻辑

在人工智能技术飞速发展的今天&#xff0c;大语言模型&#xff08;LLM&#xff09;的应用场景正不断拓展&#xff0c;但模型与外部系统之间的连接方式却成为制约其潜力发挥的关键瓶颈。为了解决这一难题&#xff0c;由AI领域顶尖公司Anthropic&#xff08;Claude模型背后的开发…...

LangChain缓存嵌入技术完全指南:CacheBackedEmbedding原理与实践(附代码示例)

一、嵌入缓存技术背景与应用场景 1.1 为什么需要嵌入缓存&#xff1f; 算力消耗问题&#xff1a;现代嵌入模型&#xff08;如text-embedding-3-small&#xff09;单次推理需要约0.5-1秒/文本 资源浪费现状&#xff1a;实际业务中约30%-60%的文本存在重复计算 成本压力&#…...

国产DPU芯片+防火墙,能否引领网络安全新跨越?

近日&#xff0c;国内首款搭载国产DPU芯片的800Gbps下一代防火墙——中科网威NSFW - 12000正式发布&#xff0c;引发行业广泛关注。 国产DPU芯片与防火墙的结合&#xff0c;正在推动网络安全领域实现技术突破与体系升级。以下从技术特性、应用场景和产业价值三个维度分析其引领…...

Spark-SQL与Hive的连接及数据处理全解析

Spark-SQL与Hive的连接及数据处理全解析 在大数据处理领域&#xff0c;Spark-SQL和Hive都是重要的工具。今天就来聊聊Spark-SQL如何连接Hive以及相关的数据处理操作。 Spark-SQL连接Hive有多种方式。内嵌Hive虽然使用简单&#xff0c;直接就能用&#xff0c;但在实际生产中…...

ArcGIS Desktop使用入门(四)——9版本与10版本区别

系列文章目录 ArcGIS Desktop使用入门&#xff08;一&#xff09;软件初认识 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——标准工具 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——编辑器 ArcGIS Desktop使用入门&#xff08;二&#x…...

使用 chromedriver 实现网络爬虫【手抄】

1、引用 selenium 包 <dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.29.0</version> </dependency> <dependency><groupId>org.seleniumhq.seleniu…...

ERROR: Unknown host CPU architecture: arm64

1、先检查NDK版本是否支持arm64&#xff0c;NDK版本21.3以上 2、检查gradle中&#xff0c;有关NDK版本是否设置arm64-v8a 例如&#xff1a; ndkVersion "21.4.7075529"ndk {abiFilters "armeabi-v7a","arm64-v8a"} local.properties中&#x…...

从 SQL2API 到 Text2API:开启数据应用开发的新征程

在技术革新浪潮的席卷下&#xff0c;数据应用开发领域正经历着深刻变革。曾经&#xff0c;构建数据 API 需要开发者具备扎实的数据库知识和编程技能&#xff0c;手动编写复杂的 SQL 查询与 API 代码&#xff0c;这一过程不仅耗时费力&#xff0c;还将众多非技术人员阻挡在数据应…...

OpenCv高阶(四)——角点检测

一、角点检测 在计算机视觉中&#xff0c;角点检测是识别图像中局部区域&#xff08;角点&#xff09;的关键技术&#xff0c;这些区域通常是两条或多条边缘的交点&#xff0c;具有丰富的结构信息&#xff0c;常用于图像匹配、跟踪、三维重建等任务。 Harris角点检测算法是一…...

centos8 部署 openstack

在 CentOS 8 上部署 OpenStack 是一个复杂的过程&#xff0c;涉及多个组件的安装和配置。OpenStack 是一个开源的云计算平台&#xff0c;它提供了基础设施即服务&#xff08;IaaS&#xff09;的功能。下面我将指导你通过基本的步骤来部署 OpenStack。 前提条件 系统要求&#…...

智能云图库-8-AI编辑

一、基础图片编辑​ 需求分析​ 在日常的图片管理中&#xff0c;用户经常需要对图片进行简单处理&#xff0c;比如裁剪多余部分、旋转图片、放大缩小尺寸等。 因此&#xff0c;我们首先要引入基础图片编辑功能&#xff0c;帮助用户快速完成以下操作&#xff1a; 裁剪&#…...

libwebsocket建立服务器需要编写LWS_CALLBACK_ADD_HEADERS事件处理

最近在使用libwebsocket&#xff0c;感觉它搭建Http与websocket服务器比较简单&#xff0c;不像poco库那么庞大&#xff0c;但当我使用它建立websocket服务器后&#xff0c;发现websocket客户端连接一直没有连接成功&#xff0c;不知道什么原因&#xff0c;经过一天的调试&…...

L1-002 打印沙漏

L1-002 打印沙漏 - 团体程序设计天梯赛-练习集 (pintia.cn) 本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”&#xff0c;要求按下列格式打印 ************ *****所谓“沙漏形状”&#xff0c;是指每行输出奇数个符号&#xff1b;各行符号中心对齐&#…...

JSP技术入门指南【一】利用IDEA从零开始搭建你的第一个JSP系统

Jsp技术入门指南【一】利用IDEA从零开始搭建你的第一个JSP系统 前言一、什么是JSP1.1 JSP是干什么的&#xff1f;1.2 JSP与Servlet的关系是什么&#xff1f; 二、在Idea中创建第一个JSP系统三、JSP和HTML的差别3.1 格式区别3.2 注释区别 前言 在前面的内容中&#xff0c;我们已…...

NLP高频面试题(四十四)——RLHF过程中的马尔科夫决策过程及对话场景MDP设计

什么是马尔科夫决策过程(MDP)? 马尔科夫决策过程(MDP)是描述序贯决策问题的数学框架,由五元组( (S, A, P, R, \gamma) )组成,其中: (S):状态集合,描述环境的所有可能状态。(A):动作集合,描述智能体可以采取的所有可能动作。(P):状态转移概率函数,表示从一个状态…...

青少年编程与数学 02-016 Python数据结构与算法 24课题、密码学算法

青少年编程与数学 02-016 Python数据结构与算法 24课题、密码学算法 课题摘要:一、对称加密算法AES&#xff08;高级加密标准&#xff09;DES&#xff08;数据加密标准&#xff09;3DES&#xff08;三重数据加密标准&#xff09; 二、非对称加密算法RSAECC&#xff08;椭圆曲线…...

艺术字体AI生成阿里云WordArt锦书、通义万相、SiliconFlow、Pillow+OpenCV本地生成艺术字体

基于您的需求&#xff0c;结合最新API技术和搜索结果&#xff0c;以下是Python调用主流艺术字API的代码案例及对应充值链接方案&#xff1a; 一、大厂API服务&#xff08;付费方案&#xff09; 1. 阿里云WordArt锦书API # 文字纹理生成&#xff08;需安装dashscope&#xff…...

GIS开发笔记(7)结合osg及osgEarth实现不同高度下的三个圆形区域形成的三维覆盖轮廓区域绘制

一、实现效果如下&#xff1a; 二、实现原理 输入四个坐标点&#xff0c;第一个点为中心点&#xff0c;第二三四个点分别以中心点与地面垂线所在线上的各自高度水平面的交点为圆心旋转360进行圆形区域绘制&#xff0c;然后将三个不同高度上的圆形区域进行结合形成三维覆盖区域…...

解决 Kubernetes 调度器启动报错:缺少 Bind 插件

解决 Kubernetes 调度器启动报错&#xff1a;缺少 Bind 插件 问题描述 在启动自定义 Kubernetes 调度器时&#xff0c;出现了以下错误&#xff1a; I0416 17:08:41.420188 68788 configfile.go:57] "KubeSchedulerConfiguration v1beta2 is deprecated in v1.25, wil…...

Spring Batch 专题系列(六):并行处理与性能优化

1. 引言 在上一篇文章中,我们学习了 Spring Batch 的错误处理机制(Skip、Retry、Restart 和 Listener),掌握了如何提升作业的健壮性。随着数据量的增加,批处理任务的性能成为关键挑战。Spring Batch 提供了强大的并行处理功能,包括多线程 Step、分区(Partitioning)和并…...

WPF 从Main()方法启动

1.去掉App.xaml StartupUri“MainWindow.xaml” 只会让App.g.cs 不生成这行代码&#xff0c;但是还是会生成的App.g.cs文件中生成Main方法 this.StartupUri new System.Uri("MainWindow.xaml", System.UriKind.Relative);默认的App.xaml的生成操作是 应用程序定义…...

记录小程序第一次调用Api,基于腾讯云Serverless函数,实现小程序的成功接入api,以及数据调用

目录 创建腾讯云个人账户新建severless应用建立函数URL小程序中调用api示例 创建腾讯云个人账户 百度搜索即可&#xff0c;并注册 新建severless应用 作者以github下载的某Api为例&#xff0c;这里不展示具体Api&#xff0c;只关注操作即可&#xff0c;相信都是互通的 在腾…...

「数据可视化 D3系列」入门第四章:DOM操作与元素管理

DOM操作与元素管理 核心技能&#xff1a;元素选择与操作一、元素选择&#xff1a;精准定位DOM节点基础选择方法对比进阶选择技巧 二、元素插入&#xff1a;动态构建DOM结构append() vs insert()实际应用示例 三、元素删除&#xff1a;优雅移除DOM节点删除操作最佳实践 四、内容…...

突发重磅消息!!!CVE项目将被取消?

突发重磅消息&#xff01;&#xff01;&#xff01;CVE项目将被取消&#xff1f;突发&#xff01;来自可靠消息来源。MITRE 对 CVE 项目的支持将于明天到期。附件信件已发送给 CVE 董事会成员。https://mp.weixin.qq.com/s/N3qkiHaDfzDuBMK3JbBCjw...

基于uniapp的鸿蒙APP大数据量性能优化

文章目录 一、问题诊断与性能瓶颈分析1.1 大数据场景下的典型性能问题1.2 性能监测工具使用1.2.1 HBuilderX内置分析器1.2.2 鸿蒙DevEco工具链1.2.3 自制性能埋点 二、数据加载优化方案2.1 分页加载实现&#xff08;带错误重试机制&#xff09;2.2 数据流优化策略2.2.1 数据压缩…...

【算法】归并排序

算法系列七&#xff1a;归并排序 一、归并排序的递归探寻 1.思路 2.搭建 2.1设计过掉不符情况&#xff08;在最底层时&#xff09; 2.2查验能实现基础排序&#xff08;在最底层往上点时&#xff09; 2.3跳转结果继续往上回搭 3.实质 4.实现 二、递归的调用栈 1.递归的…...

【JavaScript】二十三、M端事件 + 轮播图Swiper插件

文章目录 1、M端事件2、swiper插件2.1 插件2.2 轮播图插件Swiper的使用 3、案例&#xff1a;学生信息表 1、M端事件 移动端有一个独有的事件&#xff1a;触屏事件 touch(也称触摸事件)&#xff0c;Android 和 IOS 都有&#xff0c;touch 对象代表一个触摸点。触摸点可能是一根…...

【Spring】DI(依赖注入)详解:属性注入@Autowired(超详细)、构造方法注入、Setter注入

1.DI&#xff08;依赖注入&#xff09;介绍 1.1DI是什么&#xff1f; DI&#xff08;Dependency Injection&#xff0c;依赖注入&#xff09; 是 Spring 框架中实现 IoC&#xff08;控制反转&#xff09;的一种核心机制。如果说 IoC 是一种设计思想&#xff0c;告诉我们“把控…...

Spring Boot 中配置 Redis 连接池的详细

目录 一、添加依赖二、配置 Redis 连接池&#xff08;一&#xff09;通过 Java 配置类&#xff08;二&#xff09;通过 application.properties 文件 三、测试 Redis 操作四、总结 一、添加依赖 在 pom.xml 文件中添加以下依赖&#xff1a; <dependencies><dependen…...

系统架构设计师:系统架构概述案例分析与简答题、详细解析与评分要点

10道系统架构概述知识体系案例分析与简答题&#xff0c;涵盖架构设计原则、质量属性、演化过程、评估方法等核心考点&#xff0c;并附详细解析与评分要点&#xff1a; 一、案例分析题&#xff08;5题&#xff09; 1. 电商系统高并发场景下的架构设计 背景&#xff1a;某电商平…...

关于系统架构思考,如何设计实现系统的高可用?

绪论、系统高可用的必要性 系统高可用为了保持业务连续性保障&#xff0c;以及停机成本量化&#xff0c;比如在以前的双十一当天如果出现宕机&#xff0c;那将会损失多少钱&#xff1f;比如最近几年Amazon 2021年30分钟宕机损失$5.6M。当然也有成功的案例&#xff0c;比如异地…...

阿里云短信服务与ASP.NET对接实例

准备工作 注册阿里云账号并开通阿里大于(现称"阿里云短信服务")服务 获取AccessKey ID和AccessKey Secret 申请短信签名和短信模板并审核通过 ASP.NET Web项目集成步骤 1. 安装阿里云SDK 通过NuGet包管理器安装阿里云短信服务SDK&#xff1a; Install-Package…...

【含文档+PPT+源码】基于微信小程序健康管理之健身房管理系统的设计与实现

课程目标&#xff1a; 教你从零开始部署运行项目&#xff0c;学习环境搭建、项目导入及部署&#xff0c;含项目源码、文档、数据库、软件等资料 课程简介&#xff1a; 本课程演示的是一款基于微信小程序健康管理之健身房管理系统的设计与实现&#xff0c;主要针对计算机相关…...

微信小程序转为App实践篇 FinClip

参考下面链接先 开始实践 微信小程序转为App并上架应用市场_微信小程序生成app-CSDN博客 首先在FinClip 官网上下载应用 小程序开发工具下载_小程序sdk下载资源-FinClip资源下载|泰坪小程序开放平台 下载到本地安装 打开导入自己的小程序项目&#xff1b;导入时会解析自己的…...

Qt/C++学习系列之QTreeWidget的简单使用记录

Qt/C学习系列之QTreeWidget的简单使用记录 前言1布局1.1布局要求1.2布局代码 2代码设计2.1整体勾选2.2勾选项确认 总结 前言 自己练手的项目中&#xff0c;需要对多个不同层级的选项进行勾选操作&#xff0c;而想到简洁点的操作方式就是使用QTreeWidget进行布局与应用。这里简…...

标易行项目redis内存中放哪些数据

结合你的项目经验,以下是 标易行投标服务平台 中 Redis 内存存储的核心数据类型及具体应用场景分析: 1. 用户订阅配置与实时推送 场景需求:用户订阅招标商机后,系统需实时推送符合订阅条件(如行业、区域、关键词)的标讯。Redis 存储数据: 订阅规则缓存:以 Hash 存储用户…...

redis 放置序列化的对象,如果修改对象,需要修改版本号吗?

在 Redis 中存储序列化对象时,如果修改了对象的类结构(例如增删字段、修改字段类型或顺序),是否需要修改版本号取决于序列化协议的兼容性策略和业务场景的容错需求。以下是详细分析: 1. 为什么需要考虑版本号? 序列化兼容性问题: 当对象的类结构发生变化时,旧版本的序列…...

MySQL——流程控制

一、IF条件语句 语法 IF condition THENstatements; ELSEIF condition THENstatements; ELSEstatements; END IF; 判断成绩等级 # 判断成绩等级 # 输入学生的编号,取出学生的第一门课&#xff0c;然后判断当前的课程的等级 drop procedure if exists p2; delimiter $$ crea…...

蓝桥杯 1.路径之谜

1.路径之谜 原题目链接 问题描述 小明冒充 X 星球 的骑士&#xff0c;进入了一个奇怪的城堡。城堡里边什么都没有&#xff0c;只有方形石头铺成的地面。假设城堡的地面是 n n 的方格&#xff0c;如下图所示&#xff1a; 骑士要从西北角走到东南角。可以横向或纵向移动&…...

学习笔记十二——Rust 高阶函数彻底入门(超详细过程解析 + 每步数值追踪)

&#x1f4a1; 彻底搞懂 Rust 高阶函数&#xff01;新手最容易卡住的语法 调用流程全讲透&#xff08;含逐步拆解&#xff09; Rust 函数式编程中有一个常见却经常让人懵的概念&#xff1a;高阶函数&#xff08;Higher-Order Function&#xff09; 一看到 fn(i32) -> i32、…...

Spring Cache(笔记)

简介&#xff1a; 常用注解&#xff1a;...

MySQL入门:数据表的创建

​今天我们来介绍一下除HTML外的另一种语言&#xff1a;MySQL语言&#xff1b; MySQL&#xff1a;即一种用于管理和处理关系数据库的标准语言。要用于执行查询、更新、管理数据库中的数据以及定义和操作数据库结构。 接下来我会逐一介绍它的作用以及其中数据表&#xff0c;数据…...

Vue3服务端渲染(SSR)深度调优:架构裂变与性能突围

一、全链路渲染管控系统 1.1 智能DNS路由策略 1.2 区域化渲染成本矩阵 区域计算成本($/h)网络成本($/GB)命中率QoS保障等级北美东部0.240.0892%SLA-99.9亚太东南0.280.1285%SLA-99.5欧洲西部0.310.1588%SLA-99.7南美圣保罗0.350.1878%SLA-99.0 二、多维度缓存治理策略 2.1 量…...