首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

QT实现自定义多边形维度图

移动开发 4.62KB 51 需要积分: 1
立即下载

资源介绍:

QT自定义维度图,本示例实现六边形战力统计维度图,一种将六个维度的战力统计以六边形图形展示的方法。六个维度是:攻击力、防御力、速度、智力、生命值、特殊能力。六边形战力统计维度图将这些维度以六个边长不等的六边形表示,每个边长代表对应维度的数值大小。通过连接这些边,可以得到一个多边形,多边形的形状和大小表示单位的整体战斗能力。
#include "DimensionChartWidget.h" #include #include #include DimensionChartWidget::DimensionChartWidget(QWidget *parent) : QWidget(parent) { m_radius = 0; m_sidesNumber = 1; init(); } void DimensionChartWidget::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); painter.setPen(QColor(m_backgroundColor)); painter.setBrush(QBrush(m_backgroundColor)); painter.drawRoundedRect(rect(), m_filletRadius, m_filletRadius); // 绘图设备的坐标原点(0,0)在左上角,水平向右增长,垂直向下增长。 // 将坐标系原点移动到界面中间 painter.translate(width() / 2.0, height() / 2.0); // 设中心点到边的垂线与半径的夹角为degree=(360/count)/2 float degree = 360.0 / m_dimensionInfos.size(); // 开始绘制多边形,并为每个区域上色 painter.setPen(m_sidesPen); QPointF lastPoint(0, -m_radius); QVector points; for(int i = 0; i < m_dimensionInfos.size(); i++) { float radian = qDegreesToRadians(degree * (i + 1)); float x = m_radius * qSin(radian); float y = m_radius * qCos(radian); // 绘制该三角区块 QPainterPath path; QPointF point(x, -y); path.lineTo(point); path.lineTo(lastPoint); path.lineTo(0, 0); painter.drawPath(path); // 绘制内线 for(int j = m_sidesNumber - 1; j > 0; j--) { float multiple = (float)j / m_sidesNumber; painter.drawLine(point * multiple, lastPoint * multiple); } // 绘制文本 painter.save(); painter.setPen(m_textPen); painter.setFont(m_textFont); drawText(painter, point, m_dimensionInfos.at(i).text()); painter.restore(); lastPoint = point; points << point * m_dimensionInfos.at(i).percentage(); } // 绘制维度信息 painter.setPen(m_dimensionPen); QColor color = m_dimensionPen.color(); color.setAlpha(150); painter.setBrush(QBrush(color)); QPolygonF polygon(points); QPainterPath painterPath; painterPath.addPolygon(polygon); painter.drawPolygon(polygon); } //绘制文本 void DimensionChartWidget::drawText(QPainter& painter, QPointF point, QString text) { convertPoint(point); QRectF textRect; textRect.setSize(QSize(50, 30)); int flag = Qt::AlignCenter; if(point.x() > 0) { if(point.y() < 0) { //x > 0 y < 0 textRect.setBottomLeft(point); textRect.setTopRight(QPoint(point.x() + 50, point.y() - 30)); flag = Qt::AlignBottom | Qt::AlignLeft; } else if(point.y() > 0) { //x>0 y>0 textRect.setTopLeft(point); textRect.setBottomRight(QPoint(point.x() + 50, point.y() + 30)); flag = Qt::AlignTop | Qt::AlignLeft; } else { //x>0 y=0 point.setY(point.y() - 15); textRect.setTopLeft(point); textRect.setBottomRight(QPoint(point.x() + 50, point.y() + 30)); flag = Qt::AlignVCenter | Qt::AlignLeft; } } else if(point.x() < 0) { if(point.y() < 0) { //x<0 y<0 textRect.setBottomRight(point); textRect.setTopLeft(QPoint(point.x() - 50, point.y() - 30)); flag = Qt::AlignBottom | Qt::AlignRight; } else if(point.y() > 0) { //x<0 y>0 textRect.setTopRight(point); textRect.setBottomLeft(QPoint(point.x() - 50, point.y() + 30)); flag = Qt::AlignTop | Qt::AlignRight; } else { //x<0 y=0 point.setY(point.y() - 15); textRect.setTopRight(point); textRect.setBottomLeft(QPoint(point.x() - 50, point.y() + 30)); flag = Qt::AlignVCenter | Qt::AlignRight; } } else { if(point.y() < 0) { //x=0 y<0 point.setX(point.x() - 25); textRect.setBottomRight(point); textRect.setTopLeft(QPoint(point.x() + 50, point.y() - 30)); flag = Qt::AlignHCenter | Qt::AlignBottom; } else if(point.y() > 0) { //x=0 y>0 point.setX(point.x() - 25); textRect.setTopLeft(point); textRect.setBottomRight(QPoint(point.x() + 50, point.y() + 30)); flag = Qt::AlignHCenter | Qt::AlignTop; } } painter.drawText(textRect, flag, text); } void DimensionChartWidget::convertPoint(QPointF& point) { if(qAbs(point.x()) < 0.001) { point.setX(0); } else if(qAbs(point.y()) < 0.001) { point.setY(0); } } void DimensionChartWidget::init() { setBackgroundColor(QColor(255,255,255)); // 设置维度网格数量 setSidesNumber(5); // 设置维度半径 setRadius(120); // 设置维度网格画笔 QPen sidesPen; sidesPen.setColor(QColor("#0095C5")); sidesPen.setWidth(2); setSidesPen(sidesPen); // 设置维度画笔 QPen dimensionPen; dimensionPen.setColor(Qt::GlobalColor::red); dimensionPen.setWidth(3); setDimensionPen(dimensionPen); // 设置字体信息 QPen textPen; setTextPen(textPen); QFont textFont; textFont.setFamily("微软雅黑"); textFont.setPointSize(10); setTextFont(textFont); }

资源文件列表:

DimensionDemo.zip 大约有7个文件
  1. DimensionDemo/
  2. DimensionDemo/dimensionchartwidget.cpp 5.44KB
  3. DimensionDemo/dimensionchartwidget.h 2.62KB
  4. DimensionDemo/DimensionDemo.pro 686B
  5. DimensionDemo/main.cpp 172B
  6. DimensionDemo/mainwindow.cpp 1.19KB
  7. DimensionDemo/mainwindow.h 217B
0评论
提交 加载更多评论
其他资源 串口转键盘工具小程序1
串口转键盘工具小程序1
zotero各种插件,包含翻译,预览,文献管理,影响因子等等
参考网址:https://blog.csdn.net/weixin_53631107/article/details/138168571 该资源现在了参考网址中的大部分插件,可以参照该网址比对,安装。
nopCommerce界面效果
nopCommerce界面效果
学习C51开发板所需软件安装打包
学习C51开发板所需软件安装打包,并附安装教程,与学习教程,大家可以跟随我的步伐入门这个电子世界,来感受嵌入式开发的乐趣所在,本教程所包含内容全部开源,并且完全免费,也请大家多多支持,感谢大家的观看。
el-tree虚拟滚动
el-tree虚拟滚动
企业微信scrm源码相关
企业微信scrm源码,引流活码
企业微信scrm源码相关
算法设计与分析 勇者斗恶龙;挖隧道问题;消消乐问题;Shacozzz的生财之道;蜘蛛纸牌
在很久很久以前,地上有一个荣光的王国,在这个王国里,国民安居乐业,国王开明勤政。但是突然有一天,有一群恶龙入侵了这个美丽的国家。恶龙们一路杀到了这个国家的首都,王国岌岌可危。在这个生死攸关的时刻,王国的总共 n个勇者们聚集到了首都,在他们当中第 i个勇者的能力值为 ai ,这代表这个勇者能够对恶龙造成 ai点伤害或者防御住恶龙 ai 的攻击。与此同时,王国的勇士们获得了恶龙们的情报:在城外总共有 m条恶龙,第 i条恶龙的防御力为 xi ,攻击力为 yi。幸运的是,恶龙们每次只会有一条来进攻首都。并且进攻的顺序为 1到 m.为了守住城堡,勇士们开始商量策略:保险起见,勇士们决定每次只派一个勇士出去击杀恶龙,剩下的勇士们将留在城堡中守护首都。为了守住首都,出门迎战的勇士的能力值不能小于恶龙的防御力。而剩下的在首都的城堡里防御的勇士们的能力值之和不能小于恶龙的攻击力。与此同时,国王拿出了一种神奇的药水(数量无限多),每一瓶药水能够让勇士的能力值短暂的提升 1点,药效只能保证勇士们应对一条恶龙,由于神奇药水的效果可以叠加(一个勇士可以同时喝 k瓶药增加 k 点能力值)以及药水数量无限,我们就能
ms2国密加密java包
ms2国密加密java包