Qt::绘制框架-线宽控制-drawPath-PixmapFragment

二维矢量动画智能制作软件开发合集

链接:软件开发技术分享及记录合集

个人开发二维矢量动画智能制作软件界面如下:


目录

线宽控制

一、线宽控制原理

二、纯色类线宽控制实现

1.代码示例

2.示例效果

三、纹理类线宽控制实现

1.代码示例

2.示例效果

​​​​​​​​​​​​​​四、线宽控制软件测试视频

结束语


线宽控制

本篇介绍软件左侧工具栏→填充工具→​​​​线宽控制​​​

根据轮廓类型,线宽控制分为两类:1)纯色类线宽控制;2)纹理类线宽控制。


一、线宽控制原理

线宽控制功能仅对有轮廓的形状有效,本软件轮廓类型有2种,1)纯色类轮廓;2)纹理类轮廓,具体如下图所示:

绘制原理介绍如下:

① 纯色类轮廓绘制原理:采用QPainterPath的drawPath()方法,绘制的难点在于轮廓的path计算,本软件绘制(此处可理解为“计算”)path中,包含3个部分:1)起始节点的笔头;2)终止节点的笔头;3)起始节点和终止节点笔头的连接桥。

Ps. 博主认为这部分有许多值得思考的点:

① 在传统绘图软件中,轮廓的笔头默认为圆形或者矩形,但现实画笔的笔头并不是规整的形状,那么实现仿生笔时,是不是对该部分进行相应调整;

② 在传统绘图软件中,轮廓形状默认为和线条保持一致的纯色形状,那么实际绘制中,人手会抖动,相应的轮廓也会变化,那么是否可以据此现象对path的绘制逻辑进行修改,达到更真实的绘制效果。

② 纹理类轮廓绘制原理:采用QPainter的drawPixmapFragments()方法(参数详见Qt官方说明),纹理图案在该方法中设置。

简要介绍PixmapFragment类:

[static] PixmapFragment PixmapFragment::create(const QPointF &pos, const QRectF &sourceRect, qreal scaleX = 1, qreal scaleY = 1, qreal rotation = 0, qreal opacity = 1)

从参数中可见,该类可以设置pixmap的位置、可见范围、x轴缩放、y轴缩放、旋转角度和可见度,多样的参数使得该类使用非常方便,博主强烈安利这个方法,实现效果非常赞!

线宽数值设置和获取均通过QGraphicsItem继承类中增加set和get方法实现。

二、纯色类线宽控制实现

1.代码示例

.h文件变量申明:

QPainterPath m_path;

QList<QGraphicsItem *> PosItems;

void stroke::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    QBrush brush(Qt::SolidPattern);
    painter->setBrush(brush);
    painter->drawPath(m_path);
}

void Scene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
    for(int i = 0;i < PosItems.length();i++)
        PosItems[i]->setLineWidth(PosItems[i]->m_lineWidth*(1 + 0.001));
}

2.示例效果

纯色

三、纹理类线宽控制实现

1.代码示例

.h文件变量申明:

QList<QGraphicsItem *> PosItems;

void stroke::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    QPainter::PixmapFragment pf[pfNum];
    for(int i = 0; i < pfNum; i++)
    {
        qreal s = (m_p1->m_lineWidth+(m_p2->m_lineWidth-m_p1->m_lineWidth)/pfNum*i)/lineWidthBaseValue;
        qreal opa = (strokeOpaEnd - strokeOpaStart)/pfNum*i+strokeOpaStart;
        qreal a = jitterAngle*i;
        pf[i] = QPainter::PixmapFragment::create(pfPath.pointAtPercent(1.0/pfNum*i),rect,s,s,a,opa);
    }
    painter->drawPixmapFragments(pf,pfNum,brushPix,QPainter::OpaqueHint);
}

void Scene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
    for(int i = 0;i < PosItems.length();i++)
        PosItems[i]->setLineWidth(PosItems[i]->m_lineWidth*(1 + 0.001));
}

2.示例效果

纹理

​​​​​​​​​​​​​​四、线宽控制软件测试视频

线宽控制


结束语

本文简要梳理了软件【线宽控制】的实现框架,内容均为原创。

作者文笔水平一般,请大家多多包涵和指正,十分欢迎进一步交流学习。

若需,请联系本人小红书(小红书号:YzLab96),谢谢​​​​​​​。

链接:  软件开发及测试所有视频合集见小红书​​​​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值