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,一经查实,立即删除!

相关文章

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…

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

在当今数字化社会中&#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…

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

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

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

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

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

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

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;我们一定要学会自己去设计库&#…

文件扫描工具都有哪些?职场大佬都在用的文本提取工具大盘点~

回想起刚毕业初入职场那阵子&#xff0c;领导让帮忙把纸质文件扫描提取为文本时&#xff0c;还只会傻乎乎地一点点操作&#xff0c;属实是费劲得很&#xff01; 好在后面受朋友安利&#xff0c;找到了4个能够快速实现文件扫描文字提取的方法&#xff0c;这才让我的办公效率蹭蹭…

关于自学\跳槽\转行做网络安全行业的一些建议

很好&#xff0c;如果你是被题目吸引过来的&#xff0c;那请看完再走&#xff0c;还是有的~ 为什么写这篇文章 如何自学入行&#xff1f;如何小白跳槽&#xff0c;年纪大了如何转行等类似问题 &#xff0c;发现很多人都有这样的困惑。下面的文字其实是我以前的一个回答&#…

MyBatis-For input string: “oqm“ 异常

前言 具体的异常信息如下&#xff1a; Error attempting to get column open_id from result set. Cause: java.lang.NumberFormatException: For input string: "oqmJX5ZPU1KOv-YDt30GNAN-Zefk" 乍一看下其实就是无法把open_id字符串类型转为数字类型进行赋值&…

synchronized原理

当线程释放锁&#xff0c;JMM会把线程对应的本地的内存中的共享变量刷新到内存中 当线程获取锁&#xff0c;JMM会帮其他线程中对应的本地的内存中的共享变量设置未无效&#xff0c;从而监视器保护的临界区的代码必须从内存中读取共享变量。&#xff08;临界区为锁之间的代码&am…

3D模型可视化引擎HOOPS Communicator与Visualize的统一化文件加载解决方案

在当今数字化时代&#xff0c;3D可视化技术已成为工程设计、建筑规划和游戏开发等多个领域的核心技术。Tech Soft 3D公司凭借其创新的HOOPS Communicator和HOOPS Visualize两款开发包&#xff0c;分别针对Web端和桌面端提供了强大的3D可视化解决方案。然而&#xff0c;由于两者…

第三集《唯识与净土》

和尚尼慈悲&#xff01;诸位法师、诸位居士&#xff0c;阿弥陀佛&#xff01; 请大家打开讲义第六面&#xff0c;三、业果强弱。 我们身为一个有情众生&#xff0c;在我们的生命当中&#xff0c;我们曾经出现过很多痛苦的果报&#xff0c;当然也出现过很多安乐的果报&#xff0…

c语言回顾-结构体(2)

前言 前面讲了结构体的概念&#xff0c;定义&#xff0c;赋值&#xff0c;访问等知识&#xff0c;本节内容小编将讲解结构体的内存大小的计算以及通过结构体实现位段&#xff0c;话不多说&#xff0c;直接上干货&#xff01;&#xff01;&#xff01; 1.结构体内存对齐 说到计…

物联网技术-第3章物联网感知技术-3.2定位技术

目录 1.1位置信息和位置服务 1.1.1位置信息 1.1.2位置服务 1.2主流定位系统 1.2.1卫星定位系统&#xff08;Satellite Positioning Systems&#xff09; 1.2.2移动通信蜂窝基站定位&#xff08;Cellular Triangulation or Advanced Forward Link Trilateration&#xff09…