QT绘画QPainter实战项目之绘制挖掘机

0 562
索鸟 2020-08-10
需要:0索币

demo.gif

心中有坐标,万物皆可绘

  我的挖掘机例子共分为车体大臂小臂爪子四部分,全部皆为自绘。

  • 车体
void Body::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    painter->setBrush(QBrush(Qt::darkYellow));
    painter->drawRect(0,0,220,100);
    painter->drawRect(100,-80,100,80);

    painter->setBrush(QBrush(Qt::darkYellow));
    painter->drawEllipse(_pinPoint1, 5,5);
    painter->drawEllipse(_pinPoint2, 5,5);

    painter->setPen(QPen(QBrush(Qt::gray), 6));
    QPointF p(mapFromItem(_bigHand, _bigHand->PinPoint));
    painter->drawLine(_pinPoint2.x(), _pinPoint2.y(), p.x(), p.y());

    //液压臂
    painter->setPen(QPen(QBrush(Qt::black), 10));
    QLineF line(_pinPoint2, p);
    qreal angle = line.angle();
    QPointF midPoint(_pinPoint2.x()+ 80*cos(qDegreesToRadians(angle)), _pinPoint2.y() - 80*sin(qDegreesToRadians(angle)));
    painter->drawLine(_pinPoint2, midPoint);
}

  • 大臂
void BigHand::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    painter->setPen(Qt::black);
    painter->setBrush(Qt::yellow);

    QPainterPath path;
    path.moveTo(-6,2);
    path.lineTo(60,-180);
    path.lineTo(250,-270);
    path.lineTo(258,-260);
    path.lineTo(90,-150);
    path.lineTo(5,5);

    path.moveTo(_pinPoint2.x()-10, _pinPoint2.y()+5);
    path.lineTo(_pinPoint2.x()-5, _pinPoint2.y()-8);
    path.lineTo(_pinPoint2.x()+8, _pinPoint2.y()-5);
    path.lineTo(_pinPoint2.x()-10, _pinPoint2.y()+5);
    painter->drawPath(path);

    painter->setBrush(Qt::darkYellow);
    painter->drawEllipse(-4,-5,10,10);
    painter->drawEllipse(PinPoint,5,5);

    painter->drawEllipse(_pinPoint1,5,5);

    painter->drawEllipse(_pinPoint2,5,5);

    painter->setPen(QPen(QBrush(Qt::gray), 6));
    QPointF p(mapFromItem(_smallHand, _smallHand->PinPoint));
    painter->drawLine(_pinPoint2.x(), _pinPoint2.y(), p.x(), p.y());

    //液压臂
    painter->setPen(QPen(QBrush(Qt::black), 10));
    QLineF line(_pinPoint2, p);
    qreal angle = line.angle();
    QPointF midPoint(_pinPoint2.x()+ 110*cos(qDegreesToRadians(angle)), _pinPoint2.y() - 110*sin(qDegreesToRadians(angle)));
    painter->drawLine(_pinPoint2, midPoint);
}

  • 小臂
void SmallHand::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    painter->setPen(Qt::black);
    painter->setBrush(Qt::yellow);

    QPainterPath path;
    path.moveTo(-50, -30);
    path.lineTo(200, 0);
    path.lineTo(198, 10);
    path.lineTo(-3, 5);
    path.lineTo(-55, -18);
    path.lineTo(-50, -30);

    path.moveTo(_pinPoint1.x()-10, _pinPoint1.y()+5);
    path.lineTo(_pinPoint1.x(), _pinPoint1.y()-6);
    path.lineTo(_pinPoint1.x()+10, _pinPoint1.y()+7);
    path.lineTo(_pinPoint1.x()-8, _pinPoint1.y()+5);
    painter->drawPath(path);

    painter->setBrush(Qt::darkYellow);
    painter->drawEllipse(-5,-5, 10, 10);
    painter->drawEllipse(PinPoint,5,5);
    painter->drawEllipse(_pinPoint1,5,5);
    painter->drawEllipse(_pinPoint2,5,5);
    painter->drawEllipse(_pinPoint3,5,5);

    painter->setPen(QPen(QBrush(Qt::gray), 6));
    QPointF p(mapFromItem(_littleHand, _littleHand->PinPoint));
    painter->drawLine(_pinPoint1.x(), _pinPoint1.y(), p.x(), p.y());

    painter->setPen(QPen(QBrush(Qt::black), 10));
    QLineF line(_pinPoint1, p);
    qreal angle = line.angle();
    QPointF midPoint(_pinPoint1.x()+ 90*cos(qDegreesToRadians(angle)), _pinPoint1.y() - 90*sin(qDegreesToRadians(angle)));
    painter->drawLine(_pinPoint1, midPoint);

    painter->setPen(QPen(QBrush(Qt::black), 10));
    QPointF p1(mapFromItem(_hand, _hand->PinPoint));
    painter->drawLine(p.x(), p.y(), p1.x(), p1.y());
}

  • 爪子
void Hand::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    painter->setPen(Qt::black);
    painter->setBrush(Qt::yellow);

    QPainterPath path;
    path.moveTo(-12, -30);
    path.lineTo(-3, -35);
    path.lineTo(-6, -44);
    path.lineTo(6, -48);
    path.lineTo(35, -45);
    path.lineTo(70, 0);
    path.lineTo(15, -10);
    path.lineTo(10, 0);
    path.lineTo(3, 7);
    path.lineTo(-3, 3);
    path.lineTo(-12, -30);
    painter->drawPath(path);

    painter->setBrush(Qt::darkYellow);
    painter->drawEllipse(PinPoint,5,5);
    painter->drawEllipse(_pinPoint1,5,5);
}

main_page.png

源码地址(欢迎star)

  • github地址:
    https://github.com/sunnyfulin/MyExcavator
  • 码云地址:
    https://gitee.com/navca/MyExcavator
回帖
  • 消灭零回复
相关主题
2020年最新最新Kubernetes视频教程(K8s)教程 2
程序员转型之制作网课变现,月入过万告别996 1
索鸟快传2.0发布啦 1
两个不同网络的电脑怎么实现文件的互相访问呢? 1
网盘多账号登录软件 1
Java实战闲云旅游项目基于vue+element-ui 1
单点登录技术解决方案基于OAuth2.0的网关鉴权RSA算法生成令牌 1
QT5获取剪贴板上文本信息QT设置剪贴板内容 1
springboot2实战在线购物系统电商系统 1
python web实战之爱家租房项目 1
windows COM实用入门教程 1
C++游戏开发之C++实现的水果忍者游戏 1
计算机视觉库opencv教程 1
node.js实战图书管理系统express框架实现 1
C++实战教程之远程桌面远程控制实战 1
相关主题
PHP7报A non well formed numeric value encountered 0
Linux系统下关闭mongodb的几种命令分享 0
mongodb删除数据、删除集合、删除数据库的命令 0
Git&Github极速入门与攻坚实战课程 0
python爬虫教程使用Django和scrapy实现 0
libnetsnmpmibs.so.31: cannot open shared object file 0
数据结构和算法视频教程 0
redis的hash结构怎么删除数据呢? 0
C++和LUA解析器的数据交互实战视频 0
mongodb errmsg" : "too many users are authenticated 0
C++基础入门视频教程 0
用30个小时精通C++视频教程可能吗? 0
C++分布式多线程游戏服务器开发视频教程socket tcp boost库 0
C++培训教程就业班教程 0
layui的util工具格式时间戳为字符串 0
C++实战教程之远程桌面远程控制实战 1
网络安全培训视频教程 0
LINUX_C++软件工程师视频教程高级项目实战 0
C++高级数据结构与算法视频教程 0
跨域问题很头疼?通过配置nginx轻松解决ajax跨域问题 0