QT:Graphics View的坐标系介绍
在 Qt 的 Graphics View 框架中,存在三种不同的坐标系,分别是 物品坐标系(Item Coordinates)、场景坐标系(Scene Coordinates) 和 视图坐标系(View Coordinates)。这三种坐标系在图形的绘制、定位和交互中起着关键作用,
物品坐标系(Item Coordinates)
定义:物品坐标系是每个 QGraphicsItem 自身的本地坐标系。物品的位置、大小和形状都是基于这个坐标系来定义的。物品坐标系的原点通常位于物品的左上角(对于大多数标准图形项),X 轴向右为正,Y 轴向下为正。
特点:
物品在自身坐标系中的位置是相对固定的,不依赖于其在场景中的位置。
当对物品进行变换(如平移、旋转、缩放)时,这些变换都是在物品坐标系中进行的。
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsRectItem>
#include <QPainter>
#include <QPen>
#include <QFont>// 自定义可绘制坐标系的矩形图形项类
class CoordinateRectItem : public QGraphicsRectItem {
public:CoordinateRectItem(qreal x, qreal y, qreal width, qreal height, QGraphicsItem *parent = nullptr): QGraphicsRectItem(x, y, width, height, parent) {}protected:void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override {// 先调用基类的 paint 方法绘制矩形QGraphicsRectItem::paint(painter, option, widget);// 设置画笔和字体QPen pen(Qt::red);painter->setPen(pen);QFont font;font.setPointSize(8);painter->setFont(font);// 绘制 X 轴painter->drawLine(rect().left(), rect().top(), rect().right(), rect().top());// 绘制 X 轴刻度和标签for (int i = 0; i <= rect().width(); i += 20) {painter->drawLine(rect().left() + i, rect().top(), rect().left() + i, rect().top() + 5);painter->drawText(rect().left() + i - 5, rect().top() - 5, QString::number(i));}// 绘制 Y 轴painter->drawLine(rect().left(), rect().top(), rect().left(), rect().bottom());// 绘制 Y 轴刻度和标签for (int i = 0; i <= rect().height(); i += 20) {painter->drawLine(rect().left(), rect().top() + i, rect().left() + 5, rect().top() + i);painter->drawText(rect().left() - 20, rect().top() + i + 5, QString::number(i));}}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);// 创建场景QGraphicsScene scene;// 创建不旋转的矩形图形项CoordinateRectItem *nonRotatedRectItem = new CoordinateRectItem(0, 0, 100, 50);// 设置不旋转矩形的位置,避免与旋转矩形重叠nonRotatedRectItem->setPos(20, 20);// 让 nonRotatedRectItem 也旋转 60 度nonRotatedRectItem->setRotation(60);scene.addItem(nonRotatedRectItem);// 创建不旋转的矩形图形项CoordinateRectItem *nonRotatedRectItem1 = new CoordinateRectItem(0, 0, 100, 50);// 设置不旋转矩形的位置,避免与旋转矩形重叠nonRotatedRectItem1->setPos(20, 20);scene.addItem(nonRotatedRectItem1);// 创建视图QGraphicsView view(&scene);view.setWindowTitle("Two Rotated Rectangles with Coordinates");view.resize(400, 300);view.show();return app.exec();
}
QApplication:用于管理 Qt 应用程序的资源和事件循环。
QGraphicsScene:表示一个图形场景,用于管理和组织 QGraphicsItem 对象。
QGraphicsView:用于显示 QGraphicsScene 中的内容。
QGraphicsRectItem:表示一个矩形图形项。
QPainter:用于在图形项上进行绘制操作。
QPen:用于设置绘制线条的属性,如颜色、宽度等。
QFont:用于设置绘制文本的字体属性。
CoordinateRectItem :
继承自 QGraphicsRectItem,重写了 paint 方法。
paint 方法的实现步骤如下:
调用基类的 paint 方法绘制矩形。
设置画笔颜色为红色,字体大小为 8 号。
绘制 X 轴和 Y 轴。
以 20 为间隔绘制 X 轴和 Y 轴的刻度,并在刻度旁边绘制对应的坐标值。
创建 QApplication 对象,启动应用程序的事件循环。
创建 QGraphicsScene 对象,用于管理图形项。
创建第一个 CoordinateRectItem 对象 nonRotatedRectItem,设置其位置为 (20, 20),并将其旋转 60 度,然后添加到场景中。
创建第二个 CoordinateRectItem 对象 nonRotatedRectItem1,设置其位置为 (20, 20),不进行旋转操作,直接添加到场景中。
创建 QGraphicsView 对象,关联场景,设置窗口标题和大小,最后显示视图。

在一个图形场景中展示两个矩形,其中一个矩形旋转了 60 度,并且每个矩形内部都绘制了物品坐标系的坐标轴、刻度和标签,方便用户观察矩形的旋转效果和物品坐标系的情况。
场景坐标系(Scene Coordinates)
定义:场景坐标系是整个 QGraphicsScene 的全局坐标系。场景中的所有物品都通过其在场景坐标系中的位置来定位。场景坐标系的原点通常位于场景的左上角,X 轴向右为正,Y 轴向下为正。
特点:
场景坐标系是物品坐标系和视图坐标系之间的桥梁,物品在场景中的位置可以通过其在场景坐标系中的坐标来确定。
场景可以包含多个物品,每个物品在场景坐标系中都有唯一的位置。
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsRectItem>
#include <QGraphicsTextItem>
#include <QPainter>
#include <QPen>
#include <QFont>// 自定义用于绘制场景坐标系的图形项
class SceneCoordinateItem : public QGraphicsItem {
public:SceneCoordinateItem(QGraphicsItem *parent = nullptr) : QGraphicsItem(parent) {}// 定义图形项的边界矩形QRectF boundingRect() const override {// 这里简单设置一个较大的边界矩形,以覆盖可能的场景范围return QRectF(-300, -300, 600, 600);}// 绘制场景坐标系void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override {Q_UNUSED(option);Q_UNUSED(widget);// 设置画笔QPen pen(Qt::black);pen.setWidth(2);painter->setPen(pen);// 设置字体QFont font;font.setPointSize(10);painter->setFont(font);// 绘制 X 轴painter->drawLine(-1000, 0, 1000, 0);// 绘制 X 轴箭头painter->drawLine(980, 10, 1000, 0);painter->drawLine(980, -10, 1000, 0);// 绘制 X 轴刻度和标签for (int i = -1000; i <= 1000; i += 100) {painter->drawLine(i, -5, i, 5);QString label = QString::number(i);painter->drawText(i - 10, 20, label);}// 绘制 Y 轴painter->drawLine(0, -1000, 0, 1000);// 绘制 Y 轴箭头painter->drawLine(-10, 980, 0, 1000);painter->drawLine(10, 980, 0, 1000);// 绘制 Y 轴刻度和标签for (int i = -1000; i <= 1000; i += 100) {painter->drawLine(-5, i, 5, i);QString label = QString::number(i);painter->drawText(-30, i + 5, label);}}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);QGraphicsScene scene;QGraphicsRectItem *originalRectItem = new QGraphicsRectItem(0, 0, 100, 50);QPointF originalPos = QPointF(50, 50); // 记录矩形的原始位置originalRectItem->setPos(originalPos);scene.addItem(originalRectItem);// 为原始矩形添加标记QGraphicsTextItem *originalLabel = new QGraphicsTextItem("Original");originalLabel->setPos(originalPos.x(), originalPos.y() - 20);scene.addItem(originalLabel);// 创建旋转后的矩形QGraphicsRectItem *rotatedRectItem = new QGraphicsRectItem(0, 0, 100, 50);// 以场景坐标系原点为中心旋转矩形 90 度// 先将矩形移动到场景原点rotatedRectItem->setPos(0, 0);rotatedRectItem->setRotation(90);// 计算旋转后的位置QTransform transform;transform.rotate(90);QPointF newPos = transform.map(originalPos);rotatedRectItem->setPos(newPos);scene.addItem(rotatedRectItem);// 为旋转后的矩形添加标记QGraphicsTextItem *rotatedLabel = new QGraphicsTextItem("Rotated");rotatedLabel->setPos(newPos.x(), newPos.y() - 20);scene.addItem(rotatedLabel);// 创建并添加场景坐标系图形项SceneCoordinateItem *coordinateItem = new SceneCoordinateItem();scene.addItem(coordinateItem);QGraphicsView view(&scene);view.show();return app.exec();
}

保留原始矩形:
创建 originalRectItem 表示原始矩形,并将其添加到场景中。
使用 QGraphicsTextItem 创建 originalLabel 作为原始矩形的标记,设置其位置在原始矩形上方,并添加到场景中。
创建旋转后的矩形:
创建 rotatedRectItem 作为旋转后的矩形。
对 rotatedRectItem 进行旋转操作,先将其移动到场景原点,旋转 90 度,再计算并设置旋转后的位置。
使用 QGraphicsTextItem 创建 rotatedLabel 作为旋转后矩形的标记,设置其位置在旋转后矩形上方,并添加到场景中。
绘制场景坐标系:
创建 SceneCoordinateItem 对象 coordinateItem 并添加到场景中,用于绘制场景坐标系。
显示视图:
创建 QGraphicsView 对象 view 并关联场景,最后显示视图。
视图坐标系(View Coordinates)
定义:视图坐标系是 QGraphicsView 窗口的坐标系。视图坐标系的原点位于视图窗口的左上角,X 轴向右为正,Y 轴向下为正。视图坐标系的单位是像素。
特点:
视图坐标系用于确定用户在视图窗口中看到的内容,它与场景坐标系之间通过视图的变换矩阵进行映射。
视图可以对场景进行缩放、平移、旋转等操作,这些操作会改变视图坐标系和场景坐标系之间的映射关系。
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsRectItem>
#include <QGraphicsTextItem>
#include <QPainter>
#include <QPen>
#include <QFont>// 自定义用于绘制视图坐标系的图形项
class ViewCoordinateItem : public QGraphicsItem {
public:ViewCoordinateItem(QGraphicsView* view, QGraphicsItem *parent = nullptr) : QGraphicsItem(parent), view(view) {}// 定义图形项的边界矩形QRectF boundingRect() const override {// 根据视图大小设置边界矩形QSize size = view->size();return QRectF(0, 0, size.width(), size.height());}// 绘制视图坐标系void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override {Q_UNUSED(option);Q_UNUSED(widget);// 设置画笔QPen pen(Qt::red);pen.setWidth(2);painter->setPen(pen);// 设置字体QFont font;font.setPointSize(10);painter->setFont(font);// 获取视图大小QSize size = view->size();// 绘制 X 轴painter->drawLine(0, size.height() / 2, size.width(), size.height() / 2);// 绘制 X 轴箭头painter->drawLine(size.width() - 20, size.height() / 2 - 10, size.width(), size.height() / 2);painter->drawLine(size.width() - 20, size.height() / 2 + 10, size.width(), size.height() / 2);// 绘制 X 轴刻度和标签for (int i = 0; i <= size.width(); i += 50) {painter->drawLine(i, size.height() / 2 - 5, i, size.height() / 2 + 5);QString label = QString::number(i);painter->drawText(i - 10, size.height() / 2 + 20, label);}// 绘制 Y 轴painter->drawLine(size.width() / 2, 0, size.width() / 2, size.height());// 绘制 Y 轴箭头painter->drawLine(size.width() / 2 - 10, size.height() - 20, size.width() / 2, size.height());painter->drawLine(size.width() / 2 + 10, size.height() - 20, size.width() / 2, size.height());// 绘制 Y 轴刻度和标签for (int i = 0; i <= size.height(); i += 50) {painter->drawLine(size.width() / 2 - 5, i, size.width() / 2 + 5, i);QString label = QString::number(i);painter->drawText(size.width() / 2 - 30, i + 5, label);}}private:QGraphicsView* view;
};int main(int argc, char *argv[]) {QApplication app(argc, argv);QGraphicsScene scene;// 设置场景范围小于视图,例如设置场景大小为 300x500scene.setSceneRect(0, 0, 300, 500);// 创建原始矩形框QGraphicsRectItem *originalRectItem = new QGraphicsRectItem(10, 10, 100, 50);originalRectItem->setPos(50, 50);scene.addItem(originalRectItem);// 为原始矩形框添加标记QGraphicsTextItem *originalLabel = new QGraphicsTextItem("Original Rect");originalLabel->setPos(originalRectItem->pos().x(), originalRectItem->pos().y() - 20);scene.addItem(originalLabel);// 创建平移后的矩形框QGraphicsRectItem *translatedRectItem = new QGraphicsRectItem(10, 10, 100, 50);// 将矩形框向左平移 120 个单位translatedRectItem->setPos(50 - 120, 50);scene.addItem(translatedRectItem);// 为平移后的矩形框添加标记QGraphicsTextItem *translatedLabel = new QGraphicsTextItem("Translated Rect");translatedLabel->setPos(translatedRectItem->pos().x(), translatedRectItem->pos().y() - 20);scene.addItem(translatedLabel);QGraphicsView view(&scene);// 对视图进行缩放操作view.scale(2.0, 2.0);// 创建并添加视图坐标系图形项ViewCoordinateItem *coordinateItem = new ViewCoordinateItem(&view);scene.addItem(coordinateItem);view.resize(400, 600);view.show();return app.exec();
}

坐标系之间的转换
在 Graphics View 框架中,可以使用以下方法进行坐标系之间的转换:
物品坐标系和场景坐标系之间的转换:
QGraphicsItem::mapToScene(const QPointF &point):将物品坐标系中的点转换为场景坐标系中的点。
QGraphicsItem::mapFromScene(const QPointF &point):将场景坐标系中的点转换为物品坐标系中的点。
场景坐标系和视图坐标系之间的转换:
QGraphicsView::mapToScene(const QPoint &point):将视图坐标系中的点转换为场景坐标系中的点。
QGraphicsView::mapFromScene(const QPointF &point):将场景坐标系中的点转换为视图坐标系中的点。
QGraphicsItem::mapToScene
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsRectItem>
#include <QGraphicsTextItem>
#include <QDebug>int main(int argc, char *argv[]) {QApplication app(argc, argv);// 创建场景QGraphicsScene scene;// 创建一个矩形图形项QGraphicsRectItem *rectItem = new QGraphicsRectItem(0, 0, 100, 50);// 设置矩形在场景中的位置rectItem->setPos(50, 50);scene.addItem(rectItem);// 在物品坐标系中定义一个点QPointF itemPoint(20, 30);// 将物品坐标系中的点转换为场景坐标系中的点QPointF scenePoint = rectItem->mapToScene(itemPoint);// 输出转换后的场景坐标qDebug() << "Item Coordinate: (" << itemPoint.x() << ", " << itemPoint.y() << ")";qDebug() << "Scene Coordinate: (" << scenePoint.x() << ", " << scenePoint.y() << ")";// 创建一个文本图形项来显示场景坐标QGraphicsTextItem *textItem = new QGraphicsTextItem(QString("Scene Point: (%1, %2)").arg(scenePoint.x()).arg(scenePoint.y()));textItem->setPos(scenePoint);scene.addItem(textItem);// 创建视图QGraphicsView view(&scene);view.show();return app.exec();
}

QGraphicsItem::mapFromScene
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsRectItem>
#include <QGraphicsTextItem>
#include <QDebug>int main(int argc, char *argv[]) {QApplication app(argc, argv);// 创建场景QGraphicsScene scene;// 创建一个矩形图形项QGraphicsRectItem *rectItem = new QGraphicsRectItem(0, 0, 100, 50);// 设置矩形在场景中的位置rectItem->setPos(50, 50);scene.addItem(rectItem);// 在场景坐标系中定义一个点QPointF scenePoint(80, 70);// 将场景坐标系中的点转换为物品坐标系中的点QPointF itemPoint = rectItem->mapFromScene(scenePoint);// 输出转换后的物品坐标qDebug() << "Scene Coordinate: (" << scenePoint.x() << ", " << scenePoint.y() << ")";qDebug() << "Item Coordinate: (" << itemPoint.x() << ", " << itemPoint.y() << ")";// 创建一个文本图形项来显示物品坐标,并将矩形作为其父项QGraphicsTextItem *textItem = new QGraphicsTextItem(QString("Item Point: (%1, %2)").arg(itemPoint.x()).arg(itemPoint.y()), rectItem);textItem->setPos(itemPoint);// 创建视图QGraphicsView view(&scene);view.show();return app.exec();
}

QGraphicsView::mapToScene
#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QMouseEvent>
#include <QDebug>// 自定义的 QGraphicsView 类,用于处理鼠标点击事件
class CustomGraphicsView : public QGraphicsView {
public:CustomGraphicsView(QGraphicsScene *scene, QWidget *parent = nullptr): QGraphicsView(scene, parent) {}protected:// 重写鼠标按下事件处理函数void mousePressEvent(QMouseEvent *event) override {// 获取鼠标在视图中的位置QPoint viewPos = event->pos();// 使用 mapToScene 函数将视图坐标转换为场景坐标QPointF scenePos = mapToScene(viewPos);qDebug() << "View Position: " << viewPos;qDebug() << "Scene Position: " << scenePos;QGraphicsView::mousePressEvent(event);}
};int main(int argc, char *argv[]) {QApplication a(argc, argv);// 创建一个 QGraphicsSceneQGraphicsScene scene;// 在场景中添加一个矩形,方便可视化scene.addRect(10, 10, 200, 200);// 创建自定义的 QGraphicsView,并将场景设置给它CustomGraphicsView view(&scene);view.setScene(&scene);view.resize(500,500);view.show();return a.exec();
}
#include :引入 QApplication 类,它是 Qt 应用程序的核心类,负责管理应用程序的资源和事件循环,每个 Qt GUI 应用程序都必须有且仅有一个 QApplication 对象。
#include :引入 QGraphicsView 类,它是一个用于显示 QGraphicsScene 内容的部件,提供了视图的滚动、缩放等功能。
#include :引入 QGraphicsScene 类,它是一个用于管理和组织图形项(如矩形、椭圆等)的容器,提供了图形项的添加、删除、查找等操作。
#include :引入 QMouseEvent 类,它用于处理鼠标事件,例如鼠标按下、释放、移动等。
#include :引入 QDebug 类,它用于在调试时输出信息,方便开发者查看程序的运行状态。
class CustomGraphicsView : public QGraphicsView 表示 CustomGraphicsView 类继承自 QGraphicsView 类,这样 CustomGraphicsView 就拥有了 QGraphicsView 的所有功能,并且可以对其进行扩展。
void mousePressEvent(QMouseEvent *event) override 重写了 QGraphicsView 的 mousePressEvent 函数,用于处理鼠标按下事件。
QPoint viewPos = event->pos(); 获取鼠标在视图中的位置,event->pos() 返回一个 QPoint 对象,表示鼠标相对于视图窗口的坐标。
QPointF scenePos = mapToScene(viewPos); 使用 mapToScene 函数将视图坐标转换为场景坐标,mapToScene 是 QGraphicsView 提供的一个成员函数,用于将视图坐标系中的点映射到场景坐标系中。
qDebug() << "View Position: " << viewPos; 和 qDebug() << "Scene Position: " << scenePos; 使用 qDebug 输出鼠标在视图和场景中的坐标,方便调试。
QGraphicsView::mousePressEvent(event); 调用基类的 mousePressEvent 函数,确保基类的默认处理逻辑也能正常执行
QApplication a(argc, argv); 创建一个 QApplication 对象,用于管理应用程序的资源和事件循环。
QGraphicsScene scene; 创建一个 QGraphicsScene 对象,用于管理图形项。
scene.addRect(10, 10, 200, 200); 在场景中添加一个矩形,矩形的左上角坐标为 (10, 10),宽度为 200,高度为 200,这样可以方便我们可视化场景的内容。
CustomGraphicsView view(&scene); 创建一个 CustomGraphicsView 对象,并将之前创建的 QGraphicsScene 对象的指针传递给它。
view.setScene(&scene); 将 QGraphicsScene 对象设置给 CustomGraphicsView,这样 CustomGraphicsView 就可以显示 QGraphicsScene 中的内容。
view.resize(500,500); 将 CustomGraphicsView 的大小调整为 500x500 像素。
view.show(); 显示 CustomGraphicsView 窗口。
return a.exec(); 启动应用程序的事件循环,程序会一直运行,直到用户关闭窗口或调用 QApplication::quit() 函数。

创建一个带有自定义鼠标点击事件处理的 QGraphicsView 窗口,显示一个 QGraphicsScene 中的矩形,并在鼠标点击时输出鼠标在视图和场景中的坐标。
QGraphicsView::mapFromScene
函数用于将场景坐标系中的点映射到视图坐标系中。
自定义 CustomGraphicsView 类
继承 QGraphicsView:通过继承 QGraphicsView 类,并重写 mouseMoveEvent 函数来处理鼠标移动事件。
mouseMoveEvent 函数:
QPoint viewPos = event->pos();:获取鼠标在视图中的原始位置。
QPointF scenePos = mapToScene(viewPos);:使用 mapToScene 函数将视图坐标转换为场景坐标。
QPoint convertedViewPos = mapFromScene(scenePos);:使用 mapFromScene 函数将场景坐标转换回视图坐标。
使用 qDebug 输出原始视图坐标、场景坐标以及转换后的视图坐标,方便调试查看。
2. main 函数
创建 QApplication 对象,用于管理应用程序的事件循环。
创建 QGraphicsScene 对象,并添加一个矩形到场景中,方便可视化。
创建 CustomGraphicsView 对象,将场景设置给它,并调整大小和显示。
view.setMouseTracking(true);:启用鼠标跟踪,这样即使鼠标按钮未按下,移动鼠标时也会触发 mouseMoveEvent 函数。
#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QMouseEvent>
#include <QDebug>// 自定义的 QGraphicsView 类,用于处理鼠标移动事件
class CustomGraphicsView : public QGraphicsView {
public:CustomGraphicsView(QGraphicsScene *scene, QWidget *parent = nullptr): QGraphicsView(scene, parent) {}protected:// 重写鼠标移动事件处理函数void mouseMoveEvent(QMouseEvent *event) override {// 获取鼠标在视图中的位置QPoint viewPos = event->pos();// 使用 mapToScene 函数将视图坐标转换为场景坐标QPointF scenePos = mapToScene(viewPos);// 使用 mapFromScene 函数将场景坐标转换回视图坐标QPoint convertedViewPos = mapFromScene(scenePos);qDebug() << "Original View Position: " << viewPos;qDebug() << "Scene Position: " << scenePos;qDebug() << "Converted View Position: " << convertedViewPos;QGraphicsView::mouseMoveEvent(event);}
};int main(int argc, char *argv[]) {QApplication a(argc, argv);// 创建一个 QGraphicsSceneQGraphicsScene scene;// 在场景中添加一个矩形,方便可视化scene.addRect(10, 10, 200, 200);// 创建自定义的 QGraphicsView,并将场景设置给它CustomGraphicsView view(&scene);view.setScene(&scene);view.resize(500, 500);view.show();// 启用鼠标跟踪,这样才能触发 mouseMoveEventview.setMouseTracking(true);return a.exec();
}

使用 Qt 编译器进行编译和运行。运行程序后,当你移动鼠标时,控制台会输出鼠标在视图和场景中的坐标,以及从场景坐标转换回的视图坐标。
相关文章:
QT:Graphics View的坐标系介绍
在 Qt 的 Graphics View 框架中,存在三种不同的坐标系,分别是 物品坐标系(Item Coordinates)、场景坐标系(Scene Coordinates) 和 视图坐标系(View Coordinates)。这三种坐标系在图形…...
C# httpclient 和 Flurl.Http 的测试
关于C#调用接口或Post,Flurl封装了httpclient, CSDN有哥们提供了一个公网的测试网站,可以测试Post调用,我写了2个函数,测试httpclient和Flurl使用Post: async 和 await 是成对使用的,为了接受web异步返回的数据,winfor…...
精选案例展 | 智己汽车—全栈可观测驱动智能化运营与成本优化
本案例为“观测先锋 2024 可观测平台创新应用案例大赛”精选案例,同时荣获IT168“2024技术卓越奖评选-年度创新解决方案”奖。 项目背景 近年来,中国汽车行业进入转型升级阶段,智能网联技术成为行业发展的核心。车联网、自动驾驶等技术的加速…...
阿里云可观测全面拥抱 OpenTelemetry 社区
作者:古琦 在云计算、微服务、容器化等技术重塑 IT 架构的今天,系统复杂度呈指数级增长。在此背景下,开源可观测性技术已从辅助工具演变为现代 IT 系统的"数字神经系统",为企业提供故障预警、性能优化和成本治理的全方…...
剑指 Offer II 032. 有效的变位词
comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20032.%20%E6%9C%89%E6%95%88%E7%9A%84%E5%8F%98%E4%BD%8D%E8%AF%8D/README.md 剑指 Offer II 032. 有效的变位词 题目描述 给定两个字符串 s 和 t ,…...
AcWing 蓝桥杯集训·每日一题2025·密接牛追踪2
密接牛追踪2 农夫约翰有 N 头奶牛排成一排,从左到右依次编号为 1∼N。 不幸的是,有一种传染病正在蔓延。 最开始时,只有一部分奶牛受到感染。 每经过一个晚上,受感染的牛就会将病毒传染给它左右两侧的牛(如果有的话…...
银河麒麟高级服务器操作系统在线调整/pro/{PID}/limits文件中nofile的软限制和硬限制参数值操作方法
银河麒麟高级服务器操作系统在线调整/pro/{PID}/limits文件中nofile的软限制和硬限制参数值操作方法 一 系统环境二 使用场景三 操作步骤 一 系统环境 [rootlocalhost ~]# nkvers ############## Kylin Linux Version ################# Release: Kylin Linux Advanced Server…...
山大软院ai导论实验之采用BP神经网络分类MNIST数据集
目录 实验代码 实验内容 实验代码 import matplotlib.pyplot as plt from matplotlib import font_manager import torch from torch.utils.data import DataLoader import torchvision from torchvision import transforms# 数据预处理 transform transforms.Compose([tra…...
threeJs+vue 轻松切换几何体贴图
嗨,我是小路。今天主要和大家分享的主题是“threeJsvue 轻松切换几何体贴图”。 想象一下,手头上正好有个在线3D家具商店,用户不仅可以看到产品的静态图片,还能实时更换沙发的颜色或材质,获得真实的购物体验。…...
【python】01_写在前面的话
又是爆肝干文的日子,继上次说要出一期Python新手入门教程系列文章后,就在不停地整理和码字,终于是把【基础入门】这一块给写出来了。 不积跬步无以至千里,不积小流无以成江海,一个一个板块的知识积累,早晚你…...
跨平台公式兼容性大模型提示词模板(飞书 + CSDN + Microsoft Word)
飞书云文档 CSDN MD编辑器 Microsoft Word 跨平台公式兼容方案: 一、背景痛点与解决方案 在技术文档创作中,数学公式的跨平台渲染一直存在三大痛点: 飞书云文档:原生KaTeX渲染与导出功能存在语法限制微软Word:Math…...
【Python爬虫(85)】联邦学习:爬虫数据协作的隐私保护新范式
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取ÿ…...
深入理解 并查集LRUCaChe
并查集&LRUCaChe 个人主页:顾漂亮 文章专栏:Java数据结构 1.并查集的原理 在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后根据一定规律将归于同一组元素的…...
最新版本SpringAI接入DeepSeek大模型,并集成Mybatis
当时集成这个环境依赖冲突,搞了好久,分享一下依赖配置 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instan…...
Effective Python:(17)
Effective Python提供90条python编程技巧和秘籍,对于我们养成良好的编程习惯,减少程序出错非常重要。 这条就是一条很好的建议,即尽量使用抛出异常来处理意外情况,尽量不要用none作为返回值进行判断。问题也比较显然,如…...
3-2 WPS JS宏 工作簿的打开与保存(模板批量另存为工作)学习笔记
************************************************************************************************************** 点击进入 -我要自学网-国内领先的专业视频教程学习网站 *******************************************************************************************…...
React + TypeScript 复杂布局开发实战
React TypeScript 复杂布局开发实战 一、项目架构设计(基于最新技术栈) 1.1 技术选型与工程创建 # 使用Vite 5.x React 19 TypeScript 5.4 npx create-vitelatest power-designer-ui --template react-ts cd power-designer-ui && npm inst…...
滑动验证组件-微信小程序
微信小程序-滑动验证组件,直接引用就可以了,效果如下: 组件参数: 1.enable-close:是否允许关闭,默认true 2.bind:onsuccess:验证后回调方法 引用方式: <verification wx:if&qu…...
Linux 命令大全完整版(12)
Linux 命令大全 5. 文件管理命令 ln(link) 功能说明:连接文件或目录。语 法:ln [-bdfinsv][-S <字尾备份字符串>][-V <备份方式>][--help][--version][源文件或目录][目标文件或目录] 或 ln [-bdfinsv][-S <字尾备份字符串>][-V…...
在VSCode中安装jupyter跑.ipynb格式文件
个人用vs用的较多,不习惯在浏览器单独打开jupyter,看着不舒服,直接上教程。 1、在你的环境中pip install ipykernel 2、在vscode的插件中安装jupyter扩展 3、安装扩展后,打开一个ipynb文件,并且在页面右上角配置内核 …...
IDEA配置JSP环境
首先下载IDEA2021.3,因为最新版本不能简单配置web开发环境。然后新建一个java开发项目: 然后右键创建的项目,添加web框架: 选择web appliciation 在web inf文件夹下创建classes和lib文件夹: 点击file ,选择…...
Idea 中 Project Structure简介
在 IntelliJ IDEA 中,Project Structure(项目结构)对话框是一个非常重要的配置界面,它允许你对项目的各个方面进行详细的设置和管理。下面将详细介绍 Project Structure 中各个主要部分的功能和用途。 1. Project(项…...
旁挂负载分担组网场景
旁挂负载分担组网场景(到路由策略) 1.拓扑 2.需求 使用传统三层架构中MSTPVRRP组网形式VLAN 2—>W3,SW4作为备份 VLAN 3—>SW4,SW3作为备份 MSTP设计—>SW3、4、5运行 实例1:VLAN 2 实例2:VLAN 3 3.配置 交换层 SW3配置 抢占延时ÿ…...
网络安全防御模型
目录 6.1 网络防御概述 一、网络防御的意义 二、被动防御技术和主动防御技术 三、网络安全 纵深防御体系 四、主要防御技术 6.2 防火墙基础 一、防火墙的基本概念 二、防火墙的位置 1.防火墙的物理位置 2.防火墙的逻辑位置 3. 防火墙的不足 三、防火墙技术类型 四…...
Qt 开源音视频框架模块之QtAV播放器实践
Qt 开源音视频框架模块QtAV播放器实践 1 摘要 QtAV是一个基于Qt的多媒体框架,旨在简化音视频播放和处理。它是一个跨平台的库,支持多种音视频格式,并提供了一个简单易用的API来集成音视频功能。QtAV的设计目标是为Qt应用程序提供强大的音视…...
MS SQL 2008 技术内幕:T-SQL 语言基础
《MS SQL 2008 技术内幕:T-SQL 语言基础》是一部全面介绍 Microsoft SQL Server 2008 中 T-SQL(Transact-SQL)语言的书籍。T-SQL 是 SQL Server 的扩展版本,增加了编程功能和数据库管理功能,使得开发者和数据库管理员能…...
【Pandas】pandas Series filter
Pandas2.2 Series Computations descriptive stats 方法描述Series.align(other[, join, axis, level, …])用于将两个 Series 对齐,使其具有相同的索引Series.case_when(caselist)用于根据条件列表对 Series 中的元素进行条件判断并返回相应的值Series.drop([lab…...
uake 网络安全 reverse网络安全
🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 本文首发于“合天网安实验室” 首先从PEID的算法分析插件来介绍,要知道不管是在CTF竞赛的REVERSE题目中,还是在实际的商业产品中…...
vue实现根据点击或滑动展示对应高亮
页面需求: 点击左侧版本号,右侧展示对应版本内容并置于顶部右侧某一内容滚动到顶部时,左侧需要展示高亮 实现效果: 实现代码: <template><div><div class"historyBox pd-20 bg-white">…...
Magma:多模态 AI 智体的基础模型
25年2月来自微软研究、马里兰大学、Wisconsin大学、韩国 KAIST 和西雅图华盛顿大学的论文“Magma: A Foundation Model for Multimodal AI Agents”。 Magma 是一个基础模型,可在数字和物理世界中服务于多模态 AI 智体任务。Magma 是视觉-语言 (VL) 模型的重要扩展…...
