Qt Graphics View 绘图实例

Qt Graphics View 绘图实例

这个实例程序实现如下功能:

  • 可以创建矩形、椭圆、三角形、梯形、直线、文字等基本图形。
  • 每个图形项都可以被选择和移动。
  • 图形项或整个视图可以缩放和旋转。
  • 图形项重叠时,可以调整前置或后置。
  • 多个图形项可以组合,也可以解散组合。
  • 可以删除选择的图形项。
  • 鼠标在视图上移动时,会在状态栏显示视图坐标和场景坐标。
  • 鼠标单击某个图形是,会显示图形项的局部坐标,也会显示图形项的文字描述和编号。
  • 双击某个图形项时,会显示图形项的类型调用颜色对话框,设置图形项的填充颜色、线条颜色或文字的字体。
  • 选中某个图形项时,可以进行按键操作,Delete 键删除图形项,PageUp 放大, PageDn 缩小,空格键旋转90°,上下左右光标键移动图形项。

"QWGraphicsView.h"  头文件代码如下:

#pragma once#include <QGraphicsView>#include <QObject>class QWGraphicsView : public QGraphicsView
{Q_OBJECTpublic:QWGraphicsView(QWidget *parent);~QWGraphicsView();protected:void mouseMoveEvent(QMouseEvent *event);void mousePressEvent(QMouseEvent *event);void mouseDoubleClickEvent(QMouseEvent *event);void keyPressEvent(QKeyEvent *event);signals:void mouseMovePoint(QPoint point);//鼠标移动void mouseClicked(QPoint point);//鼠标单击void mouseDoubleClick(QPoint point);//双击事件void keyPress(QKeyEvent *event);//按键事件};

       QWGraphicsView 类的 4个事件的实现代码,在每个事件里发射相应的信号。在QWGraphicsView  类里,将鼠标和键盘事件转换为信号,就可以利用信号与槽机制,在主程序里设计槽函数相对应的鼠标和键盘操作进行响应。

鼠标移动事件、鼠标左键按下事件、鼠标双击事件、按键事件

"QWGraphicsView.cpp"  文件代码如下:

#include "QWGraphicsView.h"#include <QMouseEvent>
#include <QPoint>//解决QT中中文显示乱码问题
#pragma execution_character_set("utf-8")QWGraphicsView::QWGraphicsView(QWidget *parent): QGraphicsView(parent)
{
}QWGraphicsView::~QWGraphicsView()
{
}//鼠标移动事件
void QWGraphicsView::mouseMoveEvent(QMouseEvent *event)
{//QPoint  point;QPoint point = event->pos();//QGraphicsView的坐标emit mouseMovePoint(point); //释放信号QGraphicsView::mouseMoveEvent(event);
}//鼠标左键按下事件
void QWGraphicsView::mousePressEvent(QMouseEvent *event)
{if (event->button() == Qt::LeftButton){//QPoint  point;QPoint point = event->pos();//QGraphicsView的坐标emit mouseClicked(point);//释放信号}QGraphicsView::mousePressEvent(event);
}//鼠标双击事件
void QWGraphicsView::mouseDoubleClickEvent(QMouseEvent *event)
{if (event->button() == Qt::LeftButton){//QPoint  point;QPoint point = event->pos(); //QGraphicsView的坐标emit mouseDoubleClick(point);//释放信号}QGraphicsView::mouseDoubleClickEvent(event);
}//按键事件
void QWGraphicsView::keyPressEvent(QKeyEvent *event)
{emit keyPress(event);QGraphicsView::keyPressEvent(event);
}

"sample8_5QGraphicsDraw.h"  头文件代码如下:

#pragma once#include <QtWidgets/QMainWindow>
#include "ui_sample8_5QGraphicsDraw.h"#include <QLabel>
#include <QGraphicsScene>class sample8_5QGraphicsDraw : public QMainWindow
{Q_OBJECTpublic:sample8_5QGraphicsDraw(QWidget *parent = Q_NULLPTR);private:Ui::sample8_5QGraphicsDrawClass ui;private:static const int ItemId = 1;//绘图项自定义数据的keystatic const int ItemDesciption = 2;//绘图项自定义数据的keyint seqNum = 0;int backZ = 0;int frontZ = 0;QGraphicsScene  *scene;QLabel  *labViewCord;QLabel  *labSceneCord;QLabel  *labItemCord;QLabel  *labItemInfo;private slots:void on_mouseMovePoint(QPoint point);//鼠标移动void on_mouseClicked(QPoint point);//鼠标单击void on_mouseDoubleClick(QPoint point);//鼠标双击void on_keyPress(QKeyEvent *event);//按键void on_actItem_Rect_triggered();void on_actItem_Ellipse_triggered();void on_actItem_Polygon_triggered();void on_actEdit_Delete_triggered();void on_actZoomIn_triggered();void on_actZoomOut_triggered();void on_actRestore_triggered();void on_actRotateLeft_triggered();void on_actRotateRight_triggered();void on_actEdit_Front_triggered();void on_actEdit_Back_triggered();void on_actItem_Line_triggered();void on_actItem_Text_triggered();void on_actGroup_triggered();void on_actGroupBreak_triggered();void on_actItem_Circle_triggered();void on_actItem_Triangle_triggered();
};

#include "sample8_5QGraphicsDraw.h"#include    <QGraphicsRectItem>
#include    <QInputDialog>
#include    <QColorDialog>
#include    <QFontDialog>
#include    <QTime>
#include    <QKeyEvent>//解决QT中中文显示乱码问题
#pragma execution_character_set("utf-8")//函数模板
template<class T> void setBrushColor(T *item)
{QColor color = item->brush().color();color = QColorDialog::getColor(color, NULL, "选择填充颜色");if (color.isValid()){item->setBrush(QBrush(color));}
}sample8_5QGraphicsDraw::sample8_5QGraphicsDraw(QWidget *parent)
: QMainWindow(parent)
{ui.setupUi(this);labViewCord = new QLabel("View 坐标:"); //创建状态栏标签labViewCord->setMinimumWidth(150);ui.statusBar->addWidget(labViewCord);labSceneCord = new QLabel("Scene 坐标:");labSceneCord->setMinimumWidth(150);ui.statusBar->addWidget(labSceneCord);labItemCord = new QLabel("Item 坐标:");labItemCord->setMinimumWidth(150);ui.statusBar->addWidget(labItemCord);labItemInfo = new QLabel("ItemInfo: ");labItemInfo->setMinimumWidth(200);ui.statusBar->addWidget(labItemInfo);scene = new QGraphicsScene(-300, -200, 600, 200); //创建QGraphicsSceneui.View->setScene(scene); //与view关联//ui.View->setDragMode(QGraphicsView::RubberBandDrag);ui.View->setCursor(Qt::CrossCursor); //设置鼠标ui.View->setMouseTracking(true); //ui.View->setDragMode(QGraphicsView::RubberBandDrag);this->setCentralWidget(ui.View);QObject::connect(ui.View, SIGNAL(mouseMovePoint(QPoint)),this, SLOT(on_mouseMovePoint(QPoint)));QObject::connect(ui.View, SIGNAL(mouseClicked(QPoint)),this, SLOT(on_mouseClicked(QPoint)));QObject::connect(ui.View, SIGNAL(mouseDoubleClick(QPoint)),this, SLOT(on_mouseDoubleClick(QPoint)));QObject::connect(ui.View, SIGNAL(keyPress(QKeyEvent*)),this, SLOT(on_keyPress(QKeyEvent*)));qsrand(QTime::currentTime().second());
}

鼠标移动事件,point是 GraphicsView的坐标,物理坐标

//鼠标移动事件,point是 GraphicsView的坐标,物理坐标
void sample8_5QGraphicsDraw::on_mouseMovePoint(QPoint point)
{labViewCord->setText(QString::asprintf("View 坐标:%d,%d", point.x(), point.y()));QPointF pointScene = ui.View->mapToScene(point); //转换到Scene坐标labSceneCord->setText(QString::asprintf("Scene 坐标:%.0f,%.0f", pointScene.x(), pointScene.y()));
}

鼠标单击事件

//鼠标单击事件
void sample8_5QGraphicsDraw::on_mouseClicked(QPoint point)
{QPointF pointScene = ui.View->mapToScene(point); //转换到Scene坐标QGraphicsItem  *item = NULL;item = scene->itemAt(pointScene, ui.View->transform()); //获取光标下的绘图项if (item != NULL) //有绘图项{QPointF pointItem = item->mapFromScene(pointScene); //转换为绘图项的局部坐标labItemCord->setText(QString::asprintf("Item 坐标:%.0f,%.0f", pointItem.x(), pointItem.y()));labItemInfo->setText(item->data(ItemDesciption).toString() + ", ItemId=" +item->data(ItemId).toString());}
}

鼠标双击事件,调用相应的对话框,设置填充颜色、线条颜色或字体

//鼠标双击事件,调用相应的对话框,设置填充颜色、线条颜色或字体
void sample8_5QGraphicsDraw::on_mouseDoubleClick(QPoint point)
{QPointF pointScene = ui.View->mapToScene(point); //转换到Scene坐标QGraphicsItem  *item = NULL;item = scene->itemAt(pointScene, ui.View->transform()); //获取光标下的绘图项if (item == NULL) //没有绘图项return;switch (item->type())  //绘图项的类型{case QGraphicsRectItem::Type: //矩形框{//强制类型转换QGraphicsRectItem *theItem = qgraphicsitem_cast<QGraphicsRectItem*>(item);setBrushColor(theItem);break;}case QGraphicsEllipseItem::Type: //椭圆和圆都是 QGraphicsEllipseItem{QGraphicsEllipseItem *theItem;theItem = qgraphicsitem_cast<QGraphicsEllipseItem*>(item);setBrushColor(theItem);break;}case QGraphicsPolygonItem::Type: //梯形和三角形{QGraphicsPolygonItem *theItem = qgraphicsitem_cast<QGraphicsPolygonItem*>(item);setBrushColor(theItem);break;}case QGraphicsLineItem::Type: //直线,设置线条颜色{QGraphicsLineItem *theItem = qgraphicsitem_cast<QGraphicsLineItem*>(item);QPen    pen = theItem->pen();QColor  color = theItem->pen().color();color = QColorDialog::getColor(color, this, "选择线条颜色");if (color.isValid()){pen.setColor(color);theItem->setPen(pen);}break;}case QGraphicsTextItem::Type: //文字,设置字体{QGraphicsTextItem *theItem = qgraphicsitem_cast<QGraphicsTextItem*>(item);QFont font = theItem->font();bool ok = false;font = QFontDialog::getFont(&ok, font, this, "设置字体");if (ok)theItem->setFont(font);break;}}
}

按键事件

//按键事件
void sample8_5QGraphicsDraw::on_keyPress(QKeyEvent *event)
{ if (scene->selectedItems().count() != 1){return; //没有选中的绘图项,或选中的多于1个}QGraphicsItem   *item = scene->selectedItems().at(0);if (event->key() == Qt::Key_Delete)//删除scene->removeItem(item);else if (event->key() == Qt::Key_Space) //顺时针旋转90度item->setRotation(90 + item->rotation());else if (event->key() == Qt::Key_PageUp)//放大item->setScale(0.1 + item->scale());else if (event->key() == Qt::Key_PageDown) //缩小item->setScale(-0.1 + item->scale());else if (event->key() == Qt::Key_Left)  //左移item->setX(-1 + item->x());else if (event->key() == Qt::Key_Right) //右移item->setX(1 + item->x());else if (event->key() == Qt::Key_Up) //上移item->setY(-1 + item->y());else if (event->key() == Qt::Key_Down) //下移item->setY(1 + item->y());
}

添加一个矩形

//添加一个矩形
void sample8_5QGraphicsDraw::on_actItem_Rect_triggered()
{QGraphicsRectItem   *item = new QGraphicsRectItem(-50, -25, 100, 50);//x,y 为左上角的图元局部坐标,图元中心点为0,0item->setFlags(QGraphicsItem::ItemIsMovable| QGraphicsItem::ItemIsSelectable| QGraphicsItem::ItemIsFocusable);item->setBrush(QBrush(Qt::yellow));item->setZValue(++frontZ);item->setPos(-50 + (qrand() % 100), -50 + (qrand() % 100));item->setData(ItemId, ++seqNum);item->setData(ItemDesciption, "矩形");scene->addItem(item);scene->clearSelection();item->setSelected(true);
}

添加一个椭圆

//添加一个椭圆
void sample8_5QGraphicsDraw::on_actItem_Ellipse_triggered()
{QGraphicsEllipseItem   *item = new QGraphicsEllipseItem(-50, -30, 100, 60);item->setFlags(QGraphicsItem::ItemIsMovable| QGraphicsItem::ItemIsSelectable| QGraphicsItem::ItemIsFocusable);item->setBrush(QBrush(Qt::blue)); //填充颜色item->setZValue(++frontZ); //用于叠放顺序item->setPos(-50 + (qrand() % 100), -50 + (qrand() % 100)); //初始位置item->setData(ItemId, ++seqNum);  //自定义数据,ItemId键item->setData(ItemDesciption, "椭圆"); //自定义数据,ItemDesciption键scene->addItem(item);scene->clearSelection();item->setSelected(true);
}

添加一个梯形

//添加一个梯形
void sample8_5QGraphicsDraw::on_actItem_Polygon_triggered()
{QGraphicsPolygonItem   *item = new QGraphicsPolygonItem;QPolygonF   points;points.append(QPointF(-40, -40));points.append(QPointF(40, -40));points.append(QPointF(100, 40));points.append(QPointF(-100, 40));item->setPolygon(points);item->setPos(-50 + (qrand() % 100), -50 + (qrand() % 100));item->setFlags(QGraphicsItem::ItemIsMovable| QGraphicsItem::ItemIsSelectable| QGraphicsItem::ItemIsFocusable);item->setBrush(QBrush(Qt::green));item->setZValue(++frontZ);item->setData(ItemId, ++seqNum);item->setData(ItemDesciption, "梯形");scene->addItem(item);scene->clearSelection();item->setSelected(true);
}

删除所有选中的绘图项

//删除所有选中的绘图项
void sample8_5QGraphicsDraw::on_actEdit_Delete_triggered()
{ int cnt = scene->selectedItems().count();if (cnt > 0)for (int i = 0; i < cnt; i++){QGraphicsItem*  item = scene->selectedItems().at(0);scene->removeItem(item); //删除绘图项}
}

放大

//放大
void sample8_5QGraphicsDraw::on_actZoomIn_triggered()
{int cnt = scene->selectedItems().count();if (cnt == 1){QGraphicsItem   *item;item = scene->selectedItems().at(0);item->setScale(0.1 + item->scale());}else{ui.View->scale(1.1, 1.1);}
}

缩小

//缩小
void sample8_5QGraphicsDraw::on_actZoomOut_triggered()
{int cnt = scene->selectedItems().count();if (cnt == 1){QGraphicsItem   *item;item = scene->selectedItems().at(0);item->setScale(item->scale() - 0.1);}else{ui.View->scale(0.9, 0.9);}
}

取消所有变换

//取消所有变换
void sample8_5QGraphicsDraw::on_actRestore_triggered()
{int cnt = scene->selectedItems().count();if (cnt == 1){QGraphicsItem* item = scene->selectedItems().at(0);//        item->resetTransform();   //不起作用item->setRotation(0);item->setScale(1.0);}else{ui.View->resetTransform();}
}

逆时针旋转、顺时针旋转

//逆时针旋转
void sample8_5QGraphicsDraw::on_actRotateLeft_triggered()
{int cnt = scene->selectedItems().count();if (cnt == 1){QGraphicsItem* item = scene->selectedItems().at(0);item->setRotation(-30 + item->rotation());}else{ui.View->rotate(-30);}
}
//顺时针旋转
void sample8_5QGraphicsDraw::on_actRotateRight_triggered()
{int cnt = scene->selectedItems().count();if (cnt == 1){QGraphicsItem* item = scene->selectedItems().at(0);item->setRotation(+30 + item->rotation());}else{ui.View->rotate(+30);}
}

前置、后置

//bring to front,前置
void sample8_5QGraphicsDraw::on_actEdit_Front_triggered()
{int cnt = scene->selectedItems().count();if (cnt > 0){ //只处理选中的第1个绘图项QGraphicsItem* item = scene->selectedItems().at(0);item->setZValue(++frontZ);}
}//bring to back,后置
void sample8_5QGraphicsDraw::on_actEdit_Back_triggered()
{int cnt = scene->selectedItems().count();if (cnt > 0){//只处理选中的第1个绘图项QGraphicsItem* item = scene->selectedItems().at(0);item->setZValue(--backZ);}}

添加直线

//添加直线
void sample8_5QGraphicsDraw::on_actItem_Line_triggered()
{QGraphicsLineItem   *item = new QGraphicsLineItem(-100, 0, 100, 0);//x,y 为左上角的图元局部坐标,图元中心点为0,0item->setFlags(QGraphicsItem::ItemIsMovable| QGraphicsItem::ItemIsSelectable| QGraphicsItem::ItemIsFocusable);QPen    pen(Qt::red);pen.setWidth(3);item->setPen(pen);item->setZValue(++frontZ);item->setPos(-50 + (qrand() % 100), -50 + (qrand() % 100));item->setData(ItemId, ++seqNum);item->setData(ItemDesciption, "直线");scene->addItem(item);scene->clearSelection();item->setSelected(true);
}

添加文字

//添加文字
void sample8_5QGraphicsDraw::on_actItem_Text_triggered()
{ QString str = QInputDialog::getText(this, "输入文字", "请输入文字");if (str.isEmpty()){return;}QGraphicsTextItem   *item = new QGraphicsTextItem(str);QFont   font = this->font();font.setPointSize(20);font.setBold(true);item->setFont(font);item->setFlags(QGraphicsItem::ItemIsMovable| QGraphicsItem::ItemIsSelectable| QGraphicsItem::ItemIsFocusable);item->setPos(-50 + (qrand() % 100), -50 + (qrand() % 100));item->setZValue(++frontZ);item->setData(ItemId, ++seqNum);item->setData(ItemDesciption, "文字");scene->addItem(item);scene->clearSelection();item->setSelected(true);
}

添加圆形、添加三角形

//添加圆形
void sample8_5QGraphicsDraw::on_actItem_Circle_triggered()
{ QGraphicsEllipseItem   *item = new QGraphicsEllipseItem(-50, -50, 100, 100);item->setFlags(QGraphicsItem::ItemIsMovable| QGraphicsItem::ItemIsSelectable| QGraphicsItem::ItemIsFocusable);item->setBrush(QBrush(Qt::cyan));item->setZValue(++frontZ);item->setPos(-50 + (qrand() % 100), -50 + (qrand() % 100));item->setData(ItemId, ++seqNum);item->setData(ItemDesciption, "圆形");scene->addItem(item);scene->clearSelection();item->setSelected(true);
}//添加三角形
void sample8_5QGraphicsDraw::on_actItem_Triangle_triggered()
{ QGraphicsPolygonItem   *item = new QGraphicsPolygonItem;QPolygonF   points;points.append(QPointF(0, -40));points.append(QPointF(60, 40));points.append(QPointF(-60, 40));item->setPolygon(points);item->setPos(-50 + (qrand() % 100), -50 + (qrand() % 100));item->setFlags(QGraphicsItem::ItemIsMovable| QGraphicsItem::ItemIsSelectable| QGraphicsItem::ItemIsFocusable);item->setBrush(QBrush(Qt::magenta));item->setZValue(++frontZ);item->setData(ItemId, ++seqNum);item->setData(ItemDesciption, "三角形");scene->addItem(item);scene->clearSelection();item->setSelected(true);
}

组合、打散组合

//组合
void sample8_5QGraphicsDraw::on_actGroup_triggered()
{ int cnt = scene->selectedItems().count();if (cnt > 1){QGraphicsItemGroup* group = new QGraphicsItemGroup; //创建组合scene->addItem(group); //组合添加到场景中for (int i = 0; i < cnt; i++){QGraphicsItem* item = scene->selectedItems().at(0);item->setSelected(false); //清除选择虚线框item->clearFocus();group->addToGroup(item); //添加到组合}group->setFlags(QGraphicsItem::ItemIsMovable| QGraphicsItem::ItemIsSelectable| QGraphicsItem::ItemIsFocusable);group->setZValue(++frontZ);//group->clearFocus();scene->clearSelection();group->setSelected(true);}
}//break group,打散组合
void sample8_5QGraphicsDraw::on_actGroupBreak_triggered()
{int cnt = scene->selectedItems().count();if (cnt == 1){QGraphicsItemGroup  *group;group = (QGraphicsItemGroup*)scene->selectedItems().at(0);scene->destroyItemGroup(group);}
}

《Qt5/6 C++开发指南》

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

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

相关文章

TCP socket api详解 续

文章目录 守护进程怎么做到&#xff1f;setsid返回值 dev/null字符文件 daemonTCP协议 退出的时候呢&#xff1f; 会话有很多后台任务&#xff0c;bash肯定会退&#xff0c;那后台会话怎么办呢&#xff1f; 理论上也要退的&#xff0c;但实际上关了bash&#xff0c;bash肯定要…

06_数据类型

数据类型 数据类型分类 JavaScript 语言的每一个值,都属于某一种数据类型。JavaScript 的数据类型,共有六种。(ES6 又新增了第七种 Symbol 类型的值和第八种 BigInt类型,当前课程暂不涉及) 据类型分类 原始类型(基础类型) var age = 20, var name = 尚学堂"; var le…

scrapy豆瓣爬虫增强-批量随机请求头

1.1 豆瓣爬虫增强,中间件随机请求头 1.2 清除原有的中间件,进行中间件测试 1.3 导入全新的中间件 1.4 运行爬虫,这个时候的请求头是固定的 1.5 强化对agent的输出,会舍弃输出cookie,使输出更明了 1.6 转移输出请求头位置 新增输出 造成这样问题的原因是Douban/Douban/settings…

非关系型数据库有哪些特点?

非关系型数据库&#xff08;NoSQL&#xff09;具有以下主要特点‌&#xff1a;‌1 ‌灵活的数据存储方式‌&#xff1a;非关系型数据库不采用传统的基于表格的数据存储方式&#xff0c;而是采用更加灵活的数据存储方式。它可以存储各种类型的数据&#xff0c;包括文本、图像、音…

智慧防汛平台在城市生命线安全建设中的应用

随着城市化进程的加快&#xff0c;城市基础设施的复杂性和互联性不断增强&#xff0c;城市生命线的安全管理面临前所未有的挑战。智慧防汛平台作为城市生命线安全建设的重要组成部分&#xff0c;通过现代信息技术提升城市防汛应急管理的智能化水平&#xff0c;保障城市安全。 …

【ChatGPT大模型开发调用】如何获得 OpenAl API Key?

如何获取 OpenAI API Key 获取 OpenAI API Key 主要有以下三种途径&#xff1a; OpenAI 官方平台 (推荐): 开发者用户可以直接在 OpenAI 官方网站 (platform.openai.com) 注册并申请 API Key。 通常&#xff0c;您可以在账户设置或开发者平台的相关页面找到申请入口。 Azure…

vue3 发送 axios 请求时没有接受到响应数据

<script setup> import Edit from ./components/Edit.vue import axios from axios import { onMounted,ref } from vue// TODO: 列表渲染 //装数据的列表 const list ref([]) const count ref(0) const getList async () > {//通过发送 /list 请求从后端拿到列表数…

衡山派D133EBS 开发环境安装及SDK编译烧写镜像烧录

1.创建新文件夹&#xff0c;用来存放SDK包&#xff08;其实本质就是路径要对就ok了&#xff09;&#xff0c;右键鼠标通过Open Git Bash here来打开git 输入命令 git clone --depth1 https://gitee.com/lcsc/luban-lite.git 来拉取&#xff0c;如下所示&#xff1a;&#xff0…

关于Vscode配置Unity环境时的一些报错问题(持续更新)

第一种报错&#xff1a; 下载net请求超时&#xff08;一般都会超时很正常的&#xff09; 实际时并不需要解决&#xff0c;它对你的项目毫无影响 第二种报错&#xff1a; .net版本不匹配 解决&#xff1a;&#xff08;由于造成问题不一样&#xff0c;所以建议都尝试一次&…

快速理解微服务中Fegin的概念

一.由来 1.在传统的架构里面&#xff0c;我们是通过使用RestTemplate来访问其他的服务&#xff0c;但是这种方式就存在了一个很大的缺陷&#xff0c;也就是被调用方如果发生了服务的迁移(IP和端口发生了变化)&#xff0c;那么调用方也需要同步的在代码里面进行修改&#xff0c;…

【网络安全 | 漏洞挖掘】绕过SAML认证获得管理员面板访问权限

未经许可,不得转载。 文章目录 什么是SAML认证?SAML是如何工作的?SAML响应结构漏洞结果什么是SAML认证? SAML(安全断言标记语言)用于单点登录(SSO)。它是一种功能,允许用户在多个服务之间切换时无需多次登录。例如,如果你已经登录了facebook.com,就不需要再次输入凭…

STM32C011开发(1)----开发板测试

STM32C011开发----1.开发板测试 概述硬件准备视频教学样品申请源码下载参考程序生成STM32CUBEMX串口配置LED配置堆栈设置串口重定向主循环演示 概述 STM32C011F4P6-TSSOP20 评估套件可以使用户能够无缝评估 STM32C0 系列TSSOP20 封装的微控制器功能&#xff0c;基于 ARM Corte…

医院分诊管理系统|Java|SSM|VUE| 前后端分离

【重要1⃣️】前后端源码万字文档部署文档 【重要2⃣️】正版源码有问题包售后 【重要3⃣️】可复制品不支持退换货 【包含内容】 【一】项目提供非常完整的源码注释 【二】相关技术栈文档 【三】源码讲解视频 【其它服务】 【一】可…

Android数据存储——文件存储、SharedPreferences、SQLite、Litepal

数据存储全方案——详解持久化技术 Android系统中主要提供了3中方式用于简单地实现数据持久化功能&#xff0c;即文件存储、SharedPreference存储以及数据库存储。除了这三种方式外&#xff0c;还可以将数据保存在手机的SD卡中&#xff0c;不给使用文件、SharedPreference或者…

vue3 + vite + antdv 项目中自定义图标

前言&#xff1a; 去iconfont-阿里巴巴矢量图标库 下载自己需要的icon图标&#xff0c;下载格式为svg&#xff1b;项目中在存放静态资源的文件夹下 assets 创建一个存放svg格式的图片的文件夹。 步骤&#xff1a; 1、安装vite-plugin-svg-icons npm i vite-plugin-svg-icons …

【H2O2|全栈】Node.js(2)

目录 前言 开篇语 准备工作 npm 概念 常见指令 项目中的包 创建项目 启动项目 服务器搭建 express 基本步骤 搭建应用 创建路由 监听端口 启动服务器 面试相关 结束语 前言 开篇语 本系列博客分享Node.js的相关知识点&#xff0c;本章讲解npm与服务器的简单…

QChart数据可视化

目录 一、QChart基本介绍 1.1 QChart基本概念与用途 1.2 主要类的介绍 1.2.1 QChartView类 1.2.2 QChart类 1.2.3QAbstractSeries类 1.2.4 QAbstractAxis类 1.2.5 QLegendMarker 二、与图表交互 1. 动态绘制数据 2. 深入数据 3. 缩放和滚动 4. 鼠标悬停 三、主题 …

Harbor安装、HTTPS配置、修改端口后不可访问?

Harbor安装、HTTPS配置、修改端口后不可访问&#xff1f; 大家好&#xff0c;我是秋意零。今天分享Harbor相关内容&#xff0c;安装部分可完全参考官方文档&#xff0c;写的也比较详细。 安装Harbor 官方文档&#xff1a;https://goharbor.io/docs/2.12.0/install-config/ …

MTK 展锐 高通 sensorhub架构

一、MTK平台 MTK框架可以分为两部分&#xff0c;AP和SCP。 AP是主芯片&#xff0c;SCP是协处理器&#xff0c;他们一起工作来处理sensor数据。 SCP 是用来处理sensor和audio相关功能和其他客制化需求的一个协处理理器&#xff0c;MTK SCP选择freeRTOS作为操作系统&#xff0c…

JDK的版本演化,JDK要收费吗?

Java版本演化历史 Java的版本历史可以追溯到1995年&#xff0c;以下是Java语言自诞生以来的主要版本及其关键特性&#xff1a; 一、早期版本 Java 1.0&#xff08;1996年1月发布&#xff09; 引入了Java虚拟机&#xff08;JVM&#xff09;和Java应用编程接口&#xff08;API&…