Qt QML 使用QPainterPath绘制弧形曲线和弧形文本

Qt并没有相关api直接绘制弧形文字,但提供了曲线绘制相关类,所以只能另辟蹊径,使用QPainterPath先生成曲线,然后通过曲线上的点来定位每个文字并draw出来。

QML具体做法为从QQuickPaintedItem继承,在派生类中实现paint函数

代码如下:

cpp 复制代码
void ViewItem::paint(QPainter *painter)
{
    painter->setRenderHint(QPainter::Antialiasing);
    
    QRectF rect(200, 200, 400, 300);
    painter->drawRect(rect);
    
    auto arcRect = rect;
    arcRect.setHeight(rect.height() * 2); //绘制椭圆上半圆,所以椭圆矩形高度*2
    
    QPainterPath path;
    path.arcMoveTo(arcRect, 170);  //起始度数
    path.arcTo(arcRect, 170, -160); //起始度数,曲线弧度
    
    painter->drawPath(path);
    
    QFont font("", 20);
    painter->setFont(font);
    
    QFontMetrics fm(font);    
    auto textH = fm.height();
    
    QString text = "测试QML弧形文字绘制";
    for(auto i=0; i< text.length(); i++)
    {
        const auto& word = text.at(i);
                
        painter->save();
        
        auto per = i / (float)(text.length() - 1);
        
        auto pt = path.pointAtPercent(per);
        painter->translate(pt.x(), pt.y());
        
        auto ang = path.angleAtPercent(per);
        painter->rotate(-ang);
        
        auto textW = fm.horizontalAdvance(word);        
        painter->drawText(-textW/2, 0, textW, textH, Qt::AlignCenter, word);
        
        painter->restore();
    }   
}

曲线与文本效果如下:

关于度数说明,如下图

上半圆从右往左,逆时针0°到180°,所以为了使线条从从往右绘制,所以起始度数设置为170°(具体看个人需求),曲线弧度负数为反向,左边-10,右边-10,故为-160°(具体看个人需求)

复制代码
QPainterPath path;
path.arcMoveTo(arcRect, 170);  //起始度数
path.arcTo(arcRect, 170, -160); //起始度数,曲线弧度

使用QPainterPath的两个函数pointAtPercent和angleAtPercent,能获取到每个文本对于的位置和旋转角度。

drawText注意文字偏移即可。

凹形曲线,使用椭圆下半圆使用相同方法绘制即可。

相关推荐
远翔调光芯片^1382879887210 分钟前
ECP5702能芯科技PD取电芯片在市场上的优势有哪些?
开发语言·人工智能·单片机·嵌入式硬件·智能家居
泡海椒1 小时前
规则引擎对比:JQuick-Java vs Drools 轻量场景选型对比
java·开发语言
泡泡鱼(敲代码中)1 小时前
Python 容器类型学习笔记:列表、元组、字典、集合
开发语言·笔记·python·pycharm
2501_933670791 小时前
平台招商运营校招能力模型:数据分析、SQL与增长场景拆解
开发语言
菜鸟~noob2332 小时前
【Bonjour】华为Peerium架构深度解析:从冯·诺依曼到百万处理器“一台计算机”,附MATLAB性能仿真【含matlab代码,可直接运行】
开发语言·matlab·华为·peerium
白远山3 小时前
24小时自助健身房系统开发实战:从需求分析到完整指南
java·开发语言·数据库·数据挖掘·需求分析
shmily麻瓜小菜鸡5 小时前
TDD(测试驱动开发)详解
开发语言·javascript·typescript·node.js·ecmascript
三克的油5 小时前
java-学习1
java·开发语言·学习
星期八不上发条5 小时前
智能指针是什么?使用场景,循环引用解决办法,面试回答
开发语言·c++·stl
OKkankan5 小时前
Python 基础进阶(三):从函数、类到 asyncio 与 FastAPI 后端开发实战
开发语言·python