一、简述

QGraphicsItem 类是 QGraphicsScene 中所有 item 的基类。

它提供了一个轻量级的基础,用于编写自定义 item。其中包括:定义 item 的几何形状、碰撞检测、绘制实现、通过其事件处理程序进行 item 的交互。QGraphicsItem 是 Qt之图形视图框架的一部分。

二、常见的 QGraphicsItem

为方便起见,Qt为最常见的形状提供了一组典型的标准item。它们是:

  • QGraphicsSimpleTextItem:提供了一个简单的文本标签项
  • QGraphicsTextItem:提供了一个格式化的文本项
  • QGraphicsLineItem:提供了一个直线项
  • QGraphicsPixmapItem:提供了一个图像项
  • QGraphicsRectItem:提供了一个矩形项
  • QGraphicsEllipseItem:提供了一个椭圆项
  • QGraphicsPathItem:提供了一个路径项
  • QGraphicsPolygonItem:提供了一个多边形项

    三、QGraphicsSimpleTextItem

    3.1 详细描述

    QGraphicsSimpleTextItem 提供了一个简单的文本标签项,可以添加到 QGraphicsScene 中。

要设置 item 的文本,可以传递 QStringQGraphicsSimpleTextItem 的构造函数,或在之后调用 setText() 来更改文本。要设置文本填充色,调用 setBrush()

QGraphicsSimpleTextItem 可以具有填充和轮廓,setBrush() 用于设置文本填充(即文本色),setPen() 用于设置绘制文本轮廓的画笔(后者可能很慢,特别是对于复杂的画笔,以及具有长文本内容的 item)。

如果只想绘制一行简单的文本,只需要调用 setBrush(),不需要设置画笔。QGraphicsSimpleTextItem 的画笔默认是Qt::NoPen

QGraphicsSimpleTextItem 使用文本的格式化大小和相关联的字体,为 boundingRect()shape()contains() 提供了一个合理的实现。可以通过调用 setFont() 设置字体。

QGraphicsSimpleText 不显示富文本,相反,可以使用 QGraphicsTextItem,它提供全文控制功能。

QGraphicsSimpleTextItem-1.png

3.2 示例

image.png

  1. #include <QFont>
  2. #include <QGraphicsScene>
  3. #include <QGraphicsSimpleTextItem>
  4. #include <QGraphicsView>
  5. #include <QLayout>
  6. #include <QString>
  7. Widget::Widget(QWidget* parent)
  8. : QWidget(parent)
  9. , ui(new Ui::Widget)
  10. {
  11. ui->setupUi(this);
  12. QGraphicsSimpleTextItem* pItem = new QGraphicsSimpleTextItem();
  13. pItem->setText(tr("this is a example"));
  14. // 字体
  15. QFont font = pItem->font();
  16. font.setPixelSize(20); //像素大小
  17. font.setItalic(true); // 斜体
  18. // 设置item的字体和颜色
  19. pItem->setFont(font);
  20. pItem->setBrush(QBrush(QColor(0, 160, 230)));
  21. // 将Item添加到场景中
  22. QGraphicsScene* pScene = new QGraphicsScene();
  23. pScene->addItem(pItem);
  24. // 为视图设置场景
  25. QGraphicsView* pView = new QGraphicsView();
  26. pView->setScene(pScene);
  27. pView->setStyleSheet("border:none; background:skyblue");
  28. QVBoxLayout* layout = new QVBoxLayout(this);
  29. layout->addWidget(pView);
  30. }

要将QGraphicsSimpleTextItem添加至场景中,有两种方式:

  • 构造QGraphicsSimpleTextItem,然后通过QGraphicsScene::addItem()添加
  • 使用QGraphicsScene::addSimpleText()创建并添加一个QGraphicsSimpleTextItem,并返回 item 的指针

四、QGraphicsTextItem

4.1 详细描述

QGraphicsTextItem 类提供了一个格式化的文本项,可以添加到 QGraphicsScene 中。

要设置 item 的文本,可以传递 QString 到 QGraphicsTextItem 的构造函数,或调用 setHtml() / setPlainText()

QGraphicsTextItem 使用文本的格式化大小和相关联的字体,为 boundingRect()shape()contains() 提供了一个合理的实现。可以通过调用 setFont() 设置字体。

可以通过使用 setTextInteractionFlags() 设置 Qt::TextEditorInteraction 标志来使 item 可编辑。

item 的首选文本宽度可以使用 setTextWidth() 设置,并使用 textWidth() 获取。

注意:为了在中心对齐 HTML 文本,必须设置 item 的文本宽度。否则,可以在设置 item 的文本后调用 adjustSize()
QGraphicsTextItem.png
注意:QGraphicsTextItem 默认接受 hover 事件,可以使用 setAcceptHoverEvents() 更改此值。

4.2 示例

image.png

  1. #include <QFont>
  2. #include <QGraphicsScene>
  3. #include <QGraphicsTextItem>
  4. #include <QGraphicsView>
  5. #include <QLayout>
  6. #include <QString>
  7. Widget::Widget(QWidget* parent)
  8. : QWidget(parent)
  9. , ui(new Ui::Widget)
  10. {
  11. ui->setupUi(this);
  12. QGraphicsTextItem* pItem = new QGraphicsTextItem();
  13. pItem->setPlainText(tr("this is a example"));
  14. // 字体
  15. QFont font = pItem->font();
  16. font.setPixelSize(20); //像素大小
  17. font.setItalic(true); // 斜体
  18. font.setUnderline(true); // 下划线
  19. // 设置item的字体
  20. pItem->setFont(font);
  21. // 将Item添加到场景中
  22. QGraphicsScene* pScene = new QGraphicsScene();
  23. pScene->addItem(pItem);
  24. // 为视图设置场景
  25. QGraphicsView* pView = new QGraphicsView();
  26. pView->setScene(pScene);
  27. pView->setStyleSheet("border:none; background:skyblue");
  28. QVBoxLayout* layout = new QVBoxLayout(this);
  29. layout->addWidget(pView);
  30. }

要将QGraphicsTextItem添加至场景中,有两种方式:

  • 构造QGraphicsSimpleTextItem,然后通过QGraphicsScene::addItem()添加
  • 使用QGraphicsScene::addText()创建并添加一个QGraphicsTextItem,并返回 item 的指针

    4.3 富文本

    暂略

    4.3 超链接

    暂略

    4.3 编辑

    暂略

    五、QGraphicsLineItem

    5.1 详细描述

    QGraphicsLineItem 类提供了一个直线项,可以添加到 QGraphicsScene 中。


要设置 item 的直线,可以传递 QLineF 到 QGraphicsLineItem 的构造函数,或调用 setLine() 函数。line() 返回当前直线。默认情况下,该直线为黑色,宽度为 0,可以通过调用 setPen() 进行更改。
QGraphicsLineItem.png
QGraphicsLineItem 使用直线和画笔的宽度,为 boundingRect()、shape() 和 contains() 提供了一个合理的实现。paint() 函数使用 item 关联的画笔绘制直线。

5.2 示例

  1. #include <QGraphicsLineItem>
  2. #include <QGraphicsScene>
  3. #include <QGraphicsView>
  4. #include <QLayout>
  5. #include <QPen>
  6. #include <QString>
  7. Widget::Widget(QWidget* parent)
  8. : QWidget(parent)
  9. , ui(new Ui::Widget)
  10. {
  11. ui->setupUi(this);
  12. QGraphicsLineItem* pItem = new QGraphicsLineItem();
  13. // 设置画笔
  14. QPen pen = pItem->pen();
  15. pen.setColor(QColor(0, 160, 230));
  16. pen.setWidth(3);
  17. // 设置item的字体
  18. pItem->setPen(pen);
  19. // 设置直线位于(x1, y1)和(x2, y2)之间
  20. pItem->setLine(QLineF(0, 0, 100, 100));
  21. // 将Item添加到场景中
  22. QGraphicsScene* pScene = new QGraphicsScene();
  23. pScene->addItem(pItem);
  24. // 为视图设置场景
  25. QGraphicsView* pView = new QGraphicsView();
  26. pView->setScene(pScene);
  27. pView->setStyleSheet("border:none; background:skyblue");
  28. QVBoxLayout* layout = new QVBoxLayout(this);
  29. layout->addWidget(pView);
  30. }

要将QGraphicsLineItem添加至场景中,有两种方式:

  • 构造QGraphicsLineItem,然后通过QGraphicsScene::addItem()添加
  • 使用QGraphicsScene::addLine()创建并添加一个QGraphicsLineItem,并返回 item 的指针

    六、QGraphicsPixmapItem

    6.1 详细描述

    QGraphicsPixmapItem 类提供了一个图像项,可以添加到 QGraphicsScene 中。

要设置 item 的图像,可以传递 QPixmap 到 QGraphicsPixmapItem 的构造函数,或调用 setPixmap() 函数,pixmap() 返回当前的图像。

QGraphicsPixmapItem 使用 pixmap 的可选 alpha 掩码,为 boundingRect()、shape() 和 contains() 提供了一个合理的实现。
QGraphicsPixmapItem.png
图像在 item 的 (0, 0) 坐标处绘制,由 offset() 返回。可以通过调用 setOffset() 更改绘图偏移量。


可以通过调用 setTransformationMode() 设置图像的变换模式,默认情况下,使用 Qt::FastTransformation,它提供了快速、不平滑的缩放。Qt::SmoothTransformation 在 painter 上启用 QPainter::SmoothPixmapTransform,质量取决于平台和视口。结果通常不如调用 QPixmap::scale() 直接,调用 transformMode() 获取项目的当前转换模式。

6.2 示例

image.png

  1. #include <QGraphicsPixmapItem>
  2. #include <QGraphicsScene>
  3. #include <QGraphicsView>
  4. #include <QLayout>
  5. #include <QPen>
  6. #include <QString>
  7. Widget::Widget(QWidget* parent)
  8. : QWidget(parent)
  9. , ui(new Ui::Widget)
  10. {
  11. ui->setupUi(this);
  12. QGraphicsPixmapItem* pItem = new QGraphicsPixmapItem();
  13. QPixmap image("F:\\0.图片壁纸\\4k\\9_cage4_8k.jpg");
  14. pItem->setPixmap(image.scaled(600, 400));
  15. pItem->setTransformationMode(Qt::FastTransformation);
  16. // 将Item添加到场景中
  17. QGraphicsScene* pScene = new QGraphicsScene();
  18. pScene->addItem(pItem);
  19. // 为视图设置场景
  20. QGraphicsView* pView = new QGraphicsView();
  21. pView->setScene(pScene);
  22. // pView->setStyleSheet("border:none; background:skyblue");
  23. QVBoxLayout* layout = new QVBoxLayout(this);
  24. layout->addWidget(pView);
  25. }

要将QGraphicsPixmapItem添加至场景中,有两种方式:

  • 构造QGraphicsPixmapItem,然后通过QGraphicsScene::addItem()添加
  • 使用QGraphicsScene::addPixmap()创建并添加一个QGraphicsPixmapItem,并返回 item 的指针

    七、QGraphicsRectItem

    7.1 详细说明

    QGraphicsRectItem 类提供了一个矩形项,可以添加到 QGraphicsScene 中。

    要设置 item 的矩形,可以传递一个 QRectF 到 QGraphicsRectItem 的构造函数,或调用 setRect() 函数。rect() 返回当前矩形。
    QGraphicsRectItem.png
    QGraphicsRectItem 使用矩形和画笔宽度,为 boundingRect()、shape() 和 contains() 提供了一个合理的实现。paint() 函数使用 item 关联的画笔和画刷绘制矩形,可以通过调用 setPen() 和 setBrush() 函数来设置。


注意:无效矩形(例如,宽度或高度为负)的呈现是未定义的。如果不能确定使用的是有效的矩形(例如,如果使用来自不可靠源的数据创建的矩形),那么应该使用 QRectF::normalized() 创建标准化的矩形,然后使用它们。

7.2 示例

image.png

  1. #include <QGraphicsRectItem>
  2. #include <QGraphicsScene>
  3. #include <QGraphicsView>
  4. #include <QLayout>
  5. #include <QPen>
  6. #include <QString>
  7. Widget::Widget(QWidget* parent)
  8. : QWidget(parent)
  9. , ui(new Ui::Widget)
  10. {
  11. ui->setupUi(this);
  12. QGraphicsRectItem* pItem = new QGraphicsRectItem();
  13. // 设置画笔、画刷
  14. QPen pen = pItem->pen();
  15. pen.setWidth(5);
  16. pen.setColor(Qt::white);
  17. pItem->setPen(pen);
  18. pItem->setBrush(QBrush(QColor(0, 160, 230)));
  19. // 矩形区域 起点:(100,100) 宽高 200
  20. pItem->setRect(QRectF(100, 100, 200, 200));
  21. // 将Item添加到场景中
  22. QGraphicsScene* pScene = new QGraphicsScene();
  23. pScene->addItem(pItem);
  24. // 为视图设置场景
  25. QGraphicsView* pView = new QGraphicsView();
  26. pView->setScene(pScene);
  27. pView->setStyleSheet("border:none; background:skyblue");
  28. QVBoxLayout* layout = new QVBoxLayout(this);
  29. layout->addWidget(pView);
  30. }

要将QGraphicsRectItem添加至场景中,有两种方式:

  • 构造QGraphicsRectItem,然后通过QGraphicsScene::addItem()添加
  • 使用QGraphicsScene::addRect()创建并添加一个QGraphicsRectItem,并返回 item 的指针

    八、QGraphicsEllipseItem

    8.1 详细说明

QGraphicsEllipseItem 类提供了一个椭圆项,可以添加到 QGraphicsScene 中。

QGraphicsEllipseItem 表示一个带有填充和轮廓的椭圆,也可以使用它的椭圆段(见 startAngle()、spanAngle())

QGraphicsEllipseItem.png
要设置 item 的椭圆,可以传递一个 QRectF 到 QGraphicsEllipseItem 的构造函数,或调用 setRect()。rect() 返回当前椭圆的几何形状。


QGraphicsEllipseItem 使用 rect 和画笔宽度,为 boundingRect()、shape() 和 contains() 提供了一个合理的实现。paint() 函数使用 item 关联的画笔和画刷来绘制椭圆,可以通过调用 setPen() 和 setBrush() 来设置。

8.2 示例

image.png

  1. #include <QGraphicsEllipseItem>
  2. #include <QGraphicsScene>
  3. #include <QGraphicsView>
  4. #include <QLayout>
  5. #include <QPen>
  6. #include <QString>
  7. Widget::Widget(QWidget* parent)
  8. : QWidget(parent)
  9. , ui(new Ui::Widget)
  10. {
  11. ui->setupUi(this);
  12. QGraphicsEllipseItem* pItem = new QGraphicsEllipseItem();
  13. // 设置画笔、画刷
  14. QPen pen = pItem->pen();
  15. pen.setWidth(5);
  16. pen.setColor(Qt::white);
  17. pItem->setPen(pen);
  18. pItem->setBrush(QBrush(QColor(0, 160, 230)));
  19. // 矩形区域 起点:(100,100) 宽400,高200
  20. pItem->setRect(QRectF(100, 100, 400, 200));
  21. pItem->setStartAngle(16 * 90); // 起始角度
  22. pItem->setSpanAngle(16 * 270); // 跨角
  23. // 默认情况下, 角度为5760(360*16 一个完整的椭圆)
  24. // 将Item添加到场景中
  25. QGraphicsScene* pScene = new QGraphicsScene();
  26. pScene->addItem(pItem);
  27. // 为视图设置场景
  28. QGraphicsView* pView = new QGraphicsView();
  29. pView->setScene(pScene);
  30. pView->setStyleSheet("border:none; background:skyblue");
  31. QVBoxLayout* layout = new QVBoxLayout(this);
  32. layout->addWidget(pView);
  33. }

要将QGraphicsEllipseItem添加至场景中,有两种方式:

  • 构造QGraphicsEllipseItem,然后通过QGraphicsScene::addItem()添加
  • 使用QGraphicsScene::addEllipse()创建并添加一个QGraphicsEllipseItem,并返回 item 的指针

    九、QGraphicsPathItem

    9.1 详细描述

    QGraphicsPathItem 类提供了一个路径项,可以添加到 QGraphicsScene 中。

    要设置 item 的路径,可以传递 QPainterPath 到 QGraphicsPathItem 的构造函数,或调用 setPath() 函数,path() 返回当前路径。
    QGraphicsPathItem.png
    QGraphicsPathItem 使用路径,为 boundingRect()、shape() 和 contains() 提供了一个合理的实现。paint() 函数使用 item 关联的画笔和画刷来绘制路径,可以通过调用 setPen() 和 setBrush() 函数来设置。

    9.2 示例

    image.png ```cpp

    include

    include

    include

    include

    include

    include

Widget::Widget(QWidget* parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); const float PI = 3.14159f;

  1. QGraphicsPathItem* pItem = new QGraphicsPathItem();
  2. // 绘制星星
  3. QPainterPath starPath;
  4. starPath.moveTo(90, 50);
  5. for (int i = 0; i < 5; i++) {
  6. starPath.lineTo(50 + 40 * std::cos(0.8 * i * PI), 50 + 40 * std::sin(0.8 * i * PI));
  7. }
  8. starPath.closeSubpath();
  9. pItem->setPath(starPath);
  10. // 设置画笔、画刷
  11. QPen pen = pItem->pen();
  12. pen.setWidth(2);
  13. pen.setColor(Qt::white);
  14. pItem->setPen(pen);
  15. pItem->setBrush(QBrush(QColor(0, 160, 230)));
  16. // 将Item添加到场景中
  17. QGraphicsScene* pScene = new QGraphicsScene();
  18. pScene->addItem(pItem);
  19. // 为视图设置场景
  20. QGraphicsView* pView = new QGraphicsView();
  21. pView->setScene(pScene);
  22. pView->setStyleSheet("border:none; background:skyblue");
  23. QVBoxLayout* layout = new QVBoxLayout(this);
  24. layout->addWidget(pView);

}

  1. 要将`QGraphicsPathItem`添加至场景中,有两种方式:
  2. - 构造`QGraphicsPathItem`,然后通过`QGraphicsScene::addItem()`添加
  3. - 使用`QGraphicsScene::addEllipse()`创建并添加一个`QGraphicsPathItem`,并返回 item 的指针
  4. <a name="vGAdD"></a>
  5. # 十、QGraphicsPolygonItem
  6. <a name="COluD"></a>
  7. ## 10.1 详细描述
  8. QGraphicsPolygonItem 类提供了一个多边形项,可以添加到 QGraphicsScene 中。
  9. <br />
  10. <br />要设置 item 的多边形,传递 QPolygonF QGraphicsPolygonItem 的构造函数,或调用 setPolygon() 函数。polygon() 返回当前的多边形。<br />![QGraphicsPolygonItem.png](https://cdn.nlark.com/yuque/0/2021/png/2878535/1619198893544-0164429a-e35e-4b3f-b9f7-506cd85cc511.png#clientId=uc100d8ee-7abd-4&from=drop&id=u4b117999&margin=%5Bobject%20Object%5D&name=QGraphicsPolygonItem.png&originHeight=177&originWidth=182&originalType=binary&size=7186&status=done&style=none&taskId=u162c2fbd-d6ba-436e-87e6-cf697ac7a9a)<br />QGraphicsPolygonItem 使用多边形和画笔宽度,为 boundingRect()、shape() 和 contains() 提供了一个合理的实现。paint() 函数使用 item 关联的画笔和画刷绘制多边形,可以通过调用 setPen() 和 setBrush() 函数进行设置。
  11. <a name="rkNEn"></a>
  12. ## 10.2 示例
  13. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2878535/1619199162726-b144454d-31bc-4d11-9462-062cf6048f6c.png#clientId=uc100d8ee-7abd-4&from=paste&height=634&id=ud9785f83&margin=%5Bobject%20Object%5D&name=image.png&originHeight=634&originWidth=804&originalType=binary&size=18151&status=done&style=none&taskId=u6217198d-f0ee-4e07-9733-8849ab51844&width=804)
  14. ```cpp
  15. #include <QGraphicsPolygonItem>
  16. #include <QGraphicsScene>
  17. #include <QGraphicsView>
  18. #include <QLayout>
  19. #include <QPen>
  20. #include <QString>
  21. Widget::Widget(QWidget* parent)
  22. : QWidget(parent)
  23. , ui(new Ui::Widget)
  24. {
  25. ui->setupUi(this);
  26. QGraphicsPolygonItem* pItem = new QGraphicsPolygonItem();
  27. // 绘制多边形
  28. QPolygonF polygon;
  29. polygon << QPointF(200.0, 120.0) << QPointF(230.0, 130.0)
  30. << QPointF(260.0, 180.0) << QPointF(200.0, 200.0);
  31. pItem->setPolygon(polygon);
  32. // 设置画笔、画刷
  33. QPen pen = pItem->pen();
  34. pen.setWidth(2);
  35. pen.setColor(Qt::white);
  36. pItem->setPen(pen);
  37. pItem->setBrush(QBrush(QColor(0, 160, 230)));
  38. // 将Item添加到场景中
  39. QGraphicsScene* pScene = new QGraphicsScene();
  40. pScene->addItem(pItem);
  41. // 为视图设置场景
  42. QGraphicsView* pView = new QGraphicsView();
  43. pView->setScene(pScene);
  44. pView->setStyleSheet("border:none; background:skyblue");
  45. QVBoxLayout* layout = new QVBoxLayout(this);
  46. layout->addWidget(pView);
  47. }

要将QGraphicsPolygonItem添加至场景中,有两种方式:

  • 构造QGraphicsPathItem,然后通过QGraphicsScene::addItem()添加
  • 使用QGraphicsScene::addPolygon()创建并添加一个QGraphicsPolygonItem,并返回 item 的指针

参考链接 https://waleon.blog.csdn.net/article/details/53065293 https://www.cnblogs.com/aiguona/p/10002255.html