QGraphicsItem 类是 QGraphicsScene 中全部 item 的基类。框架
它提供了一个轻量级的基础,用于编写自定义 item。其中包括:定义 item 的几何形状、碰撞检测、绘制实现、以及经过其事件处理程序进行 item 的交互,QGraphicsItem 是 Qt之图形视图框架 的一部分。函数
为方便起见,Qt 为最多见的形状提供了一组典型的标准 item。它们是:字体
QGraphicsSimpleTextItem:提供了一个简单的文本标签项
QGraphicsTextItem:提供了一个格式化的文本项
QGraphicsLineItem:提供了一个直线项
QGraphicsPixmapItem:提供了一个图像项
QGraphicsRectItem:提供了一个矩形项
QGraphicsEllipseItem:提供了一个椭圆项
QGraphicsPathItem:提供了一个路径项
QGraphicsPolygonItem:提供了一个多边形项spa
QGraphicsSimpleTextItem 提供了一个简单的文本标签项,能够添加到 QGraphicsScene 中。3d
要设置 item 的文本,能够传递 QString 到 QGraphicsSimpleTextItem 的构造函数,或在以后调用 setText() 来更改文本。要设置文本填充色,调用 setBrush()。code
QGraphicsSimpleTextItem 能够具备填充和轮廓,setBrush() 用于设置文本填充(即文本色),setPen() 用于设置绘制文本轮廓的画笔(后者可能很慢,特别是对于复杂的画笔,以及具备长文本内容的 item)。orm
若是只想绘制一行简单的文本,只须要调用 setBrush(),不须要设置画笔。QGraphicsSimpleTextItem 的画笔默认是 Qt::NoPen。blog
QGraphicsSimpleTextItem 使用文本的格式化大小和相关联的字体,为 boundingRect()、shape() 和 contains() 提供了一个合理的实现。能够经过调用 setFont() 设置字体。事件
QGraphicsSimpleText 不显示富文本,相反,能够使用 QGraphicsTextItem,它提供全文控制功能。ip
void TOPIScanningGUI::My() { QGraphicsSimpleTextItem *pItem = new QGraphicsSimpleTextItem(); pItem->setText("这是一个QGraphicsSimpleTextItem"); QFont font = pItem->font(); font.setPixelSize(20); // 像素大小 font.setItalic(true); // 斜体 font.setUnderline(true); // 下划线 pItem->setFont(font); pItem->setBrush(QBrush(QColor(0, 160, 230))); scene1->addItem(pItem); }
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() 更改此值。
void TOPIScanningGUI::My() { QGraphicsTextItem *pItem = new QGraphicsTextItem(); pItem->setPlainText("这是一个QGraphicsTextItem"); // 纯文本 pItem->setDefaultTextColor(QColor(0, 160, 230)); // 文本色 QFont font = pItem->font(); font.setPixelSize(20); // 像素大小 font.setItalic(true); // 斜体 font.setUnderline(true); // 下划线 pItem->setFont(font); scene1->addItem(pItem); }
QGraphicsLineItem 类提供了一个直线项,能够添加到 QGraphicsScene 中。
要设置 item 的直线,能够传递 QLineF 到 QGraphicsLineItem 的构造函数,或调用 setLine() 函数。line() 返回当前直线。默认状况下,该直线为黑色,宽度为 0,能够经过调用 setPen() 进行更改。
QGraphicsLineItem 使用直线和画笔的宽度,为 boundingRect()、shape() 和 contains() 提供了一个合理的实现。paint() 函数使用 item 关联的画笔绘制直线。
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() 获取项目的当前转换模式。
void TOPIScanningGUI::My() { // 定义一个 item QGraphicsPixmapItem *pItem = new QGraphicsPixmapItem(); QPixmap image("D://logo.png"); pItem->setPixmap(image.scaled(150, 150)); scene1->addItem(pItem); }
QGraphicsRectItem 类提供了一个矩形项,能够添加到 QGraphicsScene 中。
要设置 item 的矩形,能够传递一个 QRectF 到 QGraphicsRectItem 的构造函数,或调用 setRect() 函数。rect() 返回当前矩形。
QGraphicsRectItem 使用矩形和画笔宽度,为 boundingRect()、shape() 和 contains() 提供了一个合理的实现。paint() 函数使用 item 关联的画笔和画刷绘制矩形,能够经过调用 setPen() 和 setBrush() 函数来设置。
注意:无效矩形(例如,宽度或高度为负)的呈现是未定义的。若是不能肯定使用的是有效的矩形(例如,若是使用来自不可靠源的数据建立的矩形),那么应该使用 QRectF::normalized() 建立标准化的矩形,而后使用它们。
void TOPIScanningGUI::My() { // 定义一个 item QGraphicsRectItem *pItem = new QGraphicsRectItem(); // 设置画笔、画刷 QPen pen = pItem->pen(); pen.setWidth(5); pen.setColor(Qt::white); pItem->setPen(pen); pItem->setBrush(QBrush(QColor(0, 160, 230))); // 矩形区域 起点:(50, 50) 宽:100 高:100 pItem->setRect(QRectF(50, 50, 100, 100)); scene1->addItem(pItem); }
QGraphicsEllipseItem 类提供了一个椭圆项,能够添加到 QGraphicsScene 中。
QGraphicsEllipseItem 表示一个带有填充和轮廓的椭圆,也能够使用它的椭圆段(见 startAngle()、spanAngle())。
要设置 item 的椭圆,能够传递一个 QRectF 到 QGraphicsEllipseItem 的构造函数,或调用 setRect()。rect() 返回当前椭圆的几何形状。
QGraphicsEllipseItem 使用 rect 和画笔宽度,为 boundingRect()、shape() 和 contains() 提供了一个合理的实现。paint() 函数使用 item 关联的画笔和画刷来绘制椭圆,能够经过调用 setPen() 和 setBrush() 来设置。
void TOPIScanningGUI::My() { // 定义一个 item QGraphicsEllipseItem *pItem = new QGraphicsEllipseItem(); // 设置画笔、画刷 QPen pen = pItem->pen(); pen.setWidth(5); pen.setColor(Qt::white); pItem->setPen(pen); pItem->setBrush(QBrush(QColor(0, 160, 230))); // 矩形区域 起点:(50, 50) 宽:200 高:100 pItem->setRect(QRectF(50, 50, 200, 100)); pItem->setStartAngle(16 * 90); // 起始角度 pItem->setSpanAngle(16 * 270); // 跨角 scene1->addItem(pItem); }
QGraphicsPathItem 类提供了一个路径项,能够添加到 QGraphicsScene 中。
要设置 item 的路径,能够传递 QPainterPath 到 QGraphicsPathItem 的构造函数,或调用 setPath() 函数,path() 返回当前路径。
QGraphicsPathItem 使用路径,为 boundingRect()、shape() 和 contains() 提供了一个合理的实现。paint() 函数使用 item 关联的画笔和画刷来绘制路径,能够经过调用 setPen() 和 setBrush() 函数来设置。
void TOPIScanningGUI::My() { const float Pi = 3.14159f; // 定义一个 item QGraphicsPathItem *pItem = new QGraphicsPathItem(); // 绘制星星 QPainterPath starPath; starPath.moveTo(90, 50); for (int i = 1; i < 5; ++i) { starPath.lineTo(50 + 40 * std::cos(0.8 * i * Pi), 50 + 40 * std::sin(0.8 * i * Pi)); } starPath.closeSubpath(); pItem->setPath(starPath); // 设置画笔、画刷 QPen pen = pItem->pen(); pen.setWidth(2); pen.setColor(Qt::white); pItem->setPen(pen); pItem->setBrush(QBrush(QColor(0, 160, 230))); scene1->addItem(pItem); }
QGraphicsPolygonItem 类提供了一个多边形项,能够添加到 QGraphicsScene 中。
要设置 item 的多边形,传递 QPolygonF 到 QGraphicsPolygonItem 的构造函数,或调用 setPolygon() 函数。polygon() 返回当前的多边形。
QGraphicsPolygonItem 使用多边形和画笔宽度,为 boundingRect()、shape() 和 contains() 提供了一个合理的实现。paint() 函数使用 item 关联的画笔和画刷绘制多边形,能够经过调用 setPen() 和 setBrush() 函数进行设置。
void TOPIScanningGUI::My() { // 定义一个 item QGraphicsPolygonItem *pItem = new QGraphicsPolygonItem(); // 绘制多边形 QPolygonF polygon; polygon << QPointF(200.0, 120.0) << QPointF(230.0, 130.0) << QPointF(260.0, 180.0) << QPointF(200.0, 200.0); pItem->setPolygon(polygon); // 设置画笔、画刷 QPen pen = pItem->pen(); pen.setWidth(2); pen.setColor(Qt::black); pItem->setPen(pen); pItem->setBrush(QBrush(QColor(0, 160, 230))); scene1->addItem(pItem); }