Qt实现3D饼图
来源:互联网 发布:python 输出汉字乱码 编辑:程序博客网 时间:2024/05/22 06:29
实现思路:采取画多个圆进行叠加实现3D的效果(参考另外的一个博客内容,忘记具体是哪个了)。
效果1:
代码实现:
void CPieWidget::drawDefault3DPie( QPainter *painter ){qreal sum = getSumValue();int radius = m_radius; //直径//QRect rect = m_pierect;//(w/2-radius/2,h/2-radius/2,radius,radius);painter->save();QPoint centerp = m_pierect.center();QTransform tr;tr.translate(centerp.x(),centerp.y());tr.rotate(-20,Qt::ZAxis);tr.rotate(0,Qt::YAxis);painter->setTransform(tr);QRect rect(-radius/2,-radius/2,radius,radius);//画底图int dep = 20/*radius/30*/;QPen pen;pen.setWidthF(0.2);painter->setPen(pen);//painter->setPen(Qt::NoPen);QStringList keylist = m_datamap.keys();for (int j = 0 ; j < dep; ++j){qreal index = 30; //启始位置int colorindex = 0;for (int i = 0; i < keylist.count(); ++i){qreal v = m_datamap.value(keylist.at(i));v =v/sum*(360);QRect newrect = rect;if (m_explodedindex == i || m_isexploded){QPoint newcenter = newrect.center();int midangel = index+v/2;QPoint tp = getMovePoint(midangel);newcenter += tp;newrect.moveCenter(newcenter);}QPoint cp = newrect.center() + QPoint(j/2,-j);newrect.moveCenter(cp);QPoint centerPoint = newrect.center();QColor firstColor = m_colorlist.at(colorindex);QRadialGradient firstGradient(centerPoint, radius/2);if (j == 19){firstGradient.setColorAt(0, firstColor.lighter(120));firstGradient.setColorAt(1.0, firstColor.lighter(100));}elsefirstGradient.setColorAt(1.0, firstColor.dark(150));painter->setBrush(firstGradient);painter->drawPie(newrect, index * 16, v * 16);index+=v;colorindex++;if (colorindex==m_colorlist.count()){colorindex = 0;}}}painter->restore();}
代码如下:
void CPieWidget::drawDount3DPie( QPainter *painter ){qreal sum = getSumValue();int radius = m_radius; //直径QPoint centerp = m_pierect.center();painter->save();QTransform tr;tr.translate(centerp.x(),centerp.y());tr.rotate(-20,Qt::ZAxis);tr.rotate(0,Qt::YAxis);painter->setTransform(tr);//QRect rect(w/2-radius/2,h/2-radius/2,radius,radius);QRect rect(-radius/2,-radius/2,radius,radius);//画底图int dep = 20/*radius/30*/;QPen pen;pen.setWidthF(0.2);painter->setPen(pen);painter->setPen(Qt::NoPen);QStringList keylist = m_datamap.keys();for (int j = 0 ; j < dep; ++j){qreal index = 30; //启始位置int colorindex = 0;for (int i = 0; i < keylist.count(); ++i){qreal v = m_datamap.value(keylist.at(i));v =v/sum*(360);QRect newrect = rect;if (m_explodedindex == i || m_isexploded){QPoint newcenter = newrect.center();int midangel = index+v/2;QPoint tp = getMovePoint(midangel);newcenter += tp;newrect.moveCenter(newcenter);}QPoint cp = newrect.center() + QPoint(j/2,-j);newrect.moveCenter(cp);QPoint centerPoint = newrect.center();QColor firstColor = m_colorlist.at(colorindex);QRadialGradient firstGradient(centerPoint, radius/2);firstGradient.setColorAt(0, Qt::transparent);firstGradient.setColorAt(0.6, Qt::transparent);if (j == 19){firstGradient.setColorAt(0.61, firstColor.lighter(120));firstGradient.setColorAt(1.0, firstColor.lighter(100));}else{firstGradient.setColorAt(0.61, firstColor.dark(120));firstGradient.setColorAt(1.0, firstColor.dark(150));}painter->setBrush(firstGradient);painter->drawPie(newrect, index * 16, v * 16);index+=v;colorindex++;if (colorindex==m_colorlist.count()){colorindex = 0;}}}painter->restore();}
相关变量说明
QHash<QString,float> m_datamap;
QList<QColor> m_colorlist;
QRect m_pierect;
QRect m_legendrect;
int m_radius;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
这种方式实现可能会影响效率,因为循环画了多次。
阅读全文
0 0
- Qt实现3D饼图
- QT 实现3d饼状图---3D pie chart
- Qt实现金字塔图(3D和2D)
- Qt实现3D纹理渲染自由旋转空间立方体
- Qt实现3D纹理渲染自由旋转空间立方体
- Qt 3D Overview
- Qt 3D教程(四)结合Qt Quick来实现动画的效果
- Qt d指针简单实现及解析
- Qt d指针简单实现及解析
- 用Qt实现2D绘图
- .net实现3D饼图
- .net实现3D饼图
- .net实现3D饼图
- .net实现3D饼图
- .net实现3D饼图
- .net实现3D饼图
- .net实现3D饼图
- .net实现3D饼图
- C++ STL-deque基本原理
- linux学习1
- git的使用,用以记录,以后忘记查看,有想要学习的童鞋也可参考
- ReentrantLock与synchronized
- ? StringWriter
- Qt实现3D饼图
- 小议字节对齐
- Service中使用Toast,及遇到的问题
- 方法、传参
- 蓝桥杯李白醉酒问题
- [LeetCode] 268. Missing Number
- android studio 导入volley
- SPOJ 5161 FACVSPOW
- 线程之间通过管道通信