zoukankan      html  css  js  c++  java
  • Qt 常见的 QGraphicsItem

    简述

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

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

    常见的 QGraphicsItem

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

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

    QGraphicsSimpleTextItem

    详细描述

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

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

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

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

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

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

    示例

     

    代码

     1 void TOPIScanningGUI::My()
     2 {
     3     QGraphicsSimpleTextItem *pItem = new QGraphicsSimpleTextItem();
     4     pItem->setText("这是一个QGraphicsSimpleTextItem");
     5     QFont font = pItem->font();
     6     font.setPixelSize(20);  // 像素大小
     7     font.setItalic(true);  // 斜体
     8     font.setUnderline(true);  // 下划线
     9     pItem->setFont(font);
    10     pItem->setBrush(QBrush(QColor(0, 160, 230)));
    11     scene1->addItem(pItem);
    12 }

    QGraphicsTextItem

    详细描述

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

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

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

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

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

    注意:为了在中心对齐 HTML 文本,必须设置 item 的文本宽度。否则,可以在设置 item 的文本后调用 adjustSize()。

     

    注意: QGraphicsTextItem 默认接受 hover 事件,可以使用 setAcceptHoverEvents() 更改此值。

    纯文本

     代码

     1 void TOPIScanningGUI::My()
     2 {
     3     QGraphicsTextItem *pItem = new QGraphicsTextItem();
     4     pItem->setPlainText("这是一个QGraphicsTextItem");  // 纯文本
     5     pItem->setDefaultTextColor(QColor(0, 160, 230));  // 文本色
     6     QFont font = pItem->font();
     7     font.setPixelSize(20);  // 像素大小
     8     font.setItalic(true);  // 斜体
     9     font.setUnderline(true);  // 下划线
    10     pItem->setFont(font);
    11     scene1->addItem(pItem);
    12 }

    QGraphicsLineItem

    详细描述

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

    要设置 item 的直线,可以传递 QLineF 到 QGraphicsLineItem 的构造函数,或调用 setLine() 函数。line() 返回当前直线。默认情况下,该直线为黑色,宽度为 0,可以通过调用 setPen() 进行更改。

     

    QGraphicsLineItem 使用直线和画笔的宽度,为 boundingRect()、shape() 和 contains() 提供了一个合理的实现。paint() 函数使用 item 关联的画笔绘制直线。

     

     

    QGraphicsPixmapItem

    详细描述

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

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

    QGraphicsPixmapItem 使用 pixmap 的可选 alpha 掩码,为 boundingRect()、shape() 和 contains() 提供了一个合理的实现。

    图像在 item 的 (0, 0) 坐标处绘制,由 offset() 返回。可以通过调用 setOffset() 更改绘图偏移量。

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

    示例

    代码

     1 void TOPIScanningGUI::My()
     2 {
     3     // 定义一个 item
     4     QGraphicsPixmapItem *pItem = new QGraphicsPixmapItem();
     5 
     6     QPixmap image("D://logo.png");
     7     pItem->setPixmap(image.scaled(150, 150));
     8 
     9     scene1->addItem(pItem);
    10 }

    QGraphicsRectItem

    详细说明

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

    要设置 item 的矩形,可以传递一个 QRectF 到 QGraphicsRectItem 的构造函数,或调用 setRect() 函数。rect() 返回当前矩形。

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

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

    示例

    代码

     1 void TOPIScanningGUI::My()
     2 {
     3     // 定义一个 item
     4     QGraphicsRectItem  *pItem = new QGraphicsRectItem();
     5 
     6     // 设置画笔、画刷
     7     QPen pen = pItem->pen();
     8     pen.setWidth(5);
     9     pen.setColor(Qt::white);
    10     pItem->setPen(pen);
    11     pItem->setBrush(QBrush(QColor(0, 160, 230)));
    12 
    13     // 矩形区域 起点:(50, 50) 宽:100 高:100
    14     pItem->setRect(QRectF(50, 50, 100, 100));
    15 
    16     scene1->addItem(pItem);
    17 }

    QGraphicsEllipseItem

    详细说明

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

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

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

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

    示例

    代码

     1 void TOPIScanningGUI::My()
     2 {
     3     // 定义一个 item
     4     QGraphicsEllipseItem *pItem = new QGraphicsEllipseItem();
     5 
     6     // 设置画笔、画刷
     7     QPen pen = pItem->pen();
     8     pen.setWidth(5);
     9     pen.setColor(Qt::white);
    10     pItem->setPen(pen);
    11     pItem->setBrush(QBrush(QColor(0, 160, 230)));
    12 
    13     // 矩形区域 起点:(50, 50) 宽:200 高:100
    14     pItem->setRect(QRectF(50, 50, 200, 100));
    15     pItem->setStartAngle(16 * 90);  // 起始角度
    16     pItem->setSpanAngle(16 * 270);  // 跨角
    17 
    18     scene1->addItem(pItem);
    19 }

    QGraphicsPathItem

    详细描述

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

    要设置 item 的路径,可以传递 QPainterPath 到 QGraphicsPathItem 的构造函数,或调用 setPath() 函数,path() 返回当前路径。

     

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

    示例


    代码

     1 void TOPIScanningGUI::My()
     2 {
     3     const float Pi = 3.14159f;
     4 
     5     // 定义一个 item
     6     QGraphicsPathItem *pItem = new QGraphicsPathItem();
     7 
     8     // 绘制星星
     9     QPainterPath starPath;
    10     starPath.moveTo(90, 50);
    11     for (int i = 1; i < 5; ++i) {
    12         starPath.lineTo(50 + 40 * std::cos(0.8 * i * Pi), 50 + 40 * std::sin(0.8 * i * Pi));
    13     }
    14     starPath.closeSubpath();
    15     pItem->setPath(starPath);
    16 
    17     // 设置画笔、画刷
    18     QPen pen = pItem->pen();
    19     pen.setWidth(2);
    20     pen.setColor(Qt::white);
    21     pItem->setPen(pen);
    22     pItem->setBrush(QBrush(QColor(0, 160, 230)));
    23 
    24     scene1->addItem(pItem);
    25 }

    QGraphicsPolygonItem

    详细描述

    QGraphicsPolygonItem 类提供了一个多边形项,可以添加到 QGraphicsScene 中。

    要设置 item 的多边形,传递 QPolygonF 到 QGraphicsPolygonItem 的构造函数,或调用 setPolygon() 函数。polygon() 返回当前的多边形。

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

    示例

     

    代码:

     1 void TOPIScanningGUI::My()
     2 {
     3     // 定义一个 item
     4     QGraphicsPolygonItem *pItem = new QGraphicsPolygonItem();
     5 
     6     // 绘制多边形
     7     QPolygonF polygon;
     8     polygon << QPointF(200.0, 120.0) << QPointF(230.0, 130.0)
     9         << QPointF(260.0, 180.0) << QPointF(200.0, 200.0);
    10     pItem->setPolygon(polygon);
    11 
    12     // 设置画笔、画刷
    13     QPen pen = pItem->pen();
    14     pen.setWidth(2);
    15     pen.setColor(Qt::black);
    16     pItem->setPen(pen);
    17     pItem->setBrush(QBrush(QColor(0, 160, 230)));
    18 
    19 
    20     scene1->addItem(pItem);
    21 }
  • 相关阅读:
    EasyRTMP内置进入摄像机中实现网络推流直播摄像机的功能
    EasyPlayer安卓Android流媒体播放器实现直播过程中客户端快照功能
    EasyPlayer安卓Android流媒体播放器实现直播过程中客户端快照功能
    如何用传统摄像机实现直接对接平台,类似于海康萤石、大华乐橙的方案
    如何用传统摄像机实现直接对接平台,类似于海康萤石、大华乐橙的方案
    EasyIPCamera实现的桌面采集直播用于课堂、会议、展销同屏等应用
    EasyIPCamera实现的桌面采集直播用于课堂、会议、展销同屏等应用
    EasyPlayer实现视频播放局部缩放、广角平移功能(类似水滴直播,快手视频)
    EasyPlayer实现视频播放局部缩放、广角平移功能(类似水滴直播,快手视频)
    EasyPusher实现将asterisk直播流以RTSP转发实现通话直播与录像
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13500804.html
Copyright © 2011-2022 走看看