目录
一、项目介绍
- 一、项目介绍
- 二、项目基本配置
- 三、UI界面设置
- 四、主程序实现
- 4.1 widget.h头文件
- 4.2 widget.cpp源文件
- 五、效果演示
本文介绍利用QPainter实现三维饼状图的绘制,由于Qt中没有三维饼状图的绘制组件,因此只能自行绘制。
二、项目基本配置新建一个Qt案例,项目名称为“PieTest”,基类选择“QWidget”,取消选中创建UI界面复选框,完成项目创建。
三、UI界面设置无UI界面
四、主程序实现 4.1 widget.h头文件头文件中只需声明paintEvent函数:
private:
void paintEvent( QPaintEvent* e);
4.2 widget.cpp源文件
paintEvent函数定义如下:
void Widget::paintEvent( QPaintEvent* e)
{
int start=240;//定义起始角度
int ang=30;//定义角度范围
QPainter painter(this);
// 去除画笔
painter.setPen(Qt::NoPen);
// 设置反锯齿
painter.setRenderHint(QPainter::Antialiasing);
//三维饼状图
// 顶层圆面
QRectF rect_top(10.0, 20.0, 280.0, 160.0);
// 底层圆面(宽高相同,y在顶层圆面下方40处)
QRectF rect_bottom(10.0, 60.0, 280.0, 160.0);
// 中间矩形
QRectF rect_midd(10.0, 100.0, 280.0, 40.0);
// 扇形起始角度
int startAngle = start * 16; //从230度
// 扇形覆盖范围
int spanAngle = ang * 16;
painter.setBrush(QColor(97,35,35,255));//饼状图高度颜色
// 绘制底层圆面
painter.drawEllipse(rect_bottom);
// 绘制中间矩形
painter.drawRect(rect_midd);
painter.setBrush(QColor(Qt::darkYellow));//饼状图占比高度颜色
// 绘制底层扇形
painter.drawPie(rect_bottom, startAngle, spanAngle);
// 扇形的弦与弧的交点
double pi = 3.1415926;
double dx1 = rect_top.width() * 0.5 * cos(start * pi / 180);
double dy1 = rect_top.height() * 0.5 * sin(start * pi / 180);
double dx2 = rect_top.width() * 0.5 * cos((start+ang) * pi / 180);
double dy2 = rect_top.height() * 0.5 * sin((start+ang) * pi / 180);
// 求交点的坐标值
QPointF posBackCenter = QPointF(rect_top.center());
double dX1 = posBackCenter.x() + dx1 + 0.5;
double dY1 = posBackCenter.y() - dy1 + 0.5;
double dX2 = posBackCenter.x() + dx2 + 0.5;
double dY2 = posBackCenter.y() - dy2 + 0.5;
// 记录交点
QPointF topLeft = QPointF(dX1, dY1);
QPointF bottomRight = QPointF(dX2, dY2) + QPointF(0,40);
QPointF bottomLeft = topLeft + QPointF(0,40);
painter.setBrush(QColor(Qt::darkYellow));
// 绘制连接扇形的区域
QPolygonF path;
path
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?