Qt利用QGraphicsView绘制跳舞的机器人

目录
  • 前言
  • 静态机器人实现
  • 1.QRobotHead
  • 2.QRobotTorso
  • 3.QRobotLimb

前言

最近新学了一招秘密武器,打算分享给大家!如何在QGraphicsView中制作一个跳舞的机器人。

首先,我们看一下显示效果:

让我们一起在这个炎热的夏天里奔跑吧!哈哈!

今天就让我们来解锁如何绘制这样一个会跳舞的机器人吧!

开发环境:VS2017 + Qt5.14.2

应用框架:QGraphicsView

在之前的文章中我有详细讲述QGraphicsView框架的基础,这里我们就直接讲述是如何实现的吧!

在QGraphicsView中,无论是绘制什么图形,都需要在场景中展示,并且绘图的基类是:QGraphicsItem

实现过程中遇到的知识点:

1:图形绘制。

2:如何让图形动起来。

想要让机器人动起来,首先我们要先做一个静态的机器人,今天的主要内容是如何做一个静态的机器人。

静态机器人实现

机器人的组成主要分成了三个部分:

1:机器人头(QRobotHead)

2:机器人躯干(QRobotTorso)

3:机器人肢体(QRobotLimb),用于上肢和下肢。

对应的类图:

所有的类都继承自QRobotPart,为了方便后续做动态拖动控制,要实现静态的机器人,当前QRobotPart类是不需要做任何处理的。

class QRobotPart : public QGraphicsObject
{
	Q_OBJECT

public:
	QRobotPart(QGraphicsItem *parent = nullptr);
	~QRobotPart();
};

接下来我们就来实现机器人的三大部件吧!

1.QRobotHead

该类主要功能:机器人头类

父类:QRobotPart

首先看一下头部实现出来的效果。

头部所占的区域位置:QRectF(-10,-30,20,30);

定义到坐标轴上的区域,如下所示:

静态的机器人头部就是在图中铅笔绘制的区域。

紧接着,我们可以将眼睛、嘴巴一并绘制出来,具体实现代码如下:

void QRobotHead::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget /* = nullptr */)
{
	/*
	绘制实际的头部。
	实现分为两部分:
		1:如果一个图像被丢到机器人头部上,我们就画出图像。
		2:否则,就画出一个带有简单矢量图形的圆形矩形机器人头部。
	*/
	Q_UNUSED(option);
	Q_UNUSED(widget);

	painter->setBrush(m_color);
        //绘制:整体区域
	painter->drawRoundedRect(-10, -30, 20, 30, 25, 25, Qt::RelativeSize);
	painter->setBrush(Qt::white);
        //绘制:左眼 大眼眶
	painter->drawEllipse(-7, -3 - 20, 7, 7);
        //绘制:右眼 大眼眶
	painter->drawEllipse(0, -3 - 20, 7, 7);
	painter->setBrush(Qt::black);
        //绘制:左眼 小眼珠
	painter->drawEllipse(-5, -1 - 20, 2, 2);
        //绘制:右眼 小眼珠
	painter->drawEllipse(2, -1 - 20, 2, 2);
	painter->setPen(QPen(Qt::black, 2));
	painter->setBrush(Qt::NoBrush);
        //绘制:小笑脸
	painter->drawArc(-6, -2 - 20, 12, 15, 190 * 16, 160 * 16);

}

2.QRobotTorso

该类主要功能:机器人躯干

父类:QRobotPart

脑袋的位置确定好之后,紧接着就是躯干的位置了,就在头部坐标下面绘制就行了。

代码显示:

painter->drawRoundedRect(-20, -20, 40, 60, 25, 25, Qt::RelativeSize);

显示效果,如下图:

这样一个简易版的躯干就完成了。

为了美观起见,在对应的四肢上分别划出了四个圆圈。

void QRobotTorso::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget /* = nullptr */)
{
	Q_UNUSED(option);
	Q_UNUSED(widget);
	painter->setBrush(m_bDragOver ? m_color.lighter(130) : m_color);
	painter->drawRoundedRect(-20, -20, 40, 60, 25, 25, Qt::RelativeSize);
	painter->drawEllipse(-25, -20, 20, 20);
	painter->drawEllipse(5, -20, 20, 20);
	painter->drawEllipse(-20, 22, 20, 20);
	painter->drawEllipse(0, 22, 20, 20);
}

最终的显示效果,如下图:

3.QRobotLimb

该类功能:机器人肢体。包括了左右上肢以及左右下肢

父类:QRobotPart

肢体包括了:左上臂、左下臂、右上臂、右下臂、右腿上部、右腿下部、左腿上部、左腿下部。

按照一个顺时针的方式进行绘制。

对于每一个肢体,我们都采用下面的绘制图形

如此以来,只需要绘制一个圆角矩形以及一个圆形就可以了。

其实,到这里就遇到了另外一个问题:怎么确定每个肢体的位置呢?

因为是顺时针绘制,所以,在QRobotLimb中初始位置可以采用一个位置,根据创建出来的肢体不同,再对图形进行移动

假设,初始的位置区域是:QRectF(-5, -5, 40, 10)

首先,先将第一个右下臂绘制出来,显示效果如下:

看到效果图之后,会发现,右下臂应该在右肩膀的圆圈中间,那么我们只需要setPos位置就可以了。

那么,对应其他肢体的位置我们都可以这么来实现。

第一步:将所有的肢体创建出来

第二步:根据肢体的位置进行移动

实现代码,如下:

//创建:机器人躯干
QGraphicsObject *torsoItem = new QRobotTorso(this);
//创建:机器人头
QGraphicsObject *headItem = new QRobotHead(this);
//创建:左上臂
QGraphicsObject *upperLeftArmItem = new QRobotLimb(torsoItem);
//创建:左下臂
QGraphicsObject *lowerLeftArmItem = new QRobotLimb(upperLeftArmItem);
//创建:右上臂
QGraphicsObject *upperRightArmItem = new QRobotLimb(torsoItem);
//创建:右下臂
QGraphicsObject *lowerRightArmItem = new QRobotLimb(upperRightArmItem);
//创建:右腿上部
QGraphicsObject *upperRightLegItem = new QRobotLimb(torsoItem);
//创建:右腿下部
QGraphicsObject *lowerRightLegItem = new QRobotLimb(upperRightLegItem);
//创建:左腿上部
QGraphicsObject *upperLeftLegItem = new QRobotLimb(torsoItem);
//创建:左腿下部
QGraphicsObject *lowerLeftLegItem = new QRobotLimb(upperLeftLegItem);

headItem->setPos(0, -18);
upperLeftArmItem->setPos(-15, -10);
lowerLeftArmItem->setPos(30, 0);
upperRightArmItem->setPos(15, -10);
lowerRightArmItem->setPos(30, 0);
upperRightLegItem->setPos(10, 32);
lowerRightLegItem->setPos(30, 0);
upperLeftLegItem->setPos(-10, 32);
lowerLeftLegItem->setPos(30, 0);

显示效果,如下所示:

到这里,整体的机器人头部、躯干、四肢已经绘制完成了。

以上就是Qt利用QGraphicsView绘制跳舞的机器人的详细内容,更多关于Qt QGraphicsView机器人的资料请关注我们其它相关文章!

(0)

相关推荐

  • Qt通过QGraphicsview实现简单缩放及还原效果

    本文主要介绍通过QGraphicsview实现简单的缩放,以及缩放后还原原始大小. 1,自定义一个drawview继承QGraphicsview,缩放主要实现的函数为 void scale(qreal sx,qreal sy); 通过scale可以对view进行放大或缩小. 则可以在drawview中定义缩放slots为 void drawview::zoomIn(qreal delta) { zoom(delta); } void drawview::zoomOut(qreal delta)

  • Qt绘制简单时钟

    本文实例为大家分享了Qt绘制简单时钟的具体代码,供大家参考,具体内容如下 概述 (1)基本原理 利用简单的几何图形绘出表盘和指针,然后基于系统时间调整指针偏转角度达到模拟时钟的效果. 其中可以加上自己喜欢的背景资源,设计不同风格的时钟. (2)部分函数说明 ①调色和填充 painter.setBrush(Qt::red); //设置画刷,填充颜色(红色) painter.setPen(Qt::red); //设置画笔,外围轮廓颜色(红色) ②抗锯齿(减少图形外围锯齿状,使线条平滑) painte

  • 使用QGraphicsView实现气泡聊天窗口+排雷功能

    经过多方调查,用Qt实现气泡聊天窗口的方式有如下几个: 使用QWebEngineView控件内嵌html+CSS 使用QTextEdit内嵌html 使用QGraphicsView实现 使用QWidget自己绘制气泡样式实现 作为一名C++程序员,对CSS+html这套结构的不熟悉导致无法使用前两个方案,而第三个方案又不够高效,所以最终我选择了最后一个方案.最终效果: 存在问题:无法选择文字及跨选(但理论上可以通过重写鼠标相关事件,达到模拟选择的效果) 左侧和右侧的消息分别是封装的两个Item,

  • Qt使用QPainter绘制3D立方体

    本文实例为大家分享了使用QPainter绘制3D立方体的具体代码,供大家参考,具体内容如下 1.实现思路 (网上有另一篇类似的,不过他不是用的 Qt 自带的矩阵运算类) 实现思路有点类似使用 OpenGL 画立方体,先准备顶点数据: //立方体前后四个顶点,从右上角开始顺时针 vertexArr=QVector<QVector3D>{ QVector3D{1,1,1}, QVector3D{1,-1,1}, QVector3D{-1,-1,1}, QVector3D{-1,1,1}, QVec

  • Qt通过图片组绘制动态图片

    本文实例为大家分享了Qt通过图片组绘制动态图片的具体代码,供大家参考,具体内容如下 任务实现: 通过定时器的使用来依次调用资源文件中的静态图片文件,从而达到是图片中内容动起来的效果: 效果实现: 实现过程: 1.通过paintEvent()函数进行每一张图片的导入平铺绘制: 2.通过timerEvent()函数对每一张图片按照设定的时间进行重复的调用,从而达到动图的效果: 3.通过自定义InitPixmap()函数来对每一张图片进行初始化,将其导入到Pixmap[ 64 ]组中: 整体代码: d

  • Qt利用QGraphicsView绘制跳舞的机器人

    目录 前言 静态机器人实现 1.QRobotHead 2.QRobotTorso 3.QRobotLimb 前言 最近新学了一招秘密武器,打算分享给大家!如何在QGraphicsView中制作一个跳舞的机器人. 首先,我们看一下显示效果: 让我们一起在这个炎热的夏天里奔跑吧!哈哈! 今天就让我们来解锁如何绘制这样一个会跳舞的机器人吧! 开发环境:VS2017 + Qt5.14.2 应用框架:QGraphicsView 在之前的文章中我有详细讲述QGraphicsView框架的基础,这里我们就直接

  • QT利用QPainter绘制三维饼状图

    目录 一.项目介绍 二.项目基本配置 三.UI界面设置 四.主程序实现 4.1 widget.h头文件 4.2 widget.cpp源文件 五.效果演示 一.项目介绍 本文介绍利用QPainter实现三维饼状图的绘制,由于Qt中没有三维饼状图的绘制组件,因此只能自行绘制. 二.项目基本配置 新建一个Qt案例,项目名称为“PieTest”,基类选择“QWidget”,取消选中创建UI界面复选框,完成项目创建. 三.UI界面设置 无UI界面 四.主程序实现 4.1 widget.h头文件 头文件中只

  • Qt利用QChart实现实时波形图的绘制

    目录 前言 1.QChart配置以及使用 1.1QChart环境配置 1.2控件使用 1.3代码配置 2.QChat设置动态折线图 2.1基础数据设置 2.2定时器控制数据变动 3.实际硬件数据采集图形绘制 4.总结 前言 前两天需要做一个绘图功能.我们的需求是这样子的:硬件实时发送数据,绘制数据波形图,要求波形图根据数据实时变化. 展示效果如下: 如果有和我一样的功能,大家可以继续往下看,没准会对你有一定的帮助哟~ 看上面的展示图会发现,怎么这么丑!确实,根据硬件实时传入的数据以及时间不同,产

  • PyQt5利用QPainter绘制各种图形的实例

    这个例子我做了好几天: 1)官网C++的源码,改写成PyQt5版本的代码,好多细节不会转化 2)网上的PyQt的例子根本运行不了 填了无数个坑,结合二者,终于能完成了一个关于绘图的东西.这个过程也掌握了很多新的知识点 [知识点] 1.关于多个点的使用 poitns = [QPoint(10, 80), QPoint(20, 10), QPoint(80, 30), QPoint(90, 70)] 请看: # 定义多个点 points = [QPoint(10, 80), QPoint(20, 1

  • QT中QChart绘制折线图

    目录 一.简单绘图 二.绘制折线图 实例 一.简单绘图 Qt Charts基于Qt的Graphics View架构,其核心组件是QChartView 和 QChart QChartView是显示图标的视图,基类为QGraphicsView QChart的基类是QGraphicsltem 类的继承关系: 创建项目:.pro文件中添加:QT += charts代码如下:其他文件未修改,修改代码只在mainwindow.cpp文件中进行.mainwindow.cpp #include "mainwin

  • Qt利用ffmpeg实现音视频同步

    目录 一.前言 二.效果图 三.体验地址 四.相关代码 五.功能特点 5.1 基础功能 5.2 特色功能 5.3 视频控件 5.4 内核ffmpeg 一.前言 用ffmpeg来做音视频同步,个人认为这个是ffmpeg基础处理中最难的一个,无数人就卡在这里,怎么也不准,本人也是尝试过网上各种demo,基本上都是渣渣,要么仅仅支持极其少量的视频文件比如收到的数据包是一帧视频一帧音频的,要么根本没法同步歪七八糟的,要么进度跳过去直接蹦蹦蹦崩溃的,其实最完美的音视频同步处理demo就是ffplay,我亲

  • C++ Qt利用GPU加速计算的示例详解

    在 C++ 和 Qt 中,可以通过以下方式利用 GPU 进行加速计算: 使用 GPU 编程框架:可以使用类似 CUDA.OpenCL.DirectCompute 等 GPU 编程框架,这些框架提供了对 GPU 的访问和操作,可以使用 GPU 进行并行计算,从而加速计算速度. 使用图形 API:在 Qt 中,可以使用 QOpenGLFunctions 等 API 访问 GPU,这些 API 可以用于执行图形渲染.图像处理等任务,利用 GPU 进行计算. 使用高性能计算库:在 C++ 中,有一些高性

  • 利用iOS绘制图片生成随机验证码示例代码

    先来看看效果图 实现方法 .h文件 @property (nonatomic, retain) NSArray *changeArray; @property (nonatomic, retain) NSMutableString *changeString; @property (nonatomic, retain) UILabel *codeLabel; -(void)changeCode; @end .m文件 @synthesize changeArray = _changeArray;

  • C#利用GDI+绘制旋转文字等效果实例

    本文实例讲述了C#利用GDI+绘制旋转文字等效果的方法,是非常实用的技巧.分享给大家供大家参考之用.具体如下: C#中利用GDI+绘制旋转文本的文字,网上有很多资料,基本都使用矩阵旋转的方式实现.但基本都只提及按点旋转,若要实现在矩形范围内旋转文本,资料较少.经过琢磨,可以将矩形内旋转转化为按点旋转,不过需要经过不少的计算过程.利用下面的类可以实现该功能. 具体实现代码如下: using System; using System.Collections.Generic; using System

  • Android编程开发之在Canvas中利用Path绘制基本图形(圆形,矩形,椭圆,三角形等)

    本文实例讲述了Android编程开发之在Canvas中利用Path绘制基本图形的方法.分享给大家供大家参考,具体如下: 在Android中绘制基本的集合图形,本程序就是自定义一个View组件,程序重写该View组件的onDraw(Canvase)方法,然后在该Canvas上绘制大量的基本的集合图形. 直接上代码: 1.自定义的View组件代码: package com.infy.configuration; import android.content.Context; import andro

随机推荐