• 注册
当前位置:1313e > 默认分类 >正文

qt mainwindows 找不到textedit_Qt编写自定义控件18-魔法小鱼

前言

上次发了个纯painter绘制的老鼠,那个就是qt目录下的demo,改的,只是比demo中的老鼠稍微胖一点,估计人到中年都发福吧。这次来一个魔法小鱼,这条鱼可以变换颜色,尾巴还会摇动,可以设定旋转的角度以及尾巴摆动的幅度等,原理是参考网上一个安卓大神写的(绘制原理 https://www.jianshu.com/p/3dd3d1524851)。

其实在Qt学习过程中,如果越到问题找不到相关文章和答案,可以试着将关键字改成安卓试试,你会发现另外一篇天地,大量的资源和文章介绍等,就比如安卓中用的java的painter,就几乎和Qt中的一样,估计填写编程语言都很类似,连方法名字几乎都是一样,设置参数,具有很多通用性,作为一名程序员,最重要的是理解思路和原理,甚至学习的方法,这些掌握了,任何语言都不是问题。

实现的功能

* 绘制原理 https://www.jianshu.com/p/3dd3d1524851

* 1:可设置鱼头+鱼身+鱼鳍+鱼尾的颜色

* 2:可设置鱼头+鱼身+鱼鳍+鱼尾的比例

* 3:可设置基准颜色,作为所有统一颜色

* 4:可设置鱼鳍是否摆动

* 5:可设置鱼的停留位置旋转角度

效果图

5227686ac9bbe273648e0b719efccdbb.gif
f089dd8a6e4fe1ea5e4908a13cb798eb.png
76d6a6d2202dae21f31b5e9cdf1a9532.png

核心代码

void MagicFish::paintEvent(QPaintEvent *){ //绘制准备工作,启用反锯齿 QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); QPointF middlePos = QPointF(width() / 2, height() / 2); headPos = calcPoint(middlePos, bodyLen / 1.5, currentAngle); double angle = currentAngle + qSin(qDegreesToRadians(currentValue * 1.2 * wave)) * 2; QPointF pos = calcPoint(headPos, bodyLen, angle - 180); //绘制头部 drawHead(&painter); //绘制鱼身 drawBody(&painter, pos, angle); //绘制左侧鱼鳍 QPointF leftPos = calcPoint(headPos, headLen * 0.9, angle + 110); drawFin(&painter, leftPos, true, angle); //绘制右侧鱼鳍 QPointF rightPos = calcPoint(headPos, headLen * 0.9, angle - 110); drawFin(&painter, rightPos, false, angle); //绘制鱼尾 drawTail(&painter, pos, angle);}void MagicFish::drawHead(QPainter *painter){ painter->save(); painter->setPen(Qt::NoPen); painter->setBrush(headColor); //鱼头关节圆 painter->drawEllipse(headPos, headLen, headLen); painter->restore();}void MagicFish::drawBody(QPainter *painter, const QPointF &pos, double angle){ //计算身体部分四个点 QPointF pos1 = calcPoint(headPos, headLen, angle - 80); QPointF pos2 = calcPoint(pos, headLen * 0.8, angle - 90); QPointF pos3 = calcPoint(pos, headLen * 0.8, angle + 90); QPointF pos4 = calcPoint(headPos, headLen, angle + 80); QPointF leftPos = calcPoint(headPos, bodyLen * 0.56, angle - 130); QPointF rightPos = calcPoint(headPos, bodyLen * 0.56, angle + 130); //计算绘制路径 QPainterPath path; path.moveTo(pos1); path.quadTo(leftPos, pos2); path.lineTo(pos3); path.quadTo(rightPos, pos4); path.lineTo(pos1); painter->save(); painter->setPen(Qt::NoPen); painter->setBrush(bodyColor); painter->drawPath(path); painter->restore();}void MagicFish::drawFin(QPainter *painter, const QPointF &pos, bool left, double angle){ double controlAngle = 115; double finAngle = finMove ? qSin(qDegreesToRadians(currentValue * 16.1 * wave)) * 12.0 : 2; QPointF endPos = calcPoint(pos, finLen, left ? angle + finAngle + 180 : angle - finAngle - 180); QPointF controlPos = calcPoint(pos, finLen * 1.8, left ? angle + controlAngle + finAngle : angle - controlAngle - finAngle); //计算鱼鳍的路径 QPainterPath path; path.moveTo(pos); path.quadTo(controlPos, endPos); path.lineTo(pos); painter->save(); painter->setPen(Qt::NoPen); painter->setBrush(finColor); painter->drawPath(path); painter->restore();}void MagicFish::drawTail(QPainter *painter, const QPointF &pos, double angle){ double flag = 0.6; double length = tailLen * (flag + 1); double tailAngle = angle + qCos(qDegreesToRadians(currentValue * 1.5 * wave)) * 15; QPointF endPos = calcPoint(pos, length, tailAngle - 180); QPointF pos1 = calcPoint(pos, tailLen, tailAngle - 90); QPointF pos2 = calcPoint(endPos, tailLen * flag, tailAngle - 90); QPointF pos3 = calcPoint(endPos, tailLen * flag, tailAngle + 90); QPointF pos4 = calcPoint(pos, tailLen, tailAngle + 90); QPainterPath path; path.moveTo(pos1); path.lineTo(pos2); path.lineTo(pos3); path.lineTo(pos4); painter->save(); painter->setPen(Qt::NoPen); painter->setBrush(tailColor); //鱼尾关节大圆 painter->drawEllipse(pos, tailLen, tailLen); //鱼尾关节小圆 painter->drawEllipse(endPos, tailLen * flag, tailLen * flag); //鱼尾肉部分路径 painter->drawPath(path); painter->restore(); //绘制鱼尾关节 drawTail1(painter, endPos, tailAngle);}void MagicFish::drawTail1(QPainter *painter, const QPointF &pos, double angle){ double len = tailLen * 0.6; double flag = 0.4; double length = len * (flag + 2.7); double tailAngle = angle + qSin(qDegreesToRadians(currentValue * 1.7 * wave)) * 35; QPointF endPos = calcPoint(pos, length, tailAngle - 180); QPointF pos1 = calcPoint(pos, len, tailAngle - 90); QPointF pos2 = calcPoint(endPos, len * flag, tailAngle - 90); QPointF pos3 = calcPoint(endPos, len * flag, tailAngle + 90); QPointF pos4 = calcPoint(pos, len, tailAngle + 90); QPainterPath path; path.moveTo(pos1); path.lineTo(pos2); path.lineTo(pos3); path.lineTo(pos4); painter->save(); painter->setPen(Qt::NoPen); painter->setBrush(tailColor); painter->drawPath(path); painter->restore(); //绘制鱼尾鱼鳍 drawTail2(painter, pos, tailAngle);}void MagicFish::drawTail2(QPainter *painter, const QPointF &pos, double angle){ double len = tailLen * 0.6; double flag = 0.4; double length = len * (flag + 2.7); double tailWidth = qAbs(qSin(qDegreesToRadians(currentValue * 1.9 * wave)) * len + headLen / 5.0 * 3.0); QPointF endPos1 = calcPoint(pos, length, angle - 180); QPointF endPos2 = calcPoint(pos, length - 10, angle - 180); QPointF pos1 = calcPoint(endPos1, tailWidth, angle - 90); QPointF pos2 = calcPoint(endPos1, tailWidth, angle + 90); QPointF pos3 = calcPoint(endPos2, tailWidth - headLen / 1.5, angle - 90); QPointF pos4 = calcPoint(endPos2, tailWidth - headLen / 1.5, angle + 90); QPainterPath path1; path1.moveTo(pos); path1.lineTo(pos3); path1.lineTo(pos4); path1.lineTo(pos); QPainterPath path2; path2.moveTo(pos); path2.lineTo(pos1); path2.lineTo(pos2); path2.lineTo(pos); painter->save(); painter->setPen(Qt::NoPen); painter->setBrush(tailColor); painter->drawPath(path1); painter->drawPath(path2); painter->restore();}QPointF MagicFish::calcPoint(const QPointF &pos, double len, double angle){ double x = qCos(qDegreesToRadians(angle)) * len; double y = qSin(qDegreesToRadians(angle - 180)) * len; return QPointF(pos + QPointF(x, y));}

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 162202241@qq.com 举报,一经查实,本站将立刻删除。

最新评论

欢迎您发表评论:

请登录之后再进行评论

登录