本文由 发布,转载请注明出处,如有问题请联系我们! 发布时间: 2021-06-07Qt开发技术:图形视图框架(二)场景QGraphicsScene、QGraphicsItem与QGraphicsView详解

加载中

Qt开发设计:图型主视图架构(二)情景QGraphicsScene、QGraphicsItem与QGraphicsView详细说明

前话

  Qt的图型主视图架构,最关键的三个类为:QGraphicsScene、QGraphicsItem与QGraphicsView。

 

根据图型架构的高級白板软件Demo

 

 

 

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()涵数还可以在几ms内明确新项目的部位。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和默认设置的3D渲染提醒将新项目制作到视区上。要在制作项时变更QGraphicsView传送给QPainter的默认设置3D渲染提醒,能够启用setRenderHints()。
  默认设置状况下,QGraphicsView为viewport小构件给予基本的QWidget。能够根据启用viewport()来浏览这一小构件,还可以根据启用setViewport()来更换它。要应用OpenGL开展3D渲染,只需启用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的派生类,随后从完成它的2个纯虚似公共性涵数逐渐: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()来设定好几个组成变换。
  新项目变换从父项到子项目累加,因而假如父项和子项目都转动九十度,子项目的总变换将为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标示设定为将子项目层叠在父亲项以后。
    2个平级项的层叠次序也测算每一个项的子项目和子项目。因而,假如一个新项目坐落于另一个新项目以上,那麼它的全部子项目也将坐落于别的新项目的全部子项目以上。

事情

  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的缓存文件方式。缓存文件用以根据分派和3D渲染到非显示屏清晰度缓冲区域来加速3D渲染速率,当项必须再次制作时,能够器重该缓冲区域。针对一些制作机器设备,缓存文件立即储存在图型运行内存中,这促使3D渲染十分迅速。
  在这里插入图片描述

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的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()。这将通告情景将要产生的变更,便于它能够升级其项几何图形数据库索引;不然,情景将不清楚项的新几何图形,而且結果未定义(一般,3D渲染产品工件留到主视图中)。
  再次完成这一涵数,让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开发技术:图形视图框架(一)基本介绍》
下一篇:敬请关注

评论(0条)

刀客源码 游客评论