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());
}
}