QT 底层绘图基础类 QGraphicsRectItem::mousePressEvent(event)

1.QGraphicsRectItem::mousePressEvent(event)

QGraphicsRectItem::mousePressEvent(event) 是 Qt 图形框架中的一个成员函数,属于 QGraphicsRectItem 类。这个函数是用来处理鼠标按下事件的。当你使用 Qt 的图形视图框架(Graphics View Framework)时,QGraphicsRectItem 类允许你创建和管理矩形图形项。

当你重写这个函数时,你可以定义当鼠标在矩形项上按下时应该执行的操作。event 参数是一个 QGraphicsSceneMouseEvent 对象,它包含了事件的相关信息,比如鼠标的位置和哪个按钮被按下。

例如,如果你想让矩形项在鼠标点击时改变颜色,你可以这样重写 mousePressEvent 函数:

复制代码
void MyRectItem::mousePressEvent(QGraphicsSceneMouseEvent *event)  
{  
    // 调用基类的mousePressEvent以确保标准的处理(比如选中)  
    QGraphicsRectItem::mousePressEvent(event);  
  
    // 更改矩形项的颜色  
    setBrush(Qt::blue);  
}

在这个例子中,MyRectItem 是从 QGraphicsRectItem 继承而来的类。当鼠标在 MyRectItem 实例上按下时,这个实例的颜色会变为蓝色。首先,调用基类的 mousePressEvent 函数确保了标准的事件处理(比如选中矩形项)。然后,使用 setBrush 函数更改了矩形项的填充颜色。

2.把一个矩形框,拆分成两个间隔10像素的矩形,矩形使用矩形对象

在Qt中,如果你想要将一个矩形框拆分成两个间隔10像素的矩形,并且使用QRect对象来表示这些矩形,你可以按照以下步骤进行:

  1. 首先,确定原始矩形的大小和位置。
  2. 根据原始矩形的大小和位置,计算出两个新矩形的位置和大小。
  3. 使用QRect对象来表示这两个新矩形。

以下是一个简单的例子,展示了如何在Qt中实现这个功能:

复制代码
#include <QApplication>  
#include <QGraphicsScene>  
#include <QGraphicsView>  
#include <QGraphicsRectItem>  
  
int main(int argc, char *argv[]) {  
    QApplication app(argc, argv);  
  
    // 创建一个场景  
    QGraphicsScene scene;  
  
    // 设定原始矩形的参数  
    int originalX = 10;  
    int originalY = 10;  
    int originalWidth = 100;  
    int originalHeight = 50;  
  
    // 创建一个QGraphicsRectItem作为原始矩形(此处仅为示例,实际上并未添加到场景中)  
    QGraphicsRectItem* originalRectItem = new QGraphicsRectItem(originalX, originalY, originalWidth, originalHeight);  
  
    // 计算拆分后的两个矩形的参数  
    int spacing = 10;  
    int rect1Width = (originalWidth - spacing) / 2;  
    int rect2Width = originalWidth - rect1Width - spacing;  
  
    // 创建两个QGraphicsRectItem对象,分别代表拆分后的矩形  
    QGraphicsRectItem* rectItem1 = new QGraphicsRectItem(originalX, originalY, rect1Width, originalHeight);  
    QGraphicsRectItem* rectItem2 = new QGraphicsRectItem(originalX + rect1Width + spacing, originalY, rect2Width, originalHeight);  
  
    // 将拆分后的矩形添加到场景中  
    scene.addItem(rectItem1);  
    scene.addItem(rectItem2);  
  
    // 创建一个视图来显示场景  
    QGraphicsView view(&scene);  
    view.resize(200, 100);  
    view.show();  
  
    return app.exec();  
}

在这个例子中,我们首先定义了一个原始矩形originalRect,然后计算了两个新矩形rect1rect2的位置和大小。这两个新矩形之间的间隔是10像素,并且它们的高度与原始矩形相同。最后,我们使用qDebug()输出了新矩形的位置和大小。

3.qt 把一个矩形框,拆分成两个间隔10像素的矩形,矩形使用QGraphicsRectItem

在Qt中,若您想将一个矩形框拆分成两个间隔10像素的矩形,并使用QGraphicsRectItem来表示这两个矩形,那么您需要在QGraphicsScene中添加并管理这两个QGraphicsRectItem对象。以下是一个简单的示例,展示了如何实现这一过程:

复制代码
#include <QApplication>  
#include <QGraphicsScene>  
#include <QGraphicsView>  
#include <QGraphicsRectItem>  
  
int main(int argc, char *argv[]) {  
    QApplication app(argc, argv);  
  
    // 创建一个场景  
    QGraphicsScene scene;  
  
    // 设定原始矩形的参数  
    int originalX = 10;  
    int originalY = 10;  
    int originalWidth = 100;  
    int originalHeight = 50;  
  
    // 创建一个QGraphicsRectItem作为原始矩形(此处仅为示例,实际上并未添加到场景中)  
    QGraphicsRectItem* originalRectItem = new QGraphicsRectItem(originalX, originalY, originalWidth, originalHeight);  
  
    // 计算拆分后的两个矩形的参数  
    int spacing = 10;  
    int rect1Width = (originalWidth - spacing) / 2;  
    int rect2Width = originalWidth - rect1Width - spacing;  
  
    // 创建两个QGraphicsRectItem对象,分别代表拆分后的矩形  
    QGraphicsRectItem* rectItem1 = new QGraphicsRectItem(originalX, originalY, rect1Width, originalHeight);  
    QGraphicsRectItem* rectItem2 = new QGraphicsRectItem(originalX + rect1Width + spacing, originalY, rect2Width, originalHeight);  
  
    // 将拆分后的矩形添加到场景中  
    scene.addItem(rectItem1);  
    scene.addItem(rectItem2);  
  
    // 创建一个视图来显示场景  
    QGraphicsView view(&scene);  
    view.resize(200, 100);  
    view.show();  
  
    return app.exec();  
}

在此示例中,我们首先创建了一个QGraphicsScene对象作为容器。接着,我们设定了原始矩形的参数,并计算了拆分后两个矩形的参数。然后,我们创建了两个QGraphicsRectItem对象来代表这两个拆分后的矩形,并将它们添加到场景中。最后,我们创建了一个QGraphicsView对象来显示这个场景。

需要注意的是,虽然此处我们创建了一个originalRectItem来表示原始矩形,但实际上并未将其添加到场景中,因为我们的目的是展示拆分后的两个矩形。如果您也想在场景中显示原始矩形,可以简单地调用scene.addItem(originalRectItem);将其添加。

4.QGraphicsScene

QGraphicsScene是Qt图形框架中的一个核心类,它主要用于提供一个可以容纳和管理大量2D图形项(QGraphicsItem)的场景。以下是关于QGraphicsScene的详细介绍:

一、基本功能

  1. 图形项管理
    • QGraphicsScene可以管理多个QGraphicsItem对象,包括基本形状(如矩形、圆形等)、图片、文本以及自定义的QGraphicsItem子类。
    • 它支持添加、移除和操作这些图形项,提供了如addItem()等函数来实现这些操作。
  2. 坐标系统
    • QGraphicsScene使用自己的坐标系统,与窗口或视图的坐标系统分开,这使得在场景中放置和移动图形项更加灵活。
  3. 事件处理
    • QGraphicsScene能够处理鼠标事件、键盘事件等,可以捕获这些事件并将它们传递给相应的图形项进行处理,实现交互性。
  4. 渲染
    • QGraphicsScene负责管理图形项的绘制,可以将图形项渲染到相关的视图(QGraphicsView)上。
  5. 选择和焦点
    • 支持图形项的选择和焦点管理,可以通过选择和操作图形项来实现交互功能。
  6. 交互
    • 可以处理图形项之间的交互,例如碰撞检测、拖放等。

二、构造函数

QGraphicsScene类提供了多个构造函数,允许开发者根据需要创建具有不同属性的场景:

  • QGraphicsScene(QObject *parent = nullptr):创建一个新的QGraphicsScene对象实例,没有指定场景的大小和位置。
  • QGraphicsScene(qreal x, qreal y, qreal width, qreal height, QObject *parent = nullptr):创建一个具有指定大小和位置的新QGraphicsScene对象实例。
  • QGraphicsScene(const QRectF &sceneRect, QObject *parent = nullptr):根据一个QRectF矩形区域创建一个新的QGraphicsScene对象实例。

三、常用方法和属性

  • 添加图形项 :通过addItem()将现有的QGraphicsItem对象添加到场景中,或者调用便捷函数(如addEllipse()addLine()等)创建并添加图形项。
  • 设置背景 :通过setBackgroundBrush()设置场景的背景颜色或图案。
  • 事件处理 :重写相关的事件处理函数(如mousePressEvent()keyPressEvent()等)来自定义交互行为。
  • 优化性能 :通过setBspTreeDepth()等函数设置场景的索引算法深度,以提高渲染性能。

四、使用场景

QGraphicsScene通常与QGraphicsView一起使用,后者是用于查看和交互场景内容的视图类。开发者可以通过QGraphicsView来可视化整个场景,或者放大并只查看场景中的某一部分。由于QGraphicsScene提供了丰富的功能和灵活的接口,因此它可以用于创建各种图形化应用程序,如绘图工具、游戏和数据可视化等。

五、示例代码

以下是一个简单的示例代码,展示了如何使用QGraphicsSceneQGraphicsView

复制代码
复制代码
#include <QGraphicsScene>  
#include <QGraphicsView>  
#include <QGraphicsRectItem>  
#include <QApplication>  
  
int main(int argc, char *argv[]) {  
    QApplication app(argc, argv);  
  
    // 创建场景  
    QGraphicsScene scene;  
  
    // 添加矩形图形项  
    QGraphicsRectItem *rectangle = new QGraphicsRectItem(0, 0, 100, 100);  
    scene.addItem(rectangle);  
  
    // 创建视图并设置场景  
    QGraphicsView view(&scene);  
  
    // 显示视图  
    view.show();  
  
    return app.exec();  
}

在这个示例中,我们创建了一个QGraphicsScene对象,并在其上添加了一个矩形图形项。然后,我们创建了一个QGraphicsView对象,并将其场景设置为之前创建的QGraphicsScene对象。最后,我们调用了show()函数来显示视图,这样用户就能看到并可能与场景中的图形项进行交互了。

5.QGraphicsView

QGraphicsView是Qt框架中用于显示QGraphicsScene中图形项的部件(widget),它属于Qt图形视图框架中的一个核心组件。以下是对QGraphicsView的详细介绍:

一、概述

QGraphicsView 提供了一个窗口部件,用于在窗口中展示复杂的2D图形场景,包括自定义的图形元素。它是Qt GUI库中的一个关键组件,通过与QGraphicsScene和QGraphicsItem的协同工作,实现了场景与视图的解耦,提供了灵活的图形展示和交互方式。

二、关键特性

  1. 视图与场景分离:QGraphicsView与QGraphicsScene分离,允许一个场景被多个视图观察,每个视图都可以有自己的视角和变换。
  2. 视口与坐标系统:QGraphicsView内部有一个视口,它映射的是场景的部分或全部内容。视口的坐标系统与场景的坐标系统不同,但可以通过变换矩阵相互转换。
  3. 交互功能:QGraphicsView支持丰富的交互功能,如平移、缩放、旋转,用户可以通过鼠标和键盘操作来改变视图的显示。
  4. 滚动条:QGraphicsView可以显示水平和垂直滚动条,以便浏览超出视口大小的场景内容。
  5. 抗锯齿和优化:QGraphicsView支持OpenGL加速和抗锯齿,以提高渲染质量和性能。
  6. 视图变换:QGraphicsView支持通过QTransform类进行复杂的仿射变换,包括平移、缩放、旋转和倾斜。

三、使用方法

  1. 创建QGraphicsScene和QGraphicsView
    • 首先,需要创建一个QGraphicsScene实例,它是所有图形项的容器。
    • 然后,创建一个QGraphicsView实例,并通过setScene()方法将场景设置给视图,或者通过QGraphicsView的构造函数直接关联场景。
  2. 设置QGraphicsView的属性
    • 可以设置渲染提示(如抗锯齿)、拖动模式、视口更新模式等属性,以优化视图的显示效果和性能。
    • 可以重写QGraphicsView的事件处理函数(如mousePressEvent、keyPressEvent等),以实现自定义的交互行为。
  3. 处理用户交互
    • QGraphicsView支持用户通过鼠标和键盘与场景中的图形项进行交互,如移动、缩放、选择等。
    • 可以通过重写QGraphicsItem的事件处理函数来处理图形项之间的交互逻辑。

四、高级技巧

  1. 自定义QGraphicsItem
    • 通过继承QGraphicsItem类并重写其绘制和事件处理函数,可以创建自定义的图形项。
  2. 使用QGraphicsEffect
    • QGraphicsEffect类提供了一系列图形效果,如阴影、模糊等,可以应用于QGraphicsItem上,以增强视觉效果。
  3. 动画效果
    • QGraphicsView和QGraphicsScene支持动画效果,可以通过QPropertyAnimation等类对图形项的属性进行动画处理。

五、应用案例

QGraphicsView广泛应用于需要动态更新、可交互的2D图形化应用程序中,如图表绘制、流程图编辑器、游戏地图显示等。通过结合使用QGraphicsScene和QGraphicsItem,开发者可以创建出高度定制化、性能优良的图形用户界面组件。

六、总结

QGraphicsView是Qt框架中用于显示QGraphicsScene中图形项的重要部件,它提供了灵活的图形展示和交互方式。通过了解其关键特性、使用方法和高级技巧,开发者可以充分利用QGraphicsView来创建丰富的图形用户界面。

6.QGraphicsRectItem

QGraphicsRectItem是Qt框架中图形视图框架(Graphics View Framework)的一部分,它提供了一个矩形图形项,可以添加到QGraphicsScene中用于绘制和显示矩形。以下是关于QGraphicsRectItem的详细介绍:

一、基本属性

  • 类名:QGraphicsRectItem
  • 继承自:QAbstractGraphicsShapeItem
  • 引入头文件:#include <QGraphicsRectItem>
  • 模块:Qt Widgets模块(在qmake项目文件中需要添加QT += widgets)

二、构造函数

QGraphicsRectItem提供了多个构造函数,允许在创建时直接设置矩形的位置和大小:

  • QGraphicsRectItem(qreal x, qreal y, qreal width, qreal height, QGraphicsItem *parent = nullptr)
  • QGraphicsRectItem(const QRectF &rect, QGraphicsItem *parent = nullptr)
  • QGraphicsRectItem(QGraphicsItem *parent = nullptr)

其中,前两个构造函数允许直接指定矩形的位置(x, y)和大小(width, height),或者通过QRectF对象指定整个矩形区域。第三个构造函数创建一个没有初始矩形和父项的QGraphicsRectItem对象。

三、主要功能

  1. 设置矩形
    • 使用setRect(qreal x, qreal y, qreal width, qreal height)setRect(const QRectF &rectangle)函数设置或更改矩形的位置和大小。
    • 使用rect()函数获取当前矩形的位置和大小。
  2. 绘制
    • QGraphicsRectItem使用项目的关联笔刷(通过setBrush()设置)和笔(通过setPen()设置)来绘制矩形。
    • 可以通过重写paint()函数来自定义矩形的绘制方式,但通常不需要这样做,因为QGraphicsRectItem已经提供了足够的绘制功能。
  3. 交互
    • QGraphicsRectItem支持图形视图框架中的交互功能,如移动、缩放、旋转等。这些交互可以通过QGraphicsView和QGraphicsScene提供的机制来实现。
    • 可以通过设置QGraphicsItem的标志(如ItemIsMovableItemIsSelectable等)来控制矩形的交互行为。
  4. 碰撞检测
    • QGraphicsRectItem使用其边界矩形进行基本的碰撞检测。如果需要更复杂的碰撞检测,可以重写shape()函数来提供更准确的形状描述。

四、示例代码

以下是一个简单的示例,展示了如何创建并添加QGraphicsRectItem到QGraphicsScene中:

复制代码
#include <QApplication>  
#include <QGraphicsView>  
#include <QGraphicsScene>  
#include <QGraphicsRectItem>  
  
int main(int argc, char *argv[])  
{  
    QApplication app(argc, argv);  
  
    QGraphicsScene scene;  
    QGraphicsView view(&scene);  
  
    QGraphicsRectItem *rectItem = new QGraphicsRectItem(0, 0, 100, 50); // 创建一个矩形项  
    rectItem->setBrush(Qt::blue); // 设置填充颜色为蓝色  
    rectItem->setPen(Qt::black); // 设置边框颜色为黑色  
    scene.addItem(rectItem); // 将矩形项添加到场景中  
  
    view.show(); // 显示视图  
  
    return app.exec();  
}

在这个示例中,我们首先创建了一个QGraphicsScene对象和一个QGraphicsView对象来显示场景。然后,我们创建了一个QGraphicsRectItem对象,设置了其位置和大小、填充颜色和边框颜色,并将其添加到场景中。最后,我们显示了视图,以便在窗口中看到绘制的矩形。

相关推荐
A.A呐11 小时前
【QT第三章】常用控件2
开发语言·qt
笨笨马甲11 小时前
Qt 实现三维坐标系的方法
开发语言·qt
谁动了我的代码?12 小时前
VNC中使用QT的GDB调试,触发断点时与界面窗口交互导致整个VNC冻结
开发语言·qt·svn
肖恭伟12 小时前
QtCreator Linux ubuntu24.04问题集合
linux·windows·qt
vegetablesssss13 小时前
QT国际化翻译
qt
困死,根本不会14 小时前
Qt Designer 基础操作学习笔记
开发语言·笔记·qt·学习·microsoft
喜欢喝果茶.14 小时前
Qt MQTT部署
开发语言·qt
浅碎时光80714 小时前
Qt 窗口 (菜单 工具栏 状态栏 浮动窗口 对话框)
qt
GIS阵地14 小时前
一场由Qt5 painter的drawRect引起的血雨腥风
开发语言·qt·gis·qgis
娇娇yyyyyy14 小时前
QT编程(8): qt自定义菜单项
qt·microsoft