乐趣区

关于qt5:Qt开发技术图形视图框架二场景QGraphicsSceneQGraphicsItem与QGraphicsView详解

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/117660217

各位读者,常识无穷而人力有穷,要么改需要,要么找专业人士,要么本人钻研

红瘦子 (红模拟) 的博文大全:开发技术汇合(蕴含 Qt 实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬联合等等)继续更新中…(点击传送门)

Qt 开发专栏:开发技术(点击传送门)

上一篇:《Qt 开发技术:图形视图框架(一)根本介绍》
下一篇:敬请期待

前话

  Qt 的图形视图框架,最外围的三个类为:QGraphicsScene、QGraphicsItem 与 QGraphicsView。

QGraphicsScene

形容

  QGraphicsScene 类提供了一个用于治理大量二维图形项的面。
  该类用作 QGraphicsItems 的容器。它与 QGraphicsView 一起用于在二维面上可视化图形项,例如线条、矩形、文本,甚至自定义项。QGraphicsScene 是图形视图框架的一部分。
  QGraphicScene 还提供了一些性能,能够让无效地确定我的项目的地位,以及确定在场景中任意区域内哪些项目可见。应用 QGraphicsView 小部件,能够可视化整个场景,或者放大并只查看场景的局部。
  示例:

QGraphicsScene *pScene = new QGraphicsScene();
pScene->addText("Hello, world!");
QGraphicsView *pView = new QGraphicsView(pScene, this);

  
  请留神,QGraphicScene 自身没有视觉外观;它只治理我的项目。须要创立一个 QGraphicsView 小部件来可视化场景 (设置它的父类为可视窗口,如 QWidget)。
  要将我的项目增加到场景中,首先要结构一个 QGraphicsScene 对象。而后,有两个选项:要么通过调用 addIitem() 增加现有的 QGraphicsItem 对象 (次要是自定义继承的 QGraphicsItem),要么调用便当函数 addEllipse()、addLine()、addPath()、addPixmap()、addPolygon()、addRect() 或 addText(),这些函数都返回指向新增加项的指针。应用这些函数增加的我的项目的尺寸是绝对于我的项目的坐标系的,并且我的项目地位在场景中初始化为 (0,0)。
  而后能够应用 QGraphicsView 可视化场景。当场景更改时(例如,当我的项目挪动或转换时),QGraphicScene 会收回 changed() 信号。若要删除项,请调用 RemoveItem()。
  QGraphicScene 应用索引算法来无效地治理我的项目的地位。默认状况下,应用 BSP(二进制空间分区)树;该算法实用于大多数我的项目放弃动态 (即不挪动) 的大型场景。能够通过调用 setItemIndexMethod()来抉择禁用此索引。无关可用索引算法的详细信息,请参阅 ItemIndexMethod 属性。
  场景的边界矩形是通过调用 setSceneRect()设置的。我的项目能够搁置在场景的任何地位,默认状况下,场景的大小是有限的。场景矩形仅用于外部记账,保护场景的项索引。如果场景 rect 未设置,QGraphicScene 将应用 itemsBoundingRect()返回的所有项的边界区域作为场景矩形。然而,itemsBoundingRect()是一个绝对耗时的函数,因为它通过收集场景中每个我的项目的地位信息来操作。因而,在大型场景上操作时,应始终设置场景矩形。
  QGraphicScene 最大的长处之一是它可能无效地确定我的项目的地位。即便现场有数百万个我的项目,items()函数也能够在几毫秒内确定我的项目的地位。items()有几个重载:一个在特定地位查找我的项目,一个在多边形或矩形内或与多边形或矩形相交的我的项目,等等。返回我的项目的列表按重叠程序排序,最下面的我的项目是列表中的第一个我的项目。为了不便起见,还有一个 itemAt()函数在给定地位返回最下面的项。
  QGraphicScene 保护场景的抉择信息。要选择项,请调用 setSelectionArea(),要革除以后抉择,请调用 clearSelection()。调用 selectedItems()以获取所有选定项的列表。

事件处理和流传

  QGraphicsScene 的另一个职责是从 QGraphicsView 流传事件。要将事件发送到场景,能够结构继承 QEvent 的事件,而后应用 QApplication::SendEvent()发送它。event()负责将事件分派给各个我的项目。一些常见事件由不便的事件处理程序解决。例如,按键事件由 keypressEvent()解决,鼠标按键事件由 mousePressEvent()解决。
  要害事件传递到焦点我的项目。要设置焦点项,能够调用 setFocusItem(),传递承受焦点的项,或者项自身能够调用 QGraphicsItem::setFocus()。调用 focusItem()以获取以后焦点项。为了与小部件兼容,场景还保护本人的焦点信息。默认状况下,场景没有焦点,所有要害事件都将被抛弃。如果调用了 setFocus(),或者场景中的某个我的项目取得焦点,则场景将主动取得焦点。如果场景有焦点,hasFocus()将返回 true,并且要害事件将转发到焦点项 (如果有的话)。如果场景失去焦点(即有人调用 clearFocus()),而某个我的项目有焦点,则该场景将放弃其我的项目焦点信息,并且一旦场景复原焦点,它将确保最初一个焦点我的项目复原焦点。
  对于鼠标悬停成果,QGraphicsScene 会发送悬停事件。如果一个项承受悬停事件(请参见 QGraphicsItem::acceptHoverEvents()),则当鼠标进入其区域时,它将收到一个 QGaphicsSceneHoverCenter 事件。当鼠标持续在我的项目区域内挪动时,QGraphicsScene 将向其发送 GraphicsSceneHoverMove 事件。当鼠标来到我的项目区域时,我的项目将收到一个 GraphicsSceneHoverLeave 事件。
  所有鼠标事件都将传递到以后鼠标抓取器项。如果一个我的项目承受鼠标事件(请参见 QGraphicsItem::acceptedMouseButtons()) 并接管到鼠标按下,它将成为场景的鼠标抓取器。它放弃鼠标抓取器,直到在没有其余鼠标按钮被按下时收到鼠标开释为止。能够调用 mouseGramberItem()来确定以后正在获取鼠标的项。

QGraphicsView

  QGraphicsView 类提供一个窗口,用于显示 QGraphicsScene 的内容。
  在 QGraphicsView 将可视内容滚动的视口中。几何项创立场景的步骤参考,QGraphicsScene 的文档,QGraphicsView 图形视图框架的一部分。
可视化一个场景,通过建构 QGraphicsView 通过对象的地址,可看 QGraphicsView 的构造函数,或者也能够随后调用 setScene()显示。在你调用 show(),视窗将默认将滚动到视图核心并显示可见的所有我的项目。例如:

QGraphicsScene *pScene = new QGraphicsScene();
pScene->addText("Hello, world!");
QGraphicsView *pView = new QGraphicsView(pScene, this);

  
  能够应用滚动条或调用 centerOn()显式滚动到场景中的任何地位。通过将点传递给 centerOn(),QGraphicsView 将滚动其视区以确保该点在视图中居中。提供了一个用于滚动到 QGraphicsItem 的重载,在这种状况下,QGraphicsView 将看到该项的核心在视图中居中。如果只想确保某个区域是可见的 (但不肯定是居中的),那么能够调用 ensureVisible()。
  QGraphicsView 能够用来可视化整个场景,或者只显示其中的一部分。默认状况下,在首次显示视图时自动检测可视化区域(通过调用 QGraphicsScene::itemsBoundingRect())。要本人设置可视化区域矩形,能够调用 setScenRect()。这将适当调整滚动条的范畴。请留神,只管场景反对简直不受限制的大小,但滚动条的范畴永远不会超过整数的范畴(INT_MIN,INT_MAX)。
  QGraphicsView 通过调用 render() 可视化场景。默认状况下,通过应用惯例的 QPainer 和默认的渲染提醒将我的项目绘制到视区上。要在绘制项时更改 QGraphicsView 传递给 QPainter 的默认渲染提醒,能够调用 setRenderHints()。
  默认状况下,QGraphicsView 为 viewport 小部件提供惯例的 QWidget。能够通过调用 viewport()来拜访这个小部件,也能够通过调用 setViewport()来替换它。要应用 OpenGL 进行渲染,只需调用 setViewPort(new QGLWidget)。QGraphicsView 领有 viewport 小部件的所有权。
  QGraphicsView 应用 QTransform 反对仿射转换。能够将矩阵传递给 setTransform(),也能够调用便当函数 rotate()、scale()、translate()或 shear()。最常见的两种转换是缩放,用于实现缩放和旋转。QGraphicsView 在转换期间放弃视图核心不变。因为场景对齐 (setAligment()),转换视图不会产生视觉影响。
  能够应用鼠标和键盘与场景中的我的项目进行交互。QGraphicsView 将鼠标和键事件转换为场景事件(继承 QGraphicsSceneEvent 的事件),并将它们转发到可视化的场景。最初,处理事件并对其做出反馈的是单个我的项目。例如,如果单击一个可抉择的项,该项通常会让场景晓得它已被选中,并且它也会从新绘制本人以显示一个抉择矩形。相似地,如果你点击并拖动鼠标来挪动一个可挪动的我的项目,它就是解决鼠标挪动和挪动本人的我的项目。项交互在默认状况下是启用的,能够通过调用 setInteractive() 来切换它。
  还能够通过创立 QGraphicsView 的子类并从新实现鼠标和键事件处理程序来提供本人的自定义场景交互。为了简化如何以编程形式与视图中的项进行交互,QGraphicsView 提供了映射函数 mapToScene()和 mapFromScene(),以及项拜访器 items()和 itemAt()。这些函数容许在视图坐标和场景坐标之间映射点、矩形、多边形和门路,并应用视图坐标在场景中查找我的项目。

QGraphicsItem

具体介绍

  QGraphicsItem 类是 QGraphicsScene 中所有图形项的基类。
  它为编写本人的自定义我的项目提供了轻量级的根底。这包含通过事件处理程序定义项的几何体、冲突检测、其绘制实现和项交互。QGraphicsItem 是图形视图框架的一部分。
  
  为了不便起见,Qt 为最常见的形态提供了一组规范图形项。这些是:

  • QGraphicsEllipseItem 提供椭圆项
  • QGraphicsLineItem 提供直线项
  • QGraphicsPathItem 提供任意门路项
  • QGraphicsPixmapItem 提供 pixmap 项
  • QGraphicsPolygonItem 提供多边形项
  • QGraphicsRectItem 提供矩形项
  • QGraphicsSimpleTextItem 提供简略的文本标签项
  • QGraphicsTextItem 提供高级文本浏览器项

  (补充:若是为了深度应用,倡议全副重写一个专用积攒,而后所有元素 item 本人写,不应用自带的。)
  我的项目的所有几何信息都基于其部分坐标系。项的地位 pos()是惟一不在本地坐标中操作的函数,因为它返回父坐标中的地位。图形视图坐标系详细描述了坐标系。
  能够通过调用 setVisible()来设置项是否应可见 (即,绘制和承受事件)。暗藏我的项目也会暗藏其子项。同样,能够通过调用 setEnabled() 来启用或禁用项。如果禁用某个我的项目,它的所有子项也将被禁用。默认状况下,我的项目既可见又启用。若要切换是否选择项,请首先通过设置 itemIsSelectable 标记启用抉择,而后调用 setSelected()。通常,抉择由场景切换,这是用户交互的后果。
  要编写本人的图形项,首先要创立 QGraphicsItem 的子类,而后从实现它的两个纯虚构公共函数开始:boundingRect(),它返回该项绘制的区域的估计值,paint()实现理论绘制。
  示例:

class SimpleItem : public QGraphicsItem
{
public:
  QRectF boundingRect() const
  {
    qreal penWidth = 1;
    return QRectF(-10 - penWidth / 2, -10 - penWidth / 2,
                 20 + penWidth, 20 + penWidth);
  }
  void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
  {painter->drawRoundedRect(-10, -10, 20, 20, 5, 5);
  }
};

  boundingRect()函数有许多不同的用处。QGraphicsScene 基于 boundingRect()建设其项索引,QGraphicsView 应用它来剔除不可见项,以及确定绘制重叠项时须要从新编译的区域。此外,QGraphicsItem 的碰撞检测机制应用 boundingRect()提供无效的截止点。collistsWithItem()中的细粒度碰撞算法基于调用 shape(),它以 QPainterPath 的模式返回我的项目形态的精确轮廓。
  QGraphicScene 心愿所有 boundingRect()和 shape()项放弃不变,除非告诉它。如果要以任何形式更改项的几何图形,必须首先调用 prepareGeometryChange()以容许 QgraphicsScene 更新其记账。
  碰撞检测有两种形式:

  • 重载 shape()返回项的精确形态,并依赖 collapsWithItem()的默认实现来进行形态交加。如果形态简单的话,这可能会很贵(指性能耗费)。
  • 重载 collistWithItem()提供本人的自定义项和形态抵触算法。

  能够调用 contains()函数来确定项是否蕴含点。此函数也能够由项从新实现。contains()的默认行为基于调用 shape()。
  项能够蕴含其余项,也能够蕴含在其余项中。所有项都能够有父项和子项列表。除非该项没有父项,否则它的地位在父坐标 (即父项的部分坐标) 中。父项将它们的地位及其转换流传到所有子项。
  

转换

  除了根底地位 pos()之外,QGraphicsItem 还反对投影转换。有几种办法能够更改项的转换。对于简略的转换,能够调用不便函数 setRotation()或 setScale(),也能够将任何转换矩阵传递给 setTransform()。对于高级转换管制,还能够通过调用 setTransforms()来设置多个组合转换。
  我的项目转换从父项到子项叠加,因而如果父项和子项都旋转 90 度,子项的总转换将为 180 度。相似的,如果我的项目的父级缩放到原始大小的 2 倍,则其子级也将是原始大小的两倍。项的转换不会影响其本身的部分几何图形;所有几何图形函数 (例如,contains()、update() 和所有映射函数)仍在部分坐标中操作。为了不便起见,QGraphicsItem 提供函数 sceneTransform(),它返回项的总转换矩阵 (包含其地位以及所有父级地位和转换),scenePos() 返回其在场景坐标中的地位。若要重置项的矩阵,请调用 resetTransform()。
  某些转换操作依据利用程序产生不同的后果。例如,如果缩放一个变换,而后旋转它,可能会失去与先旋转变换不同的后果。然而,在 QGraphicsItem 上设置转换属性的程序不会影响生成的转换;QGraphicsItem 始终以固定的、定义的程序利用这些属性:

  • 利用项的根底转换(transform())
  • 按程序利用项的转换列表(transforms())
  • 该项绝对于其转换原点旋转(rotation(),transformOriginPoint())
  • 该项绝对于其转换原点进行缩放(scale(),transformOriginPoint())

绘制

  QGraphicsView 调用 paint()函数来绘制项的内容。该项自身没有背景或默认填充;该项前面的内容将在该函数中未显式绘制的所有区域中发光。能够调用 update()来打算从新绘制,也能够抉择传递须要从新绘制的矩形。依据该项在视图中是否可见,能够从新绘制该项,也能够不从新绘制;在 QGraphicsItem 中没有与 QWidget::repaint()等效的项。
  项由视图绘制,从父项开始,而后按升序重叠子项。能够通过调用 setZValue()来设置项的堆栈程序,并通过调用 zValue()来测试它,其中 z 值较低的项在 z 值较高的项之前绘制。重叠程序实用于兄弟项;父项总是在其子项之前绘制。
排序
  所有我的项目都以定义的、稳固的程序绘制,并且这个程序决定了当单击场景时,哪些项目将首先接管鼠标输出。通常,不用放心排序,因为我的项目遵循“天然程序”,遵循场景的逻辑构造。
  我的项目的子项重叠在父项的顶部,兄弟项按插入程序重叠(即,以增加到场景或增加到同一父项的雷同程序)。如果增加了我的项目 A,而后增加了 B,那么 B 将位于 A 的顶部。如果增加了 C,那么我的项目的重叠程序将是 A,而后增加了 B,而后增加了 C。
  
  这个例子显示了从拖放机器人的例子中机器人所有肢体的重叠程序。躯干是根项(所有其余项都是躯干的子项或子项),因而首先绘制躯干。接下来,画出头部,因为它是躯干列表中的第一个我的项目。而后画出左上臂。因为下臂是上臂的子对象,因而将绘制下臂,而后绘制上臂的下一个兄弟姐妹,即右上臂,依此类推。
  对于高级用户,有一些办法能够更改我的项目的排序形式:

  • 能够对一个项调用 setZValue() 来显式地将它重叠在其余同级项的顶部或下方。项的默认 Z 值为 0。具备雷同 Z 值的项按插入程序重叠。
  • 能够调用 stackBefore() 对子项列表从新排序。这将间接批改插入程序。
  • 能够将 ItemStacksBhindParant 标记设置为将子项重叠在其父项之后。

两个同级项的重叠程序也计算每个项的子项和子项。因而,如果一个我的项目位于另一个我的项目之上,那么它的所有子项也将位于其余我的项目的所有子项之上。

事件

  QGraphicsItem 通过虚构函数 sceneEvent()从 QGraphicsScene 接管事件。此函数将最常见的事件分发给一组不便的事件处理程序:

  • contextMenuEvent()解决上下文菜单事件。
  • focusInEvent()和 focusOutEvent() 解决焦点进入和退出事件。
  • hoverEnterEvent()、hoverMoveEvent()和 hoverLeaveEvent() 解决 hoverEnter、move 和 leave 事件。
  • inputMethodEvent()解决输出事件,以取得辅助性能反对,如中文输入法获取输出内容。
  • keyPressEvent()和 keyReleaseEvent() 解决按键和开释事件。
  • mousePressEvent()、mouseMoveEvent()、mouseReleaseEvent()和 mouseDoubleClickEvent() 解决鼠标按下、挪动、开释、单击和双击事件。

  能够通过装置事件筛选器来筛选任何其余我的项目的事件。此性能与 Qt 的惯例事件筛选器 (请参阅 QObject::InstallEventFilter()) 不同,后者只在 QObject 的子类上工作。通过调用 InstallSceneEventFilter()将我的项目装置为另一个我的项目的事件筛选器后,虚构函数 sceneEventFilter()将接管筛选的事件。能够通过调用 removeSceneEventFilter()删除项事件筛选器。

自定义数据

  有时,将自定义数据注册到一个项、自定义项或规范项是很有用的。能够对任何项调用 setData()以应用键值对 (键为整数,值为 QVariant) 来存储其中的数据。要从项中获取自定义数据,请调用 data()。此性能齐全不受 qt 自身的影响;它是为不便用户而提供的。

枚举详解

enum QGraphicsItem::CacheMode:缓存模式

  此枚举形容 QGraphicsItem 的缓存模式。缓存用于通过调配和渲染到非屏幕像素缓冲区来放慢渲染速度,当项须要从新绘制时,能够重用该缓冲区。对于某些绘制设施,缓存间接存储在图形内存中,这使得渲染十分疾速。
  

enum QGraphicsItem::GraphicsItemChange:告诉状态更改

  此枚举形容由 QGraphicsItem::itemChange()告诉的状态更改。告诉将作为状态更改发送,在某些状况下,能够进行调整 (无关详细信息,请参阅每个更改的文档)。
  留神:在 itemChange() 内小心调用 QGraphicsItem 自身的函数,因为某些函数调用可能导致不须要的递归。例如,不能对 itemPositionChange 告诉调用 itemChange()中的 setPos(),因为 setPos()函数将再次调用 itemChange(itemPositionChange)。相同,能够从 itemChange()返回新的已调整地位。
  
  
  

  
  

enum QGraphicsItem::GraphicsItemFlag、flags QGraphicsItem::GraphicsItemFlags:示意性能项

  此枚举形容能够在项上设置的不同标记,以切换项行为中的不同性能。默认状况下禁用所有标记。
  
  留神:此标记相似于 ItemContainChildrenInShape,但另外还通过剪切子项来强制蕴含。
  
  留神:设置此标记后,依然能够缩放我的项目自身,并且缩放转换将影响我的项目的子项。
  
  
  留神:如果同时设置了此标记和 ItemClipsChildrenToShape,则将强制执行剪辑。这相当于只设置 ItemClipsChildrenToShape。
GRaphicsItemFlags 类型是 QFlags<GraphicsItemFlag> 的 typedef。它存储一个或多个 GraphicsItemFlag 值。

enum QGraphicsItem::PanelModality:面板行为

  此枚举指定模式面板的行为。模态面板是阻止输出到其余面板的面板。请留神,属于模式面板子级的项不会被阻止。
  可取值为:
  

成员函数(重要的几个)

bool QGraphicsItem::acceptDrops() const

  如果 item 承受悬停事件 (QGraphicsSceneHoverEvent)将会返回 true;否则,返回 false。默认状况下,图元项没有承受 hover 事件。
这个性能是在 QT 4.4 引入的。

bool QGraphicsItem::acceptTouchEvents() const

  如果项承受触摸事件,则返回 true;否则返回 false。默认状况下,我的项目不承受触摸事件。
  Qt4.6 中引入了该性能。

Qt::MouseButtons QGraphicsItem::acceptedMouseButtons() const

  返回此项承受鼠标事件的鼠标按钮。默认状况下,承受所有鼠标按钮。
  如果一个我的项目承受鼠标按钮,当鼠标按钮的鼠标按下事件被传递时,它将成为鼠标抓取我的项目。然而,如果我的项目不承受按钮,QGraphicsScene 将把鼠标事件转发到它上面的第一个我的项目。

[pure virtual] QRectF QGraphicsItem::boundingRect() const

  此纯虚构函数将项的外部边界定义为一个矩形;所有绘制必须限度在项的边界矩形内。QGraphicsView 应用它来确定项是否须要从新绘制。
尽管我的项目的形态能够是任意的,然而边界矩形始终是矩形的,并且不受我的项目转换的影响。
  如果要更改项的边框,必须首先调用 PrepareGeteryChange()。这将告诉场景行将产生的更改,以便它能够更新其项几何索引;否则,场景将不晓得项的新几何,并且后果未定义(通常,渲染工件留在视图中)。
  从新实现这个函数,让 QGraphicsView 确定须要从新绘制小部件的哪些局部(如果有的话)。
  留神:对于绘制轮廓 / 笔划的形态,在边界矩形中蕴含一半的笔宽是很重要的。然而,不须要弥补抗锯齿。
  示例:
  

QRegion QGraphicsItem::boundingRegion(const QTransform &itemToDeviceTransform) const

  返回此项的边界区域。返回区域的坐标空间取决于 itemToDeviceTransform。如果将标识 QTransform 作为参数传递,则此函数将返回部分坐标区域。
  边界区域描述了我的项目视觉内容的粗略轮廓。尽管计算起来很低廉,但它也比 boundingrect()更准确,并且有助于防止在我的项目更新时不必要的从新绘制。这对于薄我的项目 (如直线或简略多边形)尤其无效。能够通过调用  setBoundingRegionGranularity() 来调整边界区域的粒度。默认粒度为 0;其中项的边界区域与其边界矩形雷同。
  itemTodeviceTransform 是从项坐标到设施坐标的转换。如果心愿此函数返回场景坐标中的 QRegion,能够将 sceneTransform()作为参数传递。
  这个性能是在 QT 4.4 引入的。

[virtual protected] void QGraphicsItem::dragEnterEvent(QGraphicsSceneDragDropEvent *event)

  对于事件事件,能够从新实现此事件处理程序,以接管此我的项目的拖曳输出事件。当光标进入我的项目区域时,将生成“拖动输出”事件。
  通过承受事件(即,通过调用 qEvent:::accept()),我的项目将承受搁置事件,除了接管拖动挪动和拖动来到。否则,事件将被疏忽并流传到上面的项。如果该事件被承受,则在控件返回事件循环之前,该项将收到一个拖动挪动事件。
  DragEnterEvent 的常见实现依据事件中关联的 MIME 数据承受或疏忽事件。例子:
  

[virtual protected] void QGraphicsItem::dragMoveEvent(QGraphicsSceneDragDropEvent *event)

  对于事件事件,此事件处理程序能够从新实现以接管此我的项目的拖动挪动事件。当光标在我的项目区域内挪动时,会生成拖动挪动事件。大多数状况下,不须要从新实现此函数;它用于批示只有我的项目的局部能够承受搁置。
  在事件上调用 QEvent::Ignore()或 QEvent::Accept()将切换该项是否承受从事件中删除的地位。默认状况下,承受事件,示意我的项目容许在指定地位搁置。
  默认状况下,我的项目不接管拖放事件;若要启用此性能,请调用 setAcceptDrops(true)。
默认实现什么也不做。

[virtual protected] void QGraphicsItem::dropEvent(QGraphicsSceneDragDropEvent *event)

  对于事件事件,能够从新实现此事件处理程序以接管此项的搁置事件。只有在最初一个拖动挪动事件被承受时,项能力接管搁置事件。
对事件调用 QEvent::Ignore()或 QEvent::Accept()有效。
  默认状况下,项不接管拖放事件;若要启用此性能,请调用 setAcceptDrops(true)。
默认实现什么也不做。

[virtual protected] void QGraphicsItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)

  对于事件事件,能够从新实现此事件处理程序以接管此我的项目的鼠标双击事件。
  当双击某个我的项目时,该我的项目将首先收到一个鼠标按下事件,而后是一个开释事件(即单击),而后是一个双击事件,最初是一个开释事件。
  对事件调用 QEvent::Ignore()或 QEvent::Accept()有效。
  默认实现调用 mousePressEvent()。如果要在从新实现此函数时保留根本实现,请在从新实现中调用 QGraphicsItem:: MouseDoubleClickevent()。
  请留神,如果一个我的项目既不可抉择也不可挪动,它将不会接管双击事件(在这种状况下,鼠标单击将被疏忽,并进行生成双击)。

[virtual] QPainterPath QGraphicsItem::shape() const

  返回此项的形态作为本地坐标中的 QPainterPath。该形态用于许多事件,包含碰撞检测、命中测试和 QGraphicsScene::items()函数。
  默认的实现调用 boundingRect()返回一个简略的矩形,然而子类能够从新实现这个函数来为非矩形项返回一个更准确的形态。例如,圆形我的项目能够抉择返回椭圆形状以更好地检测碰撞。例如:
  
  形态的轮廓能够依据绘图时应用的笔的宽度和款式而变动。如果要将此轮廓蕴含在项的形态中,能够应用 QPainterPathStroker 从笔划创立形态。
  此函数由 contains()和 collipswithpath()的默认实现调用。

上一篇:《Qt 开发技术:图形视图框架(一)根本介绍》
下一篇:敬请期待

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/117660217

退出移动版