qt绘制半透明的遮罩(通过qbrush设置半透明图片实现)

1,264 阅读2分钟

qt实现的半透明遮罩效果如下:

步骤:

1.用ps做一张透明度为50%的png图 ,如下:

2.在工程中吧png图片添加到资源中,如下:

 

3.在绘制矩形的时候,设置brush,如下:

        //设置笔刷为图片平铺
        QImage image(":/maskP");
        QBrush brush(image);
        brush.setStyle(Qt::TexturePattern);//设置平铺模式
        painter->setBrush(brush);

 然后绘制矩形,就实现了遮罩效果,绘制矩形的主要代码如下:

void mygraphicCaliperitem::setRectSize(QRectF mrect)
{
    m_tCaliRect.m_RECT = mrect;
    m_tCaliRect.m_newShearRECT = mrect;
    m_tCaliRect.m_RotateCenter.setX(m_tCaliRect.m_RECT.x()+m_tCaliRect.m_RECT.width()/2);
    m_tCaliRect.m_RotateCenter.setY(m_tCaliRect.m_RECT.y()+m_tCaliRect.m_RECT.height()/2);
    //test 扭曲
    m_tCaliRect.m_RECTShear = QPolygonF(m_tCaliRect.m_RECT);
    QTransform trans;
    trans.translate(m_tCaliRect.m_RECT.center().x(),m_tCaliRect.m_RECT.center().y());
    trans.shear(m_tCaliRect.m_fShearX,0);
    trans.translate(-m_tCaliRect.m_RECT.center().x(),-m_tCaliRect.m_RECT.center().y());
    m_tCaliRect.m_RECTShear = trans.map(m_tCaliRect.m_RECTShear);//斜切之后的矩形
    //test
    m_tCaliRect.m_RECT_Pol = getRotatePolygonFromPolygon(m_tCaliRect.m_RotateCenter,m_tCaliRect.m_RECTShear,m_tCaliRect.m_RotateAngle);
    //m_RECT_Inside = QRectF(m_RECTShear[0].x()+5,m_RECTShear[0].y()+5,m_RECT.width()-10,m_RECT.height()-10);
    m_tCaliRect.m_RECT_InsideShear.clear();
    m_tCaliRect.m_RECT_InsideShear.append(QPointF(m_tCaliRect.m_RECTShear[0].x()+5,m_tCaliRect.m_RECTShear[0].y()+5));
    m_tCaliRect.m_RECT_InsideShear.append(QPointF(m_tCaliRect.m_RECTShear[1].x()-5,m_tCaliRect.m_RECTShear[1].y()+5));
    m_tCaliRect.m_RECT_InsideShear.append(QPointF(m_tCaliRect.m_RECTShear[2].x()-5,m_tCaliRect.m_RECTShear[2].y()-5));
    m_tCaliRect.m_RECT_InsideShear.append(QPointF(m_tCaliRect.m_RECTShear[3].x()+5,m_tCaliRect.m_RECTShear[3].y()-5));
    m_tCaliRect.m_RECT_InsideShear.append(QPointF(m_tCaliRect.m_RECTShear[0].x()+5,m_tCaliRect.m_RECTShear[0].y()+5));
    m_tCaliRect.m_RECT_Inside_Pol = getRotatePolygonFromPolygon(m_tCaliRect.m_RotateCenter,m_tCaliRect.m_RECT_InsideShear,m_tCaliRect.m_RotateAngle);
    m_tCaliRect.m_RECT_TL = QRectF(m_tCaliRect.m_RECTShear[0].x()-5,m_tCaliRect.m_RECTShear[0].y()-5,10,10);//左上角顶点
    m_tCaliRect.m_RECT_TL_Pol = getRotatePolygonFromRect(m_tCaliRect.m_RotateCenter,m_tCaliRect.m_RECT_TL,m_tCaliRect.m_RotateAngle);
    m_tCaliRect.m_RECT_TR = QRectF(m_tCaliRect.m_RECTShear[1].x()-5,m_tCaliRect.m_RECTShear[1].y()-5,10,10);//右上角顶点
    m_tCaliRect.m_RECT_TR_Pol = getRotatePolygonFromRect(m_tCaliRect.m_RotateCenter,m_tCaliRect.m_RECT_TR,m_tCaliRect.m_RotateAngle);
    m_tCaliRect.m_RECT_BL = QRectF(m_tCaliRect.m_RECTShear[3].x()-5,m_tCaliRect.m_RECTShear[3].y()-5,10,10);//左下角顶点
    m_tCaliRect.m_RECT_BL_Pol = getRotatePolygonFromRect(m_tCaliRect.m_RotateCenter,m_tCaliRect.m_RECT_BL,m_tCaliRect.m_RotateAngle);
    m_tCaliRect.m_RECT_BR = QRectF(m_tCaliRect.m_RECTShear[2].x()-5,m_tCaliRect.m_RECTShear[2].y()-5,10,10);//右下角顶点
    m_tCaliRect.m_RECT_BR_Pol = getRotatePolygonFromRect(m_tCaliRect.m_RotateCenter,m_tCaliRect.m_RECT_BR,m_tCaliRect.m_RotateAngle);
    m_tCaliRect.m_RECT_Rotate = QRectF((m_tCaliRect.m_RECTShear[1].x()+m_tCaliRect.m_RECTShear[2].x())/2-10,(m_tCaliRect.m_RECTShear[1].y()+m_tCaliRect.m_RECTShear[2].y())/2-10,20,20);//矩形右侧旋转标记矩形
    m_tCaliRect.m_RECT_Rotate_Pol = getRotatePolygonFromRect(m_tCaliRect.m_RotateCenter,m_tCaliRect.m_RECT_Rotate,m_tCaliRect.m_RotateAngle);
    m_tCaliRect.m_RECT_Scan_Dir = QRectF((m_tCaliRect.m_RECTShear[0].x()+m_tCaliRect.m_RECTShear[1].x())/2-5,(m_tCaliRect.m_RECTShear[0].y()+m_tCaliRect.m_RECTShear[1].y())/2-5,10,10);
    QPolygonF tempPol = getRotatePolygonFromRect(m_tCaliRect.m_RotateCenter,m_tCaliRect.m_RECT_Scan_Dir,m_tCaliRect.m_RotateAngle);
    QVector<QPointF> tempv;
    tempv.append(QPointF(tempPol[0]));
    tempv.append(QPointF((tempPol[1].x()+tempPol[2].x())/2,(tempPol[1].y()+tempPol[2].y())/2));
    tempv.append(QPointF(tempPol[3]));
    m_tCaliRect.m_RECT_Scan_Dir_Pol = QPolygonF(tempv);//扫描方向的三角形
    m_tCaliRect.m_RECT_Shadow_Dir = QRectF(m_tCaliRect.m_RECT.x()-5,m_tCaliRect.m_RECT.bottomLeft().y()-15,10,10);//投影方向的三角形标记
    QPolygonF tempShadow = QPolygonF(m_tCaliRect.m_RECT_Shadow_Dir);
    tempShadow = trans.map(tempShadow);
    m_tCaliRect.m_RECT_Shadow_Dir_Pol = getRotatePolygonFromPolygon(m_tCaliRect.m_RotateCenter,tempShadow,m_tCaliRect.m_RotateAngle);
    m_tCaliRect.m_RECT_Shear = QRectF((m_tCaliRect.m_RECTShear[2].x()+m_tCaliRect.m_RECTShear[3].x())/2-5,(m_tCaliRect.m_RECTShear[2].y()+m_tCaliRect.m_RECTShear[3].y())/2-5,10,10);
    QPolygonF tempShear = QPolygonF(m_tCaliRect.m_RECT_Shear);
    QTransform transShear;
    transShear.translate(m_tCaliRect.m_RECT_Shear.center().x(),m_tCaliRect.m_RECT_Shear.center().y());//先把中心移动到m_RECT_Shear中心
    transShear.shear(1,0);
    transShear.translate(-m_tCaliRect.m_RECT_Shear.center().x(),-m_tCaliRect.m_RECT_Shear.center().y());//先把中心移动到m_RECT_Shear中心
    tempShear = transShear.map(tempShear);//斜切之后的矩形
    m_tCaliRect.m_RECT_Shear_Pol = getRotatePolygonFromPolygon(m_tCaliRect.m_RotateCenter,tempShear,m_tCaliRect.m_RotateAngle);
}
QPolygonF mygraphicCaliperitem::getRotatePolygonFromPolygon(QPointF ptCenter, QPolygonF polyIn, qreal angle)
{
    QVector<QPointF> vpt;
    for(int i = 0;i<polyIn.count();i++)
    {
        QPointF pf = getRotatePoint(ptCenter,polyIn[i],angle);
        vpt.append(pf);
    }
    return QPolygonF(vpt);
}
QPointF mygraphicCaliperitem::getRotatePoint(QPointF ptCenter, QPointF ptIn, qreal angle)
{
    double dx = ptCenter.x();
    double dy = ptCenter.y();
    double x = ptIn.x();
    double y = ptIn.y();
    double xx,yy;
    xx = (x-dx)*cos(angle*M_PI/180)-(y-dy)*sin(angle*M_PI/180)+dx;
    yy = (x-dx)*sin(angle*M_PI/180)+(y-dy)*cos(angle*M_PI/180)+dy;
    return QPointF(xx,yy);
}
QPolygonF mygraphicCaliperitem::getRotatePolygonFromRect(QPointF ptCenter, QRectF rectIn, qreal angle)
{
    QVector<QPointF> vpt;
    QPointF pf = getRotatePoint(ptCenter,rectIn.topLeft(),angle);
    vpt.append(pf);
    pf = getRotatePoint(ptCenter,rectIn.topRight(),angle);
    vpt.append(pf);
    pf = getRotatePoint(ptCenter,rectIn.bottomRight(),angle);
    vpt.append(pf);
    pf = getRotatePoint(ptCenter,rectIn.bottomLeft(),angle);
    vpt.append(pf);
    pf = getRotatePoint(ptCenter,rectIn.topLeft(),angle);
    vpt.append(pf);
    return QPolygonF(vpt);
}
void mygraphicCaliperitem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    QPen mPen;
    mPen= QPen(Qt::yellow);
    painter->setPen(mPen);
    if(m_ShapeType == CALIPER_RECT)//
    {        
        //设置笔刷为图片平铺
        QImage image(":/maskP");
        QBrush brush(image);
        brush.setStyle(Qt::TexturePattern);//设置平铺模式
        painter->setBrush(brush);
        //绘制旋转后的矩形
        if(m_bSelected)
            painter->setPen(QPen(Qt::green,2));
        else
            painter->setPen(QPen(Qt::green,1));
        painter->drawPolygon(m_tCaliRect.m_RECT_Pol);
        mPen.setColor(Qt::yellow);
        //绘制右下角顶点矩形
        mPen.setWidth(1);
        painter->setPen(mPen);
        //绘制右下角顶点矩形
        QPainterPath path;
        path.moveTo(QPointF((m_tCaliRect.m_RECT_BR_Pol[0].x()+m_tCaliRect.m_RECT_BR_Pol[1].x())/2,(m_tCaliRect.m_RECT_BR_Pol[0].y()+m_tCaliRect.m_RECT_BR_Pol[1].y())/2));
        path.lineTo(QPointF((m_tCaliRect.m_RECT_BR_Pol[2].x()+m_tCaliRect.m_RECT_BR_Pol[3].x())/2,(m_tCaliRect.m_RECT_BR_Pol[2].y()+m_tCaliRect.m_RECT_BR_Pol[3].y())/2));
        path.moveTo(QPointF((m_tCaliRect.m_RECT_BR_Pol[0].x()+m_tCaliRect.m_RECT_BR_Pol[3].x())/2,(m_tCaliRect.m_RECT_BR_Pol[0].y()+m_tCaliRect.m_RECT_BR_Pol[3].y())/2));
        path.lineTo(QPointF((m_tCaliRect.m_RECT_BR_Pol[2].x()+m_tCaliRect.m_RECT_BR_Pol[1].x())/2,(m_tCaliRect.m_RECT_BR_Pol[2].y()+m_tCaliRect.m_RECT_BR_Pol[1].y())/2));
        painter->setPen(QPen(Qt::yellow,2));
        painter->drawPath(path);
        //绘制投影标记
        QPointF pt0 = m_tCaliRect.m_RECT_Shadow_Dir_Pol[0];
        QPointF pt1 = QPointF((m_tCaliRect.m_RECT_Shadow_Dir_Pol[2].x()+m_tCaliRect.m_RECT_Shadow_Dir_Pol[3].x())/2,(m_tCaliRect.m_RECT_Shadow_Dir_Pol[2].y()+m_tCaliRect.m_RECT_Shadow_Dir_Pol[3].y())/2);
        QPointF pt2 = m_tCaliRect.m_RECT_Shadow_Dir_Pol[1];
        painter->drawLine(pt0,pt1);
        painter->drawLine(pt2,pt1);
        //绘制扫描方向标记
        painter->drawPolygon(m_tCaliRect.m_RECT_Scan_Dir_Pol);
        //绘制旋转圆形
        mPen.setWidth(2);
        painter->setPen(mPen);
        QPointF pf = QPointF((m_tCaliRect.m_RECT_Pol[1].x()+m_tCaliRect.m_RECT_Pol[2].x())/2,(m_tCaliRect.m_RECT_Pol[1].y()+m_tCaliRect.m_RECT_Pol[2].y())/2);
        QRectF rect = QRectF(pf.x()-10,pf.y()-10,20,20);
        painter->drawEllipse(rect);//绘制圆形
        painter->drawPoint(pf);//绘制点
        //绘制切变矩形标记
        painter->drawPolygon(m_tCaliRect.m_RECT_Shear_Pol);
        //painter->drawPolygon(m_RECT_Inside_Pol);
//        mPen.setColor(Qt::red);
//        mPen.setWidth(5);
//        painter->setPen(mPen);
//        painter->drawPoint(pCross1);
//        painter->drawPoint(pCross2);
//        painter->drawPoint(pCross3);
//        painter->drawPoint(m_RECT.center());
    }
}