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对象,设置了其位置和大小、填充颜色和边框颜色,并将其添加到场景中。最后,我们显示了视图,以便在窗口中看到绘制的矩形。

相关推荐
Mr.Q1 小时前
Qt多边形填充/不填充绘制
qt
可峰科技2 小时前
斗破QT编程入门系列之二:认识Qt:编写一个HelloWorld程序(四星斗师)
开发语言·qt
7年老菜鸡3 小时前
策略模式(C++)三分钟读懂
c++·qt·策略模式
huanggang9827 小时前
在Ubuntu22.04上使用Qt Creator开发ROS2项目
qt·ros2
老秦包你会8 小时前
Qt第三课 ----------容器类控件
开发语言·qt
spygg9 小时前
Qt低版本多网卡组播bug
qt·组播·多网卡组播·qt5.7.0
码农客栈9 小时前
qt QWebSocketServer详解
qt
plmm烟酒僧11 小时前
Windows下QT调用MinGW编译的OpenCV
开发语言·windows·qt·opencv
Black_Friend11 小时前
关于在VS中使用Qt不同版本报错的问题
开发语言·qt
CSUC11 小时前
【Qt】QTreeView 和 QStandardItemModel的关系
qt