Qt 之图形(绘制漂亮的圆弧)

2024-05-27 19:38
文章标签 qt 绘制 图形 漂亮 圆弧

本文主要是介绍Qt 之图形(绘制漂亮的圆弧),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者: 一去、二三里
个人微信号: iwaleon
微信公众号: 高效程序员

综合前面对二维绘图的介绍,想必我们对一些基本绘图有了深入的了解,下面我们来实现一些漂亮的图形绘制。

圆形

经常地,我们会在网上看到一些列的抽奖活动,里面就有圆盘抽奖,是不是有点手痒了O(∩_∩)O~

效果

这里写图片描述

源码

void MainWindow::paintEvent(QPaintEvent *)
{QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing, true);int radius = 150;int arcHeight = 30;// >> 1(右移1位)相当于width() / 2painter.translate(width() >> 1, height() >> 1);/*** 参数二:半径* 参数三:开始的角度* 参数四:指扫取的角度-顺时针(360度 / 8 = 45度)* 参数五:圆环的高度* 参数六:填充色**/gradientArc(&painter, radius, 0,  45, arcHeight, qRgb(200, 200, 0));gradientArc(&painter, radius, 45, 45, arcHeight, qRgb(200, 0, 200));gradientArc(&painter, radius, 90, 45, arcHeight, qRgb(0, 200, 200));gradientArc(&painter, radius, 135, 45, arcHeight, qRgb(200, 0, 0));gradientArc(&painter, radius, 225, 45, arcHeight, qRgb(0, 200, 0));gradientArc(&painter, radius, 180, 45, arcHeight, qRgb(0, 0, 200));gradientArc(&painter, radius, 270, 45, arcHeight, qRgb(0, 0, 0));gradientArc(&painter, radius, 315, 45, arcHeight, qRgb(150, 150, 150));
}void MainWindow::gradientArc(QPainter *painter, int radius, int startAngle, int angleLength, int arcHeight, QRgb color)
{// 渐变色QRadialGradient gradient(0, 0, radius);gradient.setColorAt(0, Qt::white);gradient.setColorAt(1.0, color);painter->setBrush(gradient);// << 1(左移1位)相当于radius*2 即:150*2=300//QRectF(-150, -150, 300, 300)QRectF rect(-radius, -radius, radius << 1, radius << 1);QPainterPath path;path.arcTo(rect, startAngle, angleLength);painter->setPen(Qt::NoPen);painter->drawPath(path);
}

弧形

我们可以在之前的基础上加一些处理,从而实现一个圆弧。

效果

这里写图片描述

源码

void MainWindow::gradientArc(QPainter *painter, int radius, int startAngle, int angleLength, int arcHeight, QRgb color)
{// 渐变色QRadialGradient gradient(0, 0, radius);gradient.setColorAt(0, Qt::white);gradient.setColorAt(1.0, color);painter->setBrush(gradient);// << 1(左移1位)相当于radius*2 即:150*2=300//QRectF(-150, -150, 300, 300)QRectF rect(-radius, -radius, radius << 1, radius << 1);QPainterPath path;path.arcTo(rect, startAngle, angleLength);// QRectF(-120, -120, 240, 240)QPainterPath subPath;subPath.addEllipse(rect.adjusted(arcHeight, arcHeight, -arcHeight, -arcHeight));// path为扇形 subPath为椭圆path -= subPath;painter->setPen(Qt::NoPen);painter->drawPath(path);
}

这些只不过是我们实现的一个小效果,如果说你有什么特殊的需要,可以在此基础上进行扩展,比如:添加文本、动画旋转等。

文本

可以通过QPainterPath的addText()来添加文本。

效果

这里写图片描述

源码

void MainWindow::gradientArc(QPainter *painter, int radius, int startAngle, int angleLength, int arcHeight, QRgb color)
{// 渐变色QRadialGradient gradient(0, 0, radius);gradient.setColorAt(0, Qt::white);gradient.setColorAt(1.0, color);painter->setBrush(gradient);// << 1(左移1位)相当于radius*2 即:150*2=300//QRectF(-150, -150, 300, 300)QRectF rect(-radius, -radius, radius << 1, radius << 1);QPainterPath path;path.arcTo(rect, startAngle, angleLength);// QRectF(-120, -120, 240, 240)QPainterPath subPath;subPath.addEllipse(rect.adjusted(arcHeight, arcHeight, -arcHeight, -arcHeight));// path为扇形 subPath为椭圆path -= subPath;QFont font;font.setFamily("Microsoft YaHei");font.setPointSize(14);painter->setPen(Qt::NoPen);path.addText(path.pointAtPercent(0.5), font, QStringLiteral("一去丶二三里"));painter->drawPath(path);
}

旋转

我们对前面的圆盘进行强化,添加一个旋转效果。当然,常见的抽奖圆盘旋转的是指针,而我们下面实现的是对圆盘的旋转,如果你要实现一个抽奖转盘,那么可以再扩展。

效果

这里写图片描述

源码

// 利用定时器,定时变换角度,进行旋转。
QTimer *pTimer = new QTimer(this);
pTimer->setInterval(100);
connect(pTimer, SIGNAL(timeout()), this, SLOT(updatePaint()));
pTimer->start();// 改变角度,进行旋转
void MainWindow::updatePaint()
{m_nRotationAngle++;if (m_nRotationAngle > 360)m_nRotationAngle = 0;update();
}

然后,只需要在绘图事件中添加简单的一行代码即可:

void MainWindow::paintEvent(QPaintEvent *)
{...// 旋转painter.rotate(m_nRotationAngle);...
}

好了,基本的介绍就到这里,是不是很有意思呢,O(∩_∩)O哈哈~

这篇关于Qt 之图形(绘制漂亮的圆弧)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1008403

相关文章

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

使用Python绘制可爱的招财猫

《使用Python绘制可爱的招财猫》招财猫,也被称为“幸运猫”,是一种象征财富和好运的吉祥物,经常出现在亚洲文化的商店、餐厅和家庭中,今天,我将带你用Python和matplotlib库从零开始绘制一... 目录1. 为什么选择用 python 绘制?2. 绘图的基本概念3. 实现代码解析3.1 设置绘图画

Python绘制土地利用和土地覆盖类型图示例详解

《Python绘制土地利用和土地覆盖类型图示例详解》本文介绍了如何使用Python绘制土地利用和土地覆盖类型图,并提供了详细的代码示例,通过安装所需的库,准备地理数据,使用geopandas和matp... 目录一、所需库的安装二、数据准备三、绘制土地利用和土地覆盖类型图四、代码解释五、其他可视化形式1.

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

python与QT联合的详细步骤记录

《python与QT联合的详细步骤记录》:本文主要介绍python与QT联合的详细步骤,文章还展示了如何在Python中调用QT的.ui文件来实现GUI界面,并介绍了多窗口的应用,文中通过代码介绍... 目录一、文章简介二、安装pyqt5三、GUI页面设计四、python的使用python文件创建pytho

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停

基于Qt实现系统主题感知功能

《基于Qt实现系统主题感知功能》在现代桌面应用程序开发中,系统主题感知是一项重要的功能,它使得应用程序能够根据用户的系统主题设置(如深色模式或浅色模式)自动调整其外观,Qt作为一个跨平台的C++图形用... 目录【正文开始】一、使用效果二、系统主题感知助手类(SystemThemeHelper)三、实现细节

Qt实现文件的压缩和解压缩操作

《Qt实现文件的压缩和解压缩操作》这篇文章主要为大家详细介绍了如何使用Qt库中的QZipReader和QZipWriter实现文件的压缩和解压缩功能,文中的示例代码简洁易懂,需要的可以参考一下... 目录一、实现方式二、具体步骤1、在.pro文件中添加模块gui-private2、通过QObject方式创建

Qt QWidget实现图片旋转动画

《QtQWidget实现图片旋转动画》这篇文章主要为大家详细介绍了如何使用了Qt和QWidget实现图片旋转动画效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、效果展示二、源码分享本例程通过QGraphicsView实现svg格式图片旋转。.hpjavascript