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.mzph.cn/web/61185.shtml

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

相关文章

JDK17源码系列-AbstractCollection接口源码解读

JDK17源码系列-AbstractCollection接口源码解读 1、AbstractCollection类图结构 2、AbstractCollection是实现Collection接口的顶级抽象类 3、模版方法&#xff0c;由子类实现 public abstract Iterator iterator()public abstract int size() 4、实现接口public boolean is…

深入浅出:JVM 的架构与运行机制

一、什么是JVM 1、什么是JDK、JRE、JVM JDK是 Java语言的软件开发工具包&#xff0c;也是整个java开发的核心&#xff0c;它包含了JRE和开发工具包JRE&#xff0c;Java运行环境&#xff0c;包含了JVM和Java的核心类库&#xff08;Java API&#xff09;JVM&#xff0c;Java虚拟…

任意文件读取漏洞(CVE-2024-7928)修复

验证CVE-2024-7928问题是否存在可以使用如下方法&#xff1a; https://域名/index/ajax/lang?lang..//..//目录名/文件名&#xff08;不带后缀&#xff09; 目录名是该项目的一个目录&#xff0c;这里目录位置为nginx设置站点目录为基准&#xff0c;网上两层目录。 文件名…

宠物领养系统的SpringBoot技术探索

摘 要 如今社会上各行各业&#xff0c;都在用属于自己专用的软件来进行工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。互联网的发展&#xff0c;离不开一些新的技术&#xff0c;而新技术的产生往往是为了解决现有问题而产生的。针对于宠物领养…

2-深度学习入门(持续更新)

数据操作 1&#xff09;获取数据&#xff1b;&#xff08;2&#xff09;将数据读入计算机后对其进行处理。 n维数组&#xff0c;也称为张量&#xff08;tensor&#xff09;。 使用过Python中NumPy计算包的读者会对本部分很熟悉。 无论使用哪个深度学习框架&#xff0c;它的张…

HTML CSS JS基础考试题与答案

一、选择题&#xff08;2分/题&#xff09; 1&#xff0e;下面标签中&#xff0c;用来显示段落的标签是&#xff08; d &#xff09;。 A、<h1> B、<br /> C、<img /> D、<p> 2. 网页中的图片文件位于html文件的下一级文件夹img中&#xff0c;…

火山引擎VeDI在AI+BI领域的演进与实践

随着数字化时代的到来&#xff0c;企业对于数据分析与智能决策的需求日益增强。作为新一代企业级数据智能平台&#xff0c;火山引擎数智平台VeDI基于字节跳动多年的“数据驱动”实践经验&#xff0c;也正逐步在AI&#xff08;人工智能&#xff09;与BI&#xff08;商业智能&…

Could not locate device support files.

报错信息&#xff1a;Failure Reason: The device may be running a version of iOS (13.6.1 17G80) that is not supported by this version of Xcode.[missing string: 869a8e318f07f3e2f42e11d435502286094f76de] 问题&#xff1a;xcode15升级到xcode16之后&#xff0c;13.…

数据结构与算法(排序算法)

排序的概念 1. 排序是指将一组数据&#xff0c;按照特定的顺序进行排列的过程。 2. 这个过程通常是为了使数据更加有序&#xff0c;从而更容易进行搜索、比较或其他操作。 常见的排序算法 插入排序 1. 把待排序的记录&#xff0c;按其关键码值的大小&#xff0c;逐个插入到一…

Scala身份证上的秘密以及Map的遍历

object test {def main(args: Array[String]): Unit {val id "42032220080903332x"//1.生日是&#xff1f;//字符串截取val birthday id.substring(10,14) //不包括终点下标println(birthday)val year id.substring(6,10) //println(year)//性别&#xff1a;倒数第…

uni-app 蓝牙开发

一. 前言 Uni-App 是一个使用 Vue.js 开发&#xff08;所有&#xff09;前端应用的框架&#xff0c;能够编译到 iOS、Android、快应用以及各种小程序等多个平台。因此&#xff0c;如果你需要快速开发一款跨平台的应用&#xff0c;比如在 H5、小程序、iOS、Android 等多个平台上…

OminiControl:一个新的FLUX通用控制模型,单个模型实现图像主题控制和深度控制

之前的文章中和大家介绍过Flux团队开源了一系列工具套件&#xff0c;感兴趣的小伙伴可以点击下面链接阅读~ AI图像编辑重大升级&#xff01;FLUX.1 Tools发布&#xff0c;为创作者提供了更强大的控制能力。 OminiControl 也开源了其可控生成模型。OminiControl 是一个最小但功…

使用R的数据包快速获取、调用各种地理数据

数据一直是科学研究绕不开的话题&#xff0c;为了方便快捷的获取各种地理数据&#xff0c;许多R包被开发出来&#xff0c;今天介绍一些方便快捷的数据R包。 rnaturalearth 包使 Natural Earth 数据可用。自然地球特征包括 1&#xff1a;10m、1&#xff1a;50m 和 1&#xff1a…

如何让控件始终处于父容器的居中位置(父容器可任意改变大小)

1、改变父容器大小前 父容器是一个panel&#xff0c;控件是一个按钮button1 1&#xff09;刚开始让button1的左边距离panel的左边缘和button1的右边距离panel的右边缘两个距离相等&#xff1b; 2&#xff09;将button1的Anchor属性设置为None 2、改变父容器大小后 直接改变…

数据类型.

数据类型分类 数值类型 tinyint类型 以tinyint为例所有数值类型默认都是有符号的&#xff0c;无符号的需要在后面加unsignedtinyint的范围在-128~127之间无符号的范围在0~255之间(类比char) create database test_db; use test_db;建表时一定要跟着写上属性 mysql> creat…

[极客大挑战 2019]HardSQL--详细解析

信息搜集 登录系统&#xff0c;有两个可能的注入点&#xff1a; 随便输一下看看传参类型&#xff1a; 都是GET型。 SQL注入 传参 usernameadmin’&password123 传参 usernameadmin&password123’ username和password传参&#xff0c;四种闭合方式只有单引号报错&a…

美国发布《联邦风险和授权管理计划 (FedRAMP) 路线图 (2024-2025)》

文章目录 前言一、战略目标实施背景2010年12月&#xff0c;《改革联邦信息技术管理的25点实施计划》2011年2月&#xff0c;《联邦云计算战略》2011年12月&#xff0c;《关于“云计算环境中的信息系统安全授权”的首席信息官备忘录》2022年12月&#xff0c;《FedRAMP 授权法案》…

【经典论文阅读】Transformer(多头注意力 编码器-解码器)

Transformer attention is all you need 摘要 完全舍弃循环 recurrence 和卷积 convolutions 只依赖于attention mechanisms 【1】Introduction 完全通过注意力机制&#xff0c;draw global dependencies between input and output 【2】Background 1&#xff1a;self-…

python+django自动化平台(一键执行sql) 前端vue-element展示

一、开发环境搭建和配置 pip install mysql-connector-pythonpip install PyMySQL二、django模块目录 dbOperations ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-313.pyc │ ├── admin.cpython-313.pyc │ ├── apps.cpython-313.pyc │ …

[高阶数据结构五] 图的遍历和最小生成树

1.前言 本篇文章是在认识图的基础上进行叙述的&#xff0c;如果你还不知道什么是图&#xff0c;图的存储结构。那么请你先阅读以下文章。 [高阶数据结构四] 初始图论-CSDN博客 本章重点&#xff1a; 本篇主要讲解及模拟实现图的遍历算法--DFS和BFS&#xff0c;以及最小生成树…