QGraphicsItem绘制重叠区域

效果如下:
在这里插入图片描述
在这里插入图片描述

我通过重写一个继承自QGraphicitem的类来实现上述功能,绘制重叠区域主要通过QPainterPath来实现,核心代码如下:

void myGraphicRectItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    QPen mPen= QPen(Qt::yellow);
    painter->setPen(mPen);
    //绘制旋转后的矩形
    painter->drawPolygon(m_oldRectPolygon);
    //绘制旋转圆形
    mPen.setWidth(2);
    mPen.setColor(Qt::green);
    painter->setPen(mPen);
    QPointF pf = getSmallRotateRectCenter(m_oldRectPolygon[0],m_oldRectPolygon[1]);
    QRectF rect = QRectF(pf.x()-10,pf.y()-10,20,20);
    painter->drawEllipse(rect);//绘制圆形
    painter->drawPoint(pf);//绘制点
    //有重叠的情况
    if(!this->scene()->collidingItems(this).isEmpty())
    {
       QPainterPath path,pathOthers;
       QList<QGraphicsItem *> lstcolliItems = this->scene()->collidingItems(this);
       int nColliNum = lstcolliItems.count();
       for(int i = 0;i<nColliNum;i++)
       {
           QGraphicsItem* pTempItem = this->scene()->collidingItems(this)[i];
           QPainterPath tempPath = pTempItem->shape();
           tempPath.translate(pTempItem->pos());//转换到view中的坐标
           pathOthers += tempPath;//记录与本item重叠的item的路径
       }
       path.addPolygon(m_oldRectPolygon);
       path.translate(this->pos());//转换到view中的坐标
       path &= pathOthers;//计算重叠部分的路径path
       path.translate(-this->pos().x(),-this->pos().y());//转换回本Item中的坐标
       QBrush brush(Qt::cyan);
       mPen.setColor(Qt::blue);
       painter->setPen(mPen);
       painter->setBrush(brush);
       painter->drawPath(path);//绘制重叠区域
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GreenHandBruce

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值