欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Qt利用QGraphicsView繪制跳舞的機器人

 更新時間:2022年06月09日 09:43:31   作者:中國好公民st  
最近新學(xué)了一招秘密武器,打算分享給大家!那就是如何在QGraphicsView中制作一個跳舞的機器人,快跟隨小編一起動手嘗試一下吧

前言

最近新學(xué)了一招秘密武器,打算分享給大家!如何在QGraphicsView中制作一個跳舞的機器人。

首先,我們看一下顯示效果:

讓我們一起在這個炎熱的夏天里奔跑吧!哈哈!

今天就讓我們來解鎖如何繪制這樣一個會跳舞的機器人吧!

開發(fā)環(huán)境:VS2017 + Qt5.14.2

應(yīng)用框架:QGraphicsView

在之前的文章中我有詳細講述QGraphicsView框架的基礎(chǔ),這里我們就直接講述是如何實現(xiàn)的吧!

在QGraphicsView中,無論是繪制什么圖形,都需要在場景中展示,并且繪圖的基類是:QGraphicsItem

實現(xiàn)過程中遇到的知識點:

1:圖形繪制。

2:如何讓圖形動起來。

想要讓機器人動起來,首先我們要先做一個靜態(tài)的機器人,今天的主要內(nèi)容是如何做一個靜態(tài)的機器人。

靜態(tài)機器人實現(xiàn)

機器人的組成主要分成了三個部分:

1:機器人頭(QRobotHead)

2:機器人軀干(QRobotTorso)

3:機器人肢體(QRobotLimb),用于上肢和下肢。

對應(yīng)的類圖:

所有的類都繼承自QRobotPart,為了方便后續(xù)做動態(tài)拖動控制,要實現(xiàn)靜態(tài)的機器人,當(dāng)前QRobotPart類是不需要做任何處理的。

class QRobotPart : public QGraphicsObject
{
	Q_OBJECT

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

接下來我們就來實現(xiàn)機器人的三大部件吧!

1.QRobotHead

該類主要功能:機器人頭類

父類:QRobotPart

首先看一下頭部實現(xiàn)出來的效果。

頭部所占的區(qū)域位置:QRectF(-10,-30,20,30);

定義到坐標(biāo)軸上的區(qū)域,如下所示:

靜態(tài)的機器人頭部就是在圖中鉛筆繪制的區(qū)域。

緊接著,我們可以將眼睛、嘴巴一并繪制出來,具體實現(xiàn)代碼如下:

void QRobotHead::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget /* = nullptr */)
{
	/*
	繪制實際的頭部。
	實現(xiàn)分為兩部分:
		1:如果一個圖像被丟到機器人頭部上,我們就畫出圖像。
		2:否則,就畫出一個帶有簡單矢量圖形的圓形矩形機器人頭部。
	*/
	Q_UNUSED(option);
	Q_UNUSED(widget);

	painter->setBrush(m_color);
        //繪制:整體區(qū)域
	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

腦袋的位置確定好之后,緊接著就是軀干的位置了,就在頭部坐標(biāo)下面繪制就行了。

代碼顯示:

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

顯示效果,如下圖:

這樣一個簡易版的軀干就完成了。

為了美觀起見,在對應(yīng)的四肢上分別劃出了四個圓圈。

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);
}

最終的顯示效果,如下圖:

機器人軀干復(fù)雜版.png

3.QRobotLimb

該類功能:機器人肢體。包括了左右上肢以及左右下肢

父類:QRobotPart

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

按照一個順時針的方式進行繪制。

對于每一個肢體,我們都采用下面的繪制圖形

如此以來,只需要繪制一個圓角矩形以及一個圓形就可以了。

其實,到這里就遇到了另外一個問題:怎么確定每個肢體的位置呢?

因為是順時針繪制,所以,在QRobotLimb中初始位置可以采用一個位置,根據(jù)創(chuàng)建出來的肢體不同,再對圖形進行移動

假設(shè),初始的位置區(qū)域是:QRectF(-5, -5, 40, 10)

首先,先將第一個右下臂繪制出來,顯示效果如下:

看到效果圖之后,會發(fā)現(xiàn),右下臂應(yīng)該在右肩膀的圓圈中間,那么我們只需要setPos位置就可以了。

那么,對應(yīng)其他肢體的位置我們都可以這么來實現(xiàn)。

第一步:將所有的肢體創(chuàng)建出來

第二步:根據(jù)肢體的位置進行移動

實現(xiàn)代碼,如下:

//創(chuàng)建:機器人軀干
QGraphicsObject *torsoItem = new QRobotTorso(this);
//創(chuàng)建:機器人頭
QGraphicsObject *headItem = new QRobotHead(this);
//創(chuàng)建:左上臂
QGraphicsObject *upperLeftArmItem = new QRobotLimb(torsoItem);
//創(chuàng)建:左下臂
QGraphicsObject *lowerLeftArmItem = new QRobotLimb(upperLeftArmItem);
//創(chuàng)建:右上臂
QGraphicsObject *upperRightArmItem = new QRobotLimb(torsoItem);
//創(chuàng)建:右下臂
QGraphicsObject *lowerRightArmItem = new QRobotLimb(upperRightArmItem);
//創(chuàng)建:右腿上部
QGraphicsObject *upperRightLegItem = new QRobotLimb(torsoItem);
//創(chuàng)建:右腿下部
QGraphicsObject *lowerRightLegItem = new QRobotLimb(upperRightLegItem);
//創(chuàng)建:左腿上部
QGraphicsObject *upperLeftLegItem = new QRobotLimb(torsoItem);
//創(chuàng)建:左腿下部
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);

顯示效果,如下所示:

到這里,整體的機器人頭部、軀干、四肢已經(jīng)繪制完成了。

以上就是Qt利用QGraphicsView繪制跳舞的機器人的詳細內(nèi)容,更多關(guān)于Qt QGraphicsView機器人的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語言實現(xiàn)騎士飛行棋

    C語言實現(xiàn)騎士飛行棋

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)騎士飛行棋,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C++文件相關(guān)函數(shù)CreateFile|ReadFile|WriteFile用法詳解

    C++文件相關(guān)函數(shù)CreateFile|ReadFile|WriteFile用法詳解

    這篇文章主要為大家詳細介紹了c++有關(guān)文件創(chuàng)建、讀取和寫入的api:CreateFile、ReadFile、WriteFile的具體使用,需要的可以參考下
    2023-04-04
  • C++?const與constexpr區(qū)別小結(jié)

    C++?const與constexpr區(qū)別小結(jié)

    C++11標(biāo)準(zhǔn)中,const用于為修飾的變量添加只讀屬性,而constexpr關(guān)鍵字則用于指明其后是一個常量,本文主要介紹了C++?const與constexpr區(qū)別小結(jié),感興趣的可以了解一下
    2024-03-03
  • 詳解C++語言中std::array的神奇用法

    詳解C++語言中std::array的神奇用法

    本文的代碼都在C++17環(huán)境下編譯運行。當(dāng)前主流的g++版本已經(jīng)能支持C++17標(biāo)準(zhǔn),但是很多版本(如gcc 7.3)的C++17特性不是默認打開的,需要手工添加編譯選項-std=c++17,具體內(nèi)容詳情跟隨小編一起學(xué)習(xí)吧
    2021-05-05
  • 詳細總結(jié)C++的排序算法

    詳細總結(jié)C++的排序算法

    趁空閑時間,小編決定把C++的排序算法分析并總結(jié)下,以便溫故知新。也方便需要的朋友可以參考學(xué)習(xí)。
    2016-07-07
  • C++超詳細分析講解內(nèi)聯(lián)函數(shù)

    C++超詳細分析講解內(nèi)聯(lián)函數(shù)

    為了消除函數(shù)調(diào)用的時空開銷,C++ 提供一種提高效率的方法,即在編譯時將函數(shù)調(diào)用處用函數(shù)體替換,類似于C語言中的宏展開。這種在函數(shù)調(diào)用處直接嵌入函數(shù)體的函數(shù)稱為內(nèi)聯(lián)函數(shù)(Inline Function),又稱內(nèi)嵌函數(shù)或者內(nèi)置函數(shù)
    2022-06-06
  • C語言連接并操作Sedna XML數(shù)據(jù)庫的方法

    C語言連接并操作Sedna XML數(shù)據(jù)庫的方法

    這篇文章主要介紹了C語言連接并操作Sedna XML數(shù)據(jù)庫的方法,實例分析了C語言操作XML文件的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • ipv6實現(xiàn)udp編程示例

    ipv6實現(xiàn)udp編程示例

    這篇文章主要介紹了ipv6實現(xiàn)udp編程示例,需要的朋友可以參考下
    2014-03-03
  • C++數(shù)據(jù)結(jié)構(gòu)二叉搜索樹的實現(xiàn)應(yīng)用與分析

    C++數(shù)據(jù)結(jié)構(gòu)二叉搜索樹的實現(xiàn)應(yīng)用與分析

    從這篇博客開始,我就要和大家介紹有關(guān)二叉搜索樹的知識,它還衍生出了兩棵樹——AVL樹和紅黑樹,在后面兩篇博客我都會介紹。今天先從二叉搜索樹開始引入
    2022-02-02
  • 關(guān)于C++11中限定作用域的枚舉類型的問題

    關(guān)于C++11中限定作用域的枚舉類型的問題

    C++中有兩種類型的枚舉:不限定作用域的枚舉類型和限定作用域的枚舉類型。限定作用域的枚舉類型是C++11標(biāo)準(zhǔn)引入的新類型,對C++11中限定作用域的枚舉類型相關(guān)知識感興趣的朋友一起看看吧
    2022-01-01

最新評論