Qt图形视图QGraphicsItem类

论坛 期权论坛     
选择匿名的用户   2021-5-26 12:32   193   0
<p style="zoom:1; margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; line-height:25.9200000762939px; color:rgb(51,51,51); font-family:Arial; font-size:14px"> <span style="zoom:1; font-family:&#39;Microsoft YaHei&#39;; font-size:16px"></span></p>
<span style="font-size:12px">     QGraphicsItem类是视图框架的一部分,是在一个QGraphicsScene中最基本的图形类,它为绘制你自己的item提供了一个轻量级的窗口,包括声明item的位置,碰撞检测,绘制重载和item之间的相互作用通过事件处理。<br> <br> <br> Qt提供了一系列标准的items对一些常见的图像,非常的方便,有下面这些:<br> <br> <br> QGraphicsEllipseItem  提供一个椭圆item<br> <br> <br> QGraphicsLineItem     提供一条线的item<br> <br> <br> QGraphicsPathItem     提供一个任意的路径item<br> <br> <br> QGraphicsPixmapItem   提供一个图形item<br> <br> <br> QGraphicsPolygonItem  提供一个多边形item<br> <br> <br> QGraphicsRectItem     提供一个矩形item<br> <br> <br> QGraphicsSimpleTextItem 提供一个简单的文本item<br> <br> <br> QGraphicsTextItem     提供一个文本浏览item<br> <br> <br> item的所有几何位置信息都建立在本地坐标系统上,item的位置,使用pos()获得,是唯一一个不再本地item中实现的。它返回的是item在父亲坐标系统中的位置,关于坐标系统可以详细参看 The Graphics View Coordinate System<br> <br> <br> 通过调用哪个setVisible(),可以设置item是否可见,隐藏一个item同时也隐藏了他的孩子,相似的,你可以通过调用setEnabled()来是指item是否可用。如果禁用了item,那么它所有的孩子都不可用。默认的,items都是可见和可用的。来开关一个item是否被选择,首先通过设置itemsSelectable flag来使能选择。然后调用setSelect(),通常,是否可被选择的开关时打开的<br> <br> <br>  <br> <br> <br> 写自己的item图形,首先应该继承QGraphicsItem,然后重写他的两个纯虚公共函数,<br> <br> <br> boundingRect()和paint(),第一个函数返回绘制item大概的区域,第二个函数用来绘制item内容<br> <br> <br> boundingRect()函数有很多用处,场景在boundingRect()来建立它的item的index,视图view使用它来剪切可见的item,在重新绘制item时候,来决定相互重叠的部分,此外,item的碰撞检测机制也使用的boundingRect()来提供一个高效的定点,在collidesWithItem()更好的碰撞算法建立在调用函数shape(),shape()函数以QpainterPath类型返回item的精准的轮廓。<br> <br> <br> 一般的,场景不希望item的boundingRect()和shape()变化,除非该item被通告,如果想通过一些方法改变item的形状,首先应该调用QgraphicsScene()来允许场景QgraphicsScene来刷新它的item记录。<br> <br> <br> 碰撞检测可以通过下面两种方法来完成<br> <br> <br> 1、重写shape()函数来返回item的精准轮廓,依靠默认的collidesWithItem()来做外形交集。如果item轮廓和复杂时候,这个消耗是很大的<br> <br> <br> 2、重写collidesWithItem(),提供一个自己的item和轮廓碰撞的算法<br> <br> <br> Contains()函数可以调用,用来决定一个item是否包含一个点。这个函数也可以重写,contains()函数默认的方法是通过调用shape()来完成的。<br> <br> <br> Items中也可以包含其他的items,也可以被别的items包含,所有的items可以有一个父亲item和一串孩子items,除非一个item没有父亲,否则它的位置是在父亲坐标中,父亲items遗传他的位置和转换给孩子item<br> <br> <br> 转换<br> <br> <br> QgraphicsItem支持投射转换,有很多方法来改变item的转换,对于简单的转换,可以调用函数setRotation()或者setScale(),可以传递一个转换矩阵给函数setTransform(),对于一些更复杂的转换,可以通过调用函数setTransformations()来设置一系列组合的转换。<br> <br> <br> Item转换从父亲到孩子进行聚集,因此如果一个父亲和孩子item都旋转90度,那么孩子就旋转了180度,相似的,如果父亲item放大了2X倍,那么孩子item就被方法4X倍,一个item的转换不影响他的外观,所有和外观有关的函数(例如contains(),update()和所有的映射mapping函数)将会在本地坐标中操作,更方便的,QgraphicsItem提供函数sceneTransform(),将会返回item所有的转换矩阵,scenePos()将会返回item在场景坐标中的位置,重新设置item的矩阵,调用函数resetTransform()<br> <br> <br> 一般的转换回产生一个不同的结果,这取决于转换应用的顺序,例如,如果你放大一个转换,然后再旋转它,可能和你先旋转它得到的结果不一样,你设置转换属性的顺序并不影响转换的结果,(也就是仍旧会按照你的转换命令去转换,只是最后得到的图
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP