Qt之路径叠加透明

注:Qt中路径叠加效果控制由Qt::FillRule::WindingFill与Qt::FillRule::OddEvenFill控制实现。

 1 void Widget::paintEvent(QPaintEvent *event)
 2 {
 3     Q_UNUSED(event);
 4 
 5     QPainter painter(this);
 6     painter.fillRect(this->rect(),QBrush(QColor(255,255,255)));
 7     painter.setRenderHint(QPainter::Antialiasing);//抗锯齿
 8 
 9     painter.fillRect(this->rect(),QBrush(QColor(0,0,0)));
10 
11     painter.save();
12     painter.setPen(QColor(0,255,0));
13     painter.translate(this->width()/2,this->height()/2);
14 
15     QVector<QPointF> vecPF;
16     for (auto i=0;i<5;i++) {
17         QPointF ptEnd(100.0*cos(72.0*i*M_PI/180.0),100.0*sin(72.0*i*M_PI/180.0));
18         vecPF.push_back(ptEnd);
19     }
20 
21     QPolygonF plgF;
22     QPainterPath path,path1;
23     plgF<<vecPF[4]<<vecPF[1]<<vecPF[3]<<vecPF[0]<<vecPF[2];
24     path.addPolygon(plgF);
25     path.setFillRule(Qt::FillRule::WindingFill);
26 //    path.setFillRule(Qt::FillRule::OddEvenFill);
27     painter.fillPath(path,QBrush(QColor(255,0,0)));
28     painter.restore();
29 
30     QPolygonF plyg1,plyg2;
31     plyg1<<QPointF(10,10)<<QPointF(110,10)<<QPointF(110,110)<<QPointF(10,110);
32     plyg2<<QPointF(20,20)<<QPointF(100,20)<<QPointF(100,100)<<QPointF(20,100);
33     path1.setFillRule(Qt::FillRule::WindingFill);
34 //    path1.setFillRule(Qt::FillRule::OddEvenFill);
35     path1.addPolygon(plyg1);
36     path1.addPolygon(plyg2);
37     painter.fillPath(path1,QBrush(QColor(255,0,0,100)));
38 }

image  image

posted @ 2026-01-28 17:02  左边的翼  阅读(3)  评论(0)    收藏  举报