• 4759阅读
  • 3回复

[提问]实现了QGraphicsItem的shape函数,但是不能完全按照所画的图形触发鼠标事件 [复制链接]

上一主题 下一主题
 

只看楼主 倒序阅读 楼主  发表于: 2014-08-15
各位大侠,我实现了一个类,继承自QGraphicsItem.我需要在点击所画的图形时触发鼠标事件,点击大多数地方都能触发鼠标事件,但是某些地方不能触发。各位帮忙看看,这个实现有什么问题

  1. QPainterPath GraphicsArcItem::shape() const
  2. {
  3.     QPainterPathStroker pathStroker;
  4.     QPainterPath tmp;
  5.     pathStroker.setWidth(40);
  6.     pathStroker.setCapStyle(Qt::FlatCap);
  7.     pathStroker.setJoinStyle(Qt::RoundJoin);
  8.     tmp = pathStroker.createStroke(path);
  9.     return tmp;
  10. }
  1. void GraphicsArcItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
  2. {
  3.         QPen pen;
  4.         QConicalGradient gradient(0,0,startAngle*16/16);
  5.         gradient.setColorAt(0.0,startColor);
  6.         gradient.setColorAt(spanAngle/360.0,endColor);
  7.         pen.setWidth(40);
  8.         pen.setCapStyle(Qt::FlatCap);
  9.         pen.setJoinStyle(Qt::RoundJoin);
  10.         pen.setBrush(gradient);
  11.         painter->setPen(pen);
  12.         painter->setRenderHint(QPainter::Antialiasing,true);
  13. //        painter->drawArc(GraphicsArcItem::RECT,startAngle*16,spanAngle*16);
  14.         path.arcMoveTo(GraphicsArcItem::RECT,startAngle);
  15.         path.arcTo(GraphicsArcItem::RECT,startAngle,spanAngle);
  16.         painter->drawPath(path);
  17. }



只看该作者 1楼 发表于: 2014-08-15
刚刚我复查了一下我的代码,发现我的boundingRect函数返回的矩形,不能完全包含我的我所画的弧形。然后把矩形变大后发现就能按照我所希望的运行了。

从这点看来Qt在做鼠标事件传递时,应该是先通过BoundingRect查找在此点Item,然后再通过shape函数来决定是否需要把该事件发送给某个Item。

谢谢各位的关注
离线daily

只看该作者 2楼 发表于: 2014-08-15
楼主,我有一个问题请教你下,QPainterPath 的Addpath 函数如果循环调用后 返回的shape是个啥?

只看该作者 3楼 发表于: 2014-08-15
楼主,我有一个问题请教你下,QPainterPath 的Addpath 函数如果循环调用后 返回的shape是个啥?


QPathStoker根据自身的宽度和你所绘制的路径,画出一个包含所有路径的轮廓。可以想象一下我们的电线,线芯就是我们的路径,其宽度是一定的,而线皮就是我们的stroker所画出来的轮廓,不论线芯怎么改变形状,线皮都包含着线芯。线皮的直径就是stroker的宽度,但是绘制路径时用的画笔有一定的宽度,所以我们最终画出的图形可能会包含轮廓。

所以不管你怎么重复添加路径,stroker返回新的路径都会包含你添加的路径
快速回复
限100 字节
 
上一个 下一个