QGraphic学习笔记 - 图文

同样的一个返回item轮廓的函数

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

返回该item的轮廓区域,返回的区域的坐标系统依赖于参数itemToDeviceTransform,如果你传递一个Qtransform对象作为参数,那么函数将返回本地坐标系统区域

返回的区域是item内容可见的一个大概的轮廓,尽管计算起来很浪费空间和时间,但是比boundingRect()更精准,而且当重绘时候,它还能避免不必要的重绘。对像线或者简单的多边形来说非常有效。

也可以调节轮廓区域的粒度通过调用setBoundingRegionGranularity(),默认的粒度是0,这时候item的区域和轮廓矩形一样的。

itemToDeviceTransform是从item坐标系统到设备坐标系统的一个转换。如果你想让这个函数返回一个场景坐标区域,可以用函数sceneTransform()作为参数。 相关函数qreal QGraphicsItem::boundingRegionGranularity () const 返回item的轮廓区域粒度

5、void QGraphicsItem::setPos ( const QPointF & pos )

在父对象坐标系统中设置item的位置为pos,对没有父对象的items,pos使用的场景的坐标系统,

6、QPointF QGraphicsItem::scenePos () const

返回该item在场景中的坐标点,等价于调用函数mapToScene(0, 0). 7、QPointF QGraphicsItem::pos () const

返回item在父坐标系中的位置,如果没有父坐标系,那么返回在场景坐标系中的位置,此时等价于调用scenePos (),可以直接调用scenePos ()来获取该item在场景中的位置,从而忽略其父对象。

8、enum QGraphicsItem::CacheMode

设置绘图的缓冲模式,默认是没有缓冲,如果使用缓冲区的话,在重绘时候,非常快

设置缓冲模式使用函数QGraphicsItem::setCacheMode(). 9、bool QGraphicsItem::acceptDrops () const

如果item能够接受拖拽事件,就返回真,否则返回假,默认的不能接受拖拽事件 同类函数

void QGraphicsItem::setAcceptDrops ( bool on )

如果On是真的话,就设置item可以接受拖拽事件,否则对拖拽事件是透明的,也就是不能响应拖拽,默认是不响应的。

10、bool QGraphicsItem::acceptHoverEvents () const

如果可以接受鼠标悬浮在他上面的事件,就返回真,否则返回假。默认也是不接受该事件的。 同样的用于设置是否接受该事件的函数

void QGraphicsItem::setAcceptHoverEvents ( bool enabled ) 如果enabled为真,就接受,否则就不接受。

11、Qt::MouseButtons QGraphicsItem::acceptedMouseButtons () const

返回这个item所能接受的鼠标事件的鼠标键,默认的是所有的鼠标键事件都能接受。 同样的使用函数void QGraphicsItem:: setAcceptedMouseButtons ( Qt::MouseButtons buttons )来设置接受的鼠标键事件,如果想忽略某个鼠标键事件,可以用setAcceptedMouseButtons(0)

12、void QGraphicsItem::advance ( int phase ) [virtual]

这个虚函数被QGraphicsScene::advance()调用两次,第一次调用,所有的items都调用,使用参数phase=0,表示场景中所有的items都将advance(前进),然后所有的items都将调用,使用参数phase=1,重写这个函数,可以来刷新你的item,如果你需要简单的场景控制动画。

默认的该函数什么事都不做

如果想写动画,可以使用两种方法,一个使用QGraphicsItemAnimation,,或多重继承Qobject和QgraphicsItem,然后使用QObject::startTimer() 和 QObject::timerEvent().来使item成动画。

13、QList QGraphicsItem::childItems () const

返回孩子item的一个链表,这些items按照栈顺序排列,考虑了item的插入顺序和Z-values 14、QRectF QGraphicsItem::childrenBoundingRect () const

返回这个item的所有子孙items的本地坐标系统轮廓矩形。这个矩形包括了这个item所有的子孙item,如果这个item不含有子孙item,这个函数将返回一个空的矩形。

返回的矩形不包括item本身的轮廓矩形,只返回子孙item的矩形轮廓,如果你想包含item本身的矩形区域,可以使用QRectF::operator|()把boundingRect()和hildrenBoundingRect()或起来。

这个函数很复杂,它决定了返回轮廓的大小通过重复所有子孙item 15、void QGraphicsItem::clearFocus ()

去除item的光标,如果原来有光标焦点,当焦点失去时候,事件focus out event会发送给这个item,提示他将会失去焦点。

Item只有设置了ItemsFocusable属性,或者widget设置了合适的焦点策略,才能接受键盘焦点。

16、bool QGraphicsItem::collidesWithItem ( const QGraphicsItem * other, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape ) const [virtual] 如果这个item和另一个item碰撞就返回真,mode是应用于其他item的,默认是Qt::IntersectsItemShape,如果其他的item和这个item相互影响或者包含,被包含于这个item的形状(详见Qt::ItemSelectionMode)。

默认的函数是就基于外形相互影响,它调用两个item的shape()函数,这将会花费很大时间,你可以在QgraphicsItem子类中重写这个函数,提供一个简单的算法。这样你可以使用自己item的一些参数,这样可以提高碰撞侦测的效果。例如,两个完全没有转换的圆item的碰撞可以通过对比他们的圆心位置和半径

17、bool QGraphicsItem::collidesWithPath ( const QPainterPath & path, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape ) const [virtual] 如果item按照path碰撞就返回真,

18、QList QGraphicsItem::collidingItems ( Qt::ItemSelectionMode mode = Qt::IntersectsItemShape ) const 返回和这个item相互碰撞的item的链表 碰撞侦测模式取决于mode,

19/ QGraphicsItem * QGraphicsItem::commonAncestorItem ( const QGraphicsItem * other ) const

返回item最近的祖先item,如果other为0,或者没有祖先item,就返回0 20、bool QGraphicsItem::contains ( const QPointF & point ) const [virtual]

如果item包含了点point就返回TRUE,否则返回FALSE,最常用的是在QgraphicsView中调用,来判断这个item是否在光标下面,如果要重写这个函数,那就尽可能的简单。默认的这个函数调用的shape()函数

21、void QGraphicsItem::contextMenuEvent ( QGraphicsSceneContextMenuEvent * event ) [virtual protected]

右键菜单事件,可以在子类中重写这个函数,event里面包含了事件要具体处理的数据。 如果忽略这个事件,调用函数QEvent::ignore(),事件event将会被传播到任何在该item之下的items,如果没有item响应这个事件,那么场景就忽略这个事件,传递给view视图 通常是响应该事件打开一个右键菜单,例如

void CustomItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) {

QMenu menu;

QAction *removeAction = menu.addAction(\ QAction *markAction = menu.addAction(\

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4