QT绘图项目 - 汽车表盘

目录

前言:

整体代码

widget.h

widget.cpp

效果演示

实现刻度文字正确排版

优化代码

达到效果

封装整理代码结构:

widget.h

widget.cpp

指针样式美化

 优化后的指针API

效果演示

设置高速刻度为红色

 优化刻度API

效果演示

速度显示优化

给内圈画上黑色

优化速度显示文本格式

调整绘画顺序

效果演示

实现内环发光圈:

内环发光效果API

插入位置

效果演示

实现外环发个圈

外环发光效果API

插入位置

实现效果

绘制汽车logo

绘制汽车logo的API

插入位置

实现效果

deBug及微调

bug1: restore()和 save() 没有配对使用

bug2:中间显示的速度不匹配


前言:

 这个表盘在上一个项目"简易表盘"的基础上搭建,请先看上篇:

Qt绘图项目 - 简易表盘-CSDN博客

整体代码

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();protected:void paintEvent(QPaintEvent *event);private:Ui::Widget *ui;QTimer *timer;int currentValue; //实现指针移动int mark = 0; // 控制指针的移动方向int startAbgle; // 设置起始角度double angle;void initCanvas(QPainter& painter);void drawMiddleCircle(QPainter& painter,int radius);void drawCurrentSpeed(QPainter& painter);void drawScale(QPainter& painter,int radius);void drawScaleText(QPainter& painter,int radius);void drawPointLine(QPainter &painter,int length);void drawSpeedPie(QPainter& painter,int radius);void startSpeed();void drawEllispseInnerBlack(QPainter& painter,int radius);void drawEllispseInnerBShine(QPainter& painter,int radius);void drawEllispseOutterBShine(QPainter& painter,int radius);void drawLogo(QPainter& painter,int radius);
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"#include <QPainter>
#include <QTimer>
#include <QtMath>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);setFixedSize(800,600);startAbgle = 150; // 设置起始角度为150startSpeed();}Widget::~Widget()
{delete ui;
}void Widget::initCanvas(QPainter& painter)
{//设置抗锯齿painter.setRenderHints(QPainter::Antialiasing,true);//设置黑色的背景色painter.setBrush(Qt::black); // 设置 黑色的画刷painter.drawRect(rect());//坐标系,平移到中心QPoint cent(rect().width()/2,rect().height()*0.6); //自定义中心位置painter.translate(cent);}void Widget::drawMiddleCircle(QPainter &painter,int radius)
{//画小圆painter.setPen(QPen(Qt::white,4)); //设置白色的画笔painter.drawEllipse(QPoint(0,0),60,60);
}//画当前速度
void Widget::drawCurrentSpeed(QPainter &painter)
{painter.setPen(Qt::white);//显示当前速度值:QFont font("Arial",30);font.setBold(true);painter.setFont(font);painter.drawText(QRect(-60,-60,120,70),Qt::AlignCenter,QString::number(currentValue*4));QFont font2("Arial",13);font2.setBold(true);painter.setFont(font2);painter.drawText(QRect(-60,-60,120,160),Qt::AlignCenter,"Km/h");}// 画出当前刻度
void Widget::drawScale(QPainter &painter,int radius)
{//保存原点:painter.save(); // 三点钟方向//画刻度://1.算出一个刻度需要的角度 270 度分成 50份angle = 240*1.0/60; //需要先转为double类型,否则销售几乎部分会被吞掉造成误差//2.设置起始角度painter.rotate(startAbgle); // 从135度开始//设置字体样式:// painter.setFont(QFont("华文宋体",8));//3.分类讨论 画出所有刻度for(int i=0;i<=60;++i){//包括0-  一共有61根刻度线if(i>=40){  // 时速160 = 40*4 认定为高速painter.setPen(QPen(Qt::red,5)); //将高速速设定为红色}if(i%5 == 0){ // 被5 整除进一步细分表盘//画出一个长刻度painter.drawLine(radius-20,0,radius-3,0);}else{//画出一个长刻度painter.drawLine(radius-10,0,radius-3,0);}painter.rotate(angle);//选择angle的角度准备去画下一个刻度}painter.restore();
}// 写刻度文字
void Widget::drawScaleText(QPainter &painter, int radius)
{//设置字体:QFont font("Arial",13);font.setBold(true); // 设置粗体painter.setFont(font);int r = radius-43;for(int i=0;i<=60;++i){if(i%5 == 0){ // 每5格标记一个刻度//保存坐标系painter.save();//算出平移点  // 弧度 = 角度*3.1415/180int delX =  qCos(qDegreesToRadians(210-angle*i))*r;//QT中sin、cos认的是弧度int delY =  qSin(qDegreesToRadians(210-angle*i))*r;//qDegreesToRadians - 角度转弧度//平移坐标系painter.translate(QPoint(delX,-delY));//旋转坐标系:painter.rotate(-120+angle*i);//angle=4,30*4=120,实参是0,120//写上文字painter.drawText(-25,-25,50,30,Qt::AlignCenter,QString::number(i*4));//恢复坐标系painter.restore();}}}// 画指针
void Widget::drawPointLine(QPainter &painter,int length)
{//画指针 --> 线//先恢复到之前保存的原点:painter.save(); // 接着保存原点// 通过定时器去改变currentValue的值,去控制指针的移动// painter.drawLine(60,0,height()/2-20-38,0); // 58//指针样式美化:painter.setRenderHint(QPainter::Antialiasing,true);painter.setBrush(Qt::white);painter.setPen(Qt::NoPen);//painter.translate(rect().center());static const QPointF points[4] = {QPointF(0,0),QPointF(0,15.0),QPointF(220.0,1.1),QPointF(220.0,-1.1)};//给指针弧度偏移 --> 让指针转动起来painter.rotate(startAbgle+angle*currentValue); // 进行坐标系偏移painter.drawPolygon(points, 4);painter.restore();
}//画扇形
void Widget::drawSpeedPie(QPainter &painter, int radius)
{QRect rentangle(-radius,-radius,radius*2,radius*2);painter.setPen(Qt::NoPen);painter.setBrush(QColor(255,0,0,80));painter.drawPie(rentangle,(-startAbgle)*16,-angle*currentValue*16);
}void Widget::startSpeed()
{timer = new QTimer(this);currentValue = 0;connect(timer,&QTimer::timeout,[=](){if(mark == 0){currentValue++;if(currentValue >= 60)mark = 1;}else if(mark ==1){currentValue--;if(currentValue <= 0)mark = 0;}update(); // 触发绘图事件});timer->start(30);
}// ,给内圈画上黑色
void Widget::drawEllispseInnerBlack(QPainter &painter, int radius)
{painter.setBrush(Qt::black);painter.drawEllipse(QPoint(0,0),radius,radius);
}// 内环发光效果
void Widget::drawEllispseInnerBShine(QPainter &painter, int radius)
{// 径向 渐变实现QRadialGradient radialGradient(0,0,radius);radialGradient.setColorAt(0.0,QColor(255,0,0,200));radialGradient.setColorAt(1.0,QColor(0,0,0,100));painter.setBrush(radialGradient);painter.drawEllipse(QPoint(0,0),radius,radius);
}// 画外围发光圈
void Widget::drawEllispseOutterBShine(QPainter &painter, int radius)
{QRect rentangle(-radius,-radius,radius*2,radius*2);painter.setPen(Qt::NoPen);//渐变色处理外环光亮QRadialGradient radialGradient(0,0,radius);radialGradient.setColorAt(1,QColor(255,0,0,200));radialGradient.setColorAt(0.97,QColor(255,0,0,120));radialGradient.setColorAt(0.9,QColor(0,0,0,0));radialGradient.setColorAt(0,QColor(0,0,0,0));painter.setBrush(radialGradient);painter.drawPie(rentangle,(-150)*16,-angle*60*16);
}// 绘制汽车logo
void Widget::drawLogo(QPainter &painter, int radius)
{QRect rectangle(-65,radius*0.38,130,50);painter.drawPixmap(rectangle,QPixmap(":/C:/Users/31472/Desktop/Images/qi_che_biao_pan/lu_hua.png"));}void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);int rad = height()/2;// 初始化画布initCanvas(painter);//不用画大圆了,用刻度尺去表出框架即可//painter.drawEllipse(QPoint(0,0),height()/2,height()/2);//画出中间的小圆drawMiddleCircle(painter,60);//画刻度drawScale(painter,rad);//写刻度文字:drawScaleText(painter,rad);// 画指针drawPointLine(painter,rad-58);//画扇形drawSpeedPie(painter,rad);//画渐变色发光内圈圆drawEllispseInnerBShine(painter,110);// 画黑色内圈drawEllispseInnerBlack(painter,80);//画出当前速度 -- 放正在画黑的下面,要设置在黑圈的图层下drawCurrentSpeed(painter);//画外环发光圈drawEllispseOutterBShine(painter,rad+15);//画汽车logodrawLogo(painter,rad);}

效果演示

实现刻度文字正确排版

 移动坐标系,达到正确排版

优化代码

//刻度文字达到正确排版效果int r = height()/2-43;painter.restore();for(int i=0;i<=60;++i){if(i%5 == 0){ // 每5格标记一个刻度//保存坐标系painter.save();//算出平移点  // 弧度 = 角度*3.1415/180int delX =  qCos(qDegreesToRadians(210-angle*i))*r;//QT中sin、cos认的是弧度int delY =  qSin(qDegreesToRadians(210-angle*i))*r;//qDegreesToRadians - 角度转弧度//平移坐标系painter.translate(QPoint(delX,-delY));//旋转坐标系:painter.rotate(-120+angle*i);//angle=4,30*4=120,实参是0,120//写上文字painter.drawText(-25,-25,50,30,Qt::AlignCenter,QString::number(i*4));//恢复坐标系painter.restore();}}

达到效果

封装整理代码结构:

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();protected:void paintEvent(QPaintEvent *event);private:Ui::Widget *ui;QTimer *timer;int currentValue; //实现指针移动int mark = 0; // 控制指针的移动方向int startAbgle; // 设置起始角度double angle;void initCanvas(QPainter& painter);void drawMiddleCircle(QPainter& painter,int radius);void drawCurrentSpeed(QPainter& painter);void drawScale(QPainter& painter,int radius);void drawScaleText(QPainter& painter,int radius);void drawPointLine(QPainter &painter,int length);void drawSpeedPie(QPainter& painter,int radius);void startSpeed();
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"#include <QPainter>
#include <QTimer>
#include <QtMath>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);startAbgle = 150; // 设置起始角度为150startSpeed();}Widget::~Widget()
{delete ui;
}void Widget::initCanvas(QPainter& painter)
{//设置抗锯齿painter.setRenderHints(QPainter::Antialiasing,true);//设置黑色的背景色painter.setBrush(Qt::black); // 设置 黑色的画刷painter.drawRect(rect());//坐标系,平移到中心painter.translate(rect().center());}void Widget::drawMiddleCircle(QPainter &painter,int radius)
{//画小圆painter.setPen(QPen(Qt::white,4)); //设置白色的画笔painter.drawEllipse(QPoint(0,0),60,60);
}//画当前速度
void Widget::drawCurrentSpeed(QPainter &painter)
{//显示当前速度值:painter.setFont(QFont("华文宋体",15));painter.drawText(QRect(-60,-60,120,120),Qt::AlignCenter,QString::number(currentValue));}// 画出当前刻度
void Widget::drawScale(QPainter &painter,int radius)
{//保存原点:painter.save(); // 三点钟方向//画刻度://1.算出一个刻度需要的角度 270 度分成 50份angle = 240*1.0/60; //需要先转为double类型,否则销售几乎部分会被吞掉造成误差//2.设置起始角度painter.rotate(startAbgle); // 从135度开始//设置字体样式:// painter.setFont(QFont("华文宋体",8));//3.分类讨论 画出所有刻度for(int i=0;i<=60;++i){//包括0-  一共有61根刻度线if(i%5 == 0){ // 被5 整除进一步细分表盘//画出一个长刻度painter.drawLine(radius-20,0,radius-3,0);}else{//画出一个长刻度painter.drawLine(radius-10,0,radius-3,0);}painter.rotate(angle);//选择angle的角度准备去画下一个刻度}}// 写刻度文字
void Widget::drawScaleText(QPainter &painter, int radius)
{int r = radius-43;painter.restore();for(int i=0;i<=60;++i){if(i%5 == 0){ // 每5格标记一个刻度//保存坐标系painter.save();//算出平移点  // 弧度 = 角度*3.1415/180int delX =  qCos(qDegreesToRadians(210-angle*i))*r;//QT中sin、cos认的是弧度int delY =  qSin(qDegreesToRadians(210-angle*i))*r;//qDegreesToRadians - 角度转弧度//平移坐标系painter.translate(QPoint(delX,-delY));//旋转坐标系:painter.rotate(-120+angle*i);//angle=4,30*4=120,实参是0,120//写上文字painter.drawText(-25,-25,50,30,Qt::AlignCenter,QString::number(i*4));//恢复坐标系painter.restore();}}}// 画指针
void Widget::drawPointLine(QPainter &painter,int length)
{//画指针 --> 线//先恢复到之前保存的原点:painter.restore();painter.save(); // 接着保存原点// 通过定时器去改变currentValue的值,去控制指针的移动painter.rotate(startAbgle+angle*currentValue); // 进行坐标系偏移painter.drawLine(60,0,height()/2-20-38,0); // 58
}//画扇形
void Widget::drawSpeedPie(QPainter &painter, int radius)
{painter.restore();QRect rentangle(-radius,-radius,radius*2,radius*2);painter.setPen(Qt::NoPen);painter.setBrush(QColor(255,128,64,150));painter.drawPie(rentangle,(-startAbgle)*16,-angle*currentValue*16);
}void Widget::startSpeed()
{timer = new QTimer(this);currentValue = 0;connect(timer,&QTimer::timeout,[=](){if(mark == 0){currentValue++;if(currentValue >= 60)mark = 1;}else if(mark ==1){currentValue--;if(currentValue <= 0)mark = 0;}update(); // 触发绘图事件});timer->start(30);
}void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);// 初始化画布initCanvas(painter);//不用画大圆了,用刻度尺去表出框架即可//painter.drawEllipse(QPoint(0,0),height()/2,height()/2);//画出中间的小圆drawMiddleCircle(painter,60);//画出当前速度drawCurrentSpeed(painter);//画刻度drawScale(painter,height()/2);//写刻度文字:drawScaleText(painter,height()/2);// 画指针drawPointLine(painter,height()/2-58);//画扇形drawSpeedPie(painter,height()/2);}

指针样式美化

 优化后的指针API

// 画指针
void Widget::drawPointLine(QPainter &painter,int length)
{//画指针 --> 线//先恢复到之前保存的原点:painter.restore();painter.save(); // 接着保存原点// 通过定时器去改变currentValue的值,去控制指针的移动// painter.drawLine(60,0,height()/2-20-38,0); // 58//指针样式美化:painter.setRenderHint(QPainter::Antialiasing,true);painter.setBrush(Qt::white);painter.setPen(Qt::NoPen);//painter.translate(rect().center());static const QPointF points[4] = {QPointF(0,0),QPointF(0,15.0),QPointF(220.0,1.1),QPointF(220.0,-1.1)};//给指针弧度偏移 --> 让指针转动起来painter.rotate(startAbgle+angle*currentValue); // 进行坐标系偏移painter.drawPolygon(points, 4);}

效果演示

可以看到我们投票通过画多边形的方式对指针进行了美化

设置高速刻度为红色

 优化刻度API

void Widget::drawScale(QPainter &painter,int radius)
{//保存原点:painter.save(); // 三点钟方向//画刻度://1.算出一个刻度需要的角度 270 度分成 50份angle = 240*1.0/60; //需要先转为double类型,否则销售几乎部分会被吞掉造成误差//2.设置起始角度painter.rotate(startAbgle); // 从135度开始//设置字体样式:// painter.setFont(QFont("华文宋体",8));//3.分类讨论 画出所有刻度for(int i=0;i<=60;++i){//包括0-  一共有61根刻度线if(i>=40){  // 时速160 = 40*4 认定为高速painter.setPen(QPen(Qt::red,5)); //将高速速设定为红色}if(i%5 == 0){ // 被5 整除进一步细分表盘//画出一个长刻度painter.drawLine(radius-20,0,radius-3,0);}else{//画出一个长刻度painter.drawLine(radius-10,0,radius-3,0);}painter.rotate(angle);//选择angle的角度准备去画下一个刻度}}

效果演示

//注意我这里设置了字体格式:

    QFont font("Arial",13);
    font.setBold(true); // 设置粗体
    painter.setFont(font);

速度显示优化

给内圈画上黑色

void Widget::drawEllispseInnerBlack(QPainter &painter, int radius)
{painter.setBrush(Qt::black);painter.drawEllipse(QPoint(0,0),radius,radius);
}

优化速度显示文本格式

//画当前速度
void Widget::drawCurrentSpeed(QPainter &painter)
{painter.setPen(Qt::white);//显示当前速度值:QFont font("Arial",30);font.setBold(true);painter.setFont(font);painter.drawText(QRect(-60,-60,120,70),Qt::AlignCenter,QString::number(currentValue));QFont font2("Arial",13);font2.setBold(true);painter.setFont(font2);painter.drawText(QRect(-60,-60,120,160),Qt::AlignCenter,"Km/h");}

调整绘画顺序

void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);// 初始化画布initCanvas(painter);//不用画大圆了,用刻度尺去表出框架即可//painter.drawEllipse(QPoint(0,0),height()/2,height()/2);//画出中间的小圆drawMiddleCircle(painter,60);//画刻度drawScale(painter,height()/2);//写刻度文字:drawScaleText(painter,height()/2);// 画指针drawPointLine(painter,height()/2-58);//画扇形drawSpeedPie(painter,height()/2);// 画黑色内圈drawEllispseInnerBlack(painter,80);//画出当前速度 -- 放正在画黑的下面,要设置在黑圈的图层下drawCurrentSpeed(painter);}

效果演示

实现内环发光圈:

内环发光效果API

void Widget::drawEllispseInnerBShine(QPainter &painter, int radius)
{// 径向 渐变实现QRadialGradient radialGradient(0,0,radius);radialGradient.setColorAt(0.0,QColor(255,0,0,200));radialGradient.setColorAt(1.0,QColor(0,0,0,100));painter.setBrush(radialGradient);painter.drawEllipse(QPoint(0,0),radius,radius);
}

插入位置

效果演示

实现外环发个圈

外环发光效果API

// 画外围发光圈
void Widget::drawEllispseOutterBShine(QPainter &painter, int radius)
{painter.restore();QRect rentangle(-radius,-radius,radius*2,radius*2);painter.setPen(Qt::NoPen);//渐变色处理外环光亮QRadialGradient radialGradient(0,0,radius);radialGradient.setColorAt(1,QColor(255,0,0,200));radialGradient.setColorAt(0.97,QColor(255,0,0,120));radialGradient.setColorAt(0.9,QColor(0,0,0,0));radialGradient.setColorAt(0,QColor(0,0,0,0));painter.setBrush(radialGradient);painter.drawPie(rentangle,(-150)*16,-angle*60*16);
}

插入位置

实现效果

绘制汽车logo的API

//需要先添加资源文件

void Widget::drawLogo(QPainter &painter, int radius)
{QRect rectangle(-65,radius*0.38,130,50);painter.drawPixmap(rectangle,QPixmap(":/C:/Users/31472/Desktop/Images/qi_che_biao_pan/lu_hua.png"));}

插入位置

实现效果

deBug及微调

bug1: restore()和 save() 没有配对使用

处理手段: 把多余的restore()去掉

bug2:中间显示的速度不匹配

处理:

这样修改后得到的速度就是实际值

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

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

相关文章

[modern c++][11] 类型描述库 typeindex

前言&#xff1a; #include <typeindex> typeindex库 包含两个类 std::type_info 和 std::type_index type_info type_info 可以用来接收 typeid 的返回值&#xff0c;常用成员函数如下&#xff1a; hash_code (C11) returns a value which is identical for the same…

python子类调用其他.py文件的父类

main.py需要使用os.py中的构造类。 os.py中定义了一个Ui_MainWindow类 在main.py中定义了一个MyMainWindow子类&#xff0c;传入两个父类的变量名 super(Ui_MainWindow, self).__init__()super() super() 是一个内置函数&#xff0c;用于返回一个代表父类的对象&#xff0c;…

2024/6/19 英语每日一段

From this story, one might imagine Warwick to be opposed to “killing in the name of conservation”; in fact, though, he’s conflicted. Conservation “is really complicated,” he writes. “There is an old saying that anyone who gives you a simple answer to…

涉及缓存数据的知识点

1. cookie 对比过去使用的cookie缓存数据 cookie 是浏览器缓存数据的一种机制&#xff0c;需要在http环境下&#xff0c;才能使用&#xff0c;才能缓存数据&#xff0c;共享数据。还得使用字符串api进行操作。 document.cookie"keyvalue; expiresnew Date(2024-00-00)&…

Linux CFS 调度器 (1):概述

文章目录 1. 前言2. CFS 调度器2.1 概述2.2 一些实现细节2.3 运行队列&#xff1a;红黑树2.4 一些特征2.5 调度策略2.6 调度器类别2.7 扩展&#xff1a;组调度 3. 参考资料 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff…

探索磁力搜索引擎:互联网资源获取的新视角

在当今数字化社会中&#xff0c;寻找和获取网络资源变得更加便捷和多样化。磁力搜索引擎作为这一趋势的一部分&#xff0c;提供了一种新颖而有效的方法来定位和获取用户所需的文件、媒体和其他数字内容。本文将深入探讨磁力搜索引擎的工作原理、使用场景及其在网络文化中的影响…

最快安装zabbix

部署zabbix 6.x 建议使用红帽系统。 https://download.rockylinux.org/pub/rocky/8/isos/x86_64/Rocky-8.9-x86_64-minimal.iso1> 配置安装yum源 [rootzabbix ~]# yum install https://mirrors.huaweicloud.com/zabbix/zabbix/6.2/rhel/8/x86_64/zabbix-release-6.2-3.el8…

Spring框架常用注解(Annotation)收录

Spring框架常用注解(Annotation)收录 Spring框架广泛使用注解来配置和管理Bean&#xff0c;简化了XML配置&#xff0c;提高了开发效率。以下是一些Spring框架中常用的注解&#xff1a; 1. Component, Service, Repository, Controller 用途&#xff1a;这些是组件扫描注解&am…

`kubectl get pod -oyaml` 和 `kubectl describe pod`

kubectl get pod -oyaml 和 kubectl describe pod 这两个命令都用于获取 Pod 的信息&#xff0c;但它们提供信息的方式和内容有所不同&#xff1a; kubectl get pod -oyaml&#xff1a; 这个命令列出指定 Pod 的信息&#xff0c;输出格式为 YAML。输出内容是结构化的&#xff0…

精度丢失引起的支付失败问题

问题描述 在提交订单时候&#xff0c;输入充值金额和优惠码&#xff0c;后台会返回具体的订单信息&#xff0c;如下图&#xff0c;支付金额应该是1 * (1 - 0.09) 0.91&#xff08;这个是理想状态&#xff09;&#xff0c;但是表单显示的是0.90999997&#xff0c; 然后点击确…

架构师篇-1、总体架构设计

业务架构哲学本质 定位&#xff1a;赋予业务架构设计能力&#xff0c;具备业务架构设计思维模型&#xff0c;掌握业务架构哲学本质&#xff0c;形成以不变应万变的业务架构设计能力。 架构师所需要的能力&#xff1a; 带领业务成功通过框架思维赋能业务架构师知识体系构建掌…

PostgreSQL源码分析——pg_archivecleanup

pg_archivecleanup用于清理PostgreSQL WAL归档文件。指定归档目录&#xff0c;指定一个最老的日志段文件&#xff08;在此之前的WAL日志都删掉&#xff09;&#xff0c; 用法如下&#xff1a; postgresslpc:~$ pg_archivecleanup --help pg_archivecleanup removes older WAL …

HDU——2090.算菜价、2091.空心三角形、2093.考试排名

2090.算菜价 题目描述 Problem - 2090 Problem Description 妈妈每天都要出去买菜&#xff0c;但是回来后&#xff0c;兜里的钱也懒得数一数&#xff0c;到底花了多少钱真是一笔糊涂帐。现在好了&#xff0c;作为好儿子&#xff08;女儿&#xff09;的你可以给她用程序算一…

理解前端Cookie中的SameSite属性

SameSite属性是一个相对较新的Cookie属性&#xff0c;它可以帮助防止跨站请求伪造&#xff08;CSRF&#xff09;攻击。SameSite属性用于声明Cookie是否可以在跨站点情况下发送。 SameSite属性有三个可选值&#xff1a;Strict&#xff0c;Lax和None。 SameSiteStrict&#xff1…

Idea Git 解决Filename too long的问题

问题描述&#xff1a; 从远程厂库拉取代码以后&#xff0c;可能是被人的文件名字太长了&#xff0c;本地显示文件已经被删除。 原因&#xff1a; Windows系统下&#xff0c;在Git使用过程中&#xff0c;出现“filename too long”错误提示。直译成中文的意思就是&#xff1a;”…

Adobe XD是否收费?试试这几款超值的免费软件吧!

Adobe XD是一站式的 UX/UI 设计平台&#xff0c;设计师可以使用Adobe XD完成移动应用app界面设计、网页设计、原型设计等。Adobe XD也是一款结合原型和设计&#xff0c;提供工业性能的跨平台设计产品。而Adobebe。 XD跨平台的特点得到了很好的弥补 Sketch 没有 Windows 版本的缺…

网安人必备!开源网络安全工具TOP 10(附下载地址)

工欲善其事&#xff0c;必先利其器。对于广大的网络安全从业者&#xff0c;以及未来想要从事网络安全的人来说&#xff0c;选择并善用合适的网络安全工具&#xff0c;能有效提升工作效率。 开源网络安全工具之所以能够在众多安全解决方案中脱颖而出&#xff0c;不仅是因为它们…

C++ 68 之 类模版作函数的参数

#include <iostream> // #include <cstring> #include <string> using namespace std;template<class T1, class T2> // 可以设置默认的类型值&#xff0c;后面在使用的时候&#xff0c;就不用再指定类型了 class Students08{ public:T1 m_name;T2 m_a…

SysTools MailXaminer: 电子邮件取证调查中的链接分析和时间线分析

天津鸿萌科贸发展有限公司是 SysTools 系列软件的授权代理商。 SysTools MailXaminer 电子邮件取证软件提供全面强大的解决方案&#xff0c;通过简化的操作&#xff0c;从电子邮件客户端、网络邮箱服务器、磁盘镜像、Skype 通讯工具中解密并搜索证据。软件对调查工作的每一阶段…

c++参考std::string自己设计类hstring

目录 一、前言 二、设计需求 三、设计思想 1.功能一 1.功能二 四、设计过程 1.类hstring搭建 2. 实现有参构造函数 3. 实现副本构造函数 4.完整代码 五、结束语 一、前言 在c中有很多的库&#xff0c;但是在有些时候呢&#xff0c;我们一定要学会自己去设计库&#…