Qt QPainter实现3D柱状图

利用QPainter实现漂亮的柱状图。看一下效果
这里写图片描述

利用渐进色实现三维的效果。
代码如下

  1 void qbarpainter::paintEvent( QPaintEvent * )
  2 {
  3     QPainter painter(this);
  4     painter.setRenderHint(QPainter::Antialiasing);
  5     painter.setBrush(QColor("black"));
  6     painter.drawRect(rect());
  7 
  8     drawBarIndex(0,50,painter,QColor("#7A6864"));
  9     drawBarIndex(1,50,painter,QColor("#4D84AF"));
 10     drawBarIndex(2,100,painter,QColor("#B8B06C"));
 11     drawBarIndex(3,100,painter,QColor("#BD2799"));
 12     drawBarIndex(4,100,painter,QColor("#39B708"));
 13     drawBarIndex(5,100,painter,QColor("#05AA67"));
 14     drawBarIndex(6,100,painter,QColor("#3408AF"));
 15     drawBarIndex(7,100,painter,QColor("#980A0A")); 
 16     drawBarIndex(8,100,painter,QColor("#007CF8")); 
 17 }
 18 
 19 
 20 void qbarpainter::drawBarIndex( int index, int valus ,QPainter &painter, QColor color )
 21 {
 22     int w = width();
 23     int h = height()/4;
 24     int leftw = 100 + index*100;
 25     int step = valus*h*2/100;
 26 
 27     //bottom 椭圆
 28     painter.save();
 29     QRectF bottomrect(leftw,h*3-10,50,15);
 30     QLinearGradient bottomlinear(leftw,h*3-step,50,step);
 31     bottomlinear.setColorAt(0, color);
 32     bottomlinear.setColorAt(0.3, color.lighter(200));
 33     bottomlinear.setColorAt(0.35, color.lighter(180));
 34     bottomlinear.setColorAt(0.9, color.darker(200));
 35     bottomlinear.setColorAt(1, color);
 36     bottomlinear.setStart(leftw,h);
 37     bottomlinear.setFinalStop(leftw+50,h);
 38     painter.setPen(Qt::NoPen);
 39     painter.setBrush(bottomlinear);
 40     painter.drawEllipse(bottomrect);    
 41     painter.restore();
 42 
 43     //背景
 44     painter.save();
 45     QLinearGradient bgLinearGradient(leftw,h,50,h*2);
 46     bgLinearGradient.setColorAt(0, QColor("#A8C0D0"));
 47     bgLinearGradient.setColorAt(0.3, QColor("#CFDBE3"));
 48     bgLinearGradient.setColorAt(0.35, QColor("#A2BBCC").lighter(120));
 49     bgLinearGradient.setColorAt(0.9, QColor("#767775").lighter(120));
 50     bgLinearGradient.setColorAt(1, QColor("#A8C0D0"));
 51     bgLinearGradient.setStart(leftw,h);
 52     bgLinearGradient.setFinalStop(leftw+50,h);
 53 
 54     QRectF bgrect(leftw,h,50,h*2);
 55 
 56     painter.fillRect(bgrect, bgLinearGradient);
 57     painter.restore();
 58 
 59     //中间
 60     painter.save();
 61     QRectF midrect(leftw,h*3-step,50,step);
 62 
 63     QLinearGradient midLinearGradient(leftw,h*3-step,50,step);
 64     midLinearGradient.setColorAt(0, color);
 65     midLinearGradient.setColorAt(0.3, color.lighter(200));
 66     midLinearGradient.setColorAt(0.35, color.lighter(180));
 67     midLinearGradient.setColorAt(0.9, color.darker(200));
 68     midLinearGradient.setColorAt(1, color);
 69     midLinearGradient.setStart(leftw,h);
 70     midLinearGradient.setFinalStop(leftw+50,h);
 71 
 72     painter.fillRect(midrect, midLinearGradient);   
 73     painter.restore();
 74 
 75     ////top 椭圆
 76     painter.save();
 77     painter.setPen(Qt::NoPen);
 78     QLinearGradient fade3(leftw, h-30,50,100);
 79     fade3.setColorAt(0, QColor("#A8C0D0"));
 80     fade3.setColorAt(0.9, QColor("#CFDBE3"));
 81     fade3.setColorAt(0.35, QColor("#A2BBCC").darker(120));
 82     fade3.setColorAt(0.3, QColor("#767775").darker(120));
 83     fade3.setColorAt(0, QColor("#A8C0D0"));
 84     fade3.setStart(leftw,h-30);
 85     fade3.setFinalStop(leftw,h+20);
 86     painter.setBrush(fade3);
 87     QRectF rectangle(leftw, h-9, 50, 16);
 88     painter.drawEllipse(rectangle);
 89     painter.restore();
 90     //////////////////////////////////////////////////////////////////////////
 91 
 92     //mid 椭圆
 93     painter.save();
 94     QRectF midtoprect(leftw,h*3-step-9,50.5,15);
 95 
 96     QLinearGradient midtoplinear(leftw,h*3-step,50,step);
 97     midtoplinear.setColorAt(0, color.darker(100));
 98     midtoplinear.setColorAt(0.3, color.darker(100));
 99     midtoplinear.setColorAt(0.35, color.darker(100));
100     midtoplinear.setColorAt(0.9, color.darker(100));
101     midtoplinear.setColorAt(1, color.darker(100));
102     midtoplinear.setStart(leftw,h);
103     midtoplinear.setFinalStop(leftw+50,h);
104     painter.setPen(Qt::NoPen);
105     painter.setBrush(midtoplinear);
106     painter.drawEllipse(midtoprect);    
107     painter.restore();
108 }

猜你喜欢

转载自www.cnblogs.com/ybqjymy/p/13395403.html