最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt利用QGraphicsView繪制跳舞的機(jī)器人

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

前言

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

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

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

今天就讓我們來(lái)解鎖如何繪制這樣一個(gè)會(huì)跳舞的機(jī)器人吧!

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

應(yīng)用框架:QGraphicsView

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

在QGraphicsView中,無(wú)論是繪制什么圖形,都需要在場(chǎng)景中展示,并且繪圖的基類是:QGraphicsItem

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

1:圖形繪制。

2:如何讓圖形動(dòng)起來(lái)。

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

靜態(tài)機(jī)器人實(shí)現(xiàn)

機(jī)器人的組成主要分成了三個(gè)部分:

1:機(jī)器人頭(QRobotHead)

2:機(jī)器人軀干(QRobotTorso)

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

對(duì)應(yīng)的類圖:

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

class QRobotPart : public QGraphicsObject
{
	Q_OBJECT

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

接下來(lái)我們就來(lái)實(shí)現(xiàn)機(jī)器人的三大部件吧!

1.QRobotHead

該類主要功能:機(jī)器人頭類

父類:QRobotPart

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

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

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

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

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

void QRobotHead::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget /* = nullptr */)
{
	/*
	繪制實(shí)際的頭部。
	實(shí)現(xiàn)分為兩部分:
		1:如果一個(gè)圖像被丟到機(jī)器人頭部上,我們就畫出圖像。
		2:否則,就畫出一個(gè)帶有簡(jiǎn)單矢量圖形的圓形矩形機(jī)器人頭部。
	*/
	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

該類主要功能:機(jī)器人軀干

父類:QRobotPart

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

代碼顯示:

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

顯示效果,如下圖:

這樣一個(gè)簡(jiǎn)易版的軀干就完成了。

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

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

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

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

3.QRobotLimb

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

父類:QRobotPart

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

按照一個(gè)順時(shí)針的方式進(jìn)行繪制。

對(duì)于每一個(gè)肢體,我們都采用下面的繪制圖形

如此以來(lái),只需要繪制一個(gè)圓角矩形以及一個(gè)圓形就可以了。

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

因?yàn)槭琼槙r(shí)針繪制,所以,在QRobotLimb中初始位置可以采用一個(gè)位置,根據(jù)創(chuàng)建出來(lái)的肢體不同,再對(duì)圖形進(jìn)行移動(dòng)

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

首先,先將第一個(gè)右下臂繪制出來(lái),顯示效果如下:

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

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

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

第二步:根據(jù)肢體的位置進(jìn)行移動(dòng)

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

//創(chuàng)建:機(jī)器人軀干
QGraphicsObject *torsoItem = new QRobotTorso(this);
//創(chuàng)建:機(jī)器人頭
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ī)器人頭部、軀干、四肢已經(jīng)繪制完成了。

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

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)2D賽車游戲的示例代碼

    C語(yǔ)言實(shí)現(xiàn)2D賽車游戲的示例代碼

    此游戲是《2D 賽車》的”魔改版“——2.5D 雙人賽車!原作實(shí)現(xiàn)了 2D 視角的賽車游戲,但是我覺得不夠真實(shí)、操縱感不強(qiáng),故擠出數(shù)個(gè)周末完成了這個(gè)”魔改版“,實(shí)現(xiàn)了第一人稱的視角,希望大家喜歡
    2022-12-12
  • C語(yǔ)言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)和雙向鏈表操作

    C語(yǔ)言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)和雙向鏈表操作

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)雙向鏈表操作,需要的朋友可以參考下
    2017-03-03
  • C++算法學(xué)習(xí)之貪心算法的應(yīng)用

    C++算法學(xué)習(xí)之貪心算法的應(yīng)用

    貪心算法是指,在對(duì)問題求解時(shí),總是做出在當(dāng)前看來(lái)是最好的選擇。本文為大家準(zhǔn)備了幾個(gè)示例,從而能深入了解貪心算法的應(yīng)用,需要的可以參考一下
    2022-05-05
  • C語(yǔ)言堆棧入門指南

    C語(yǔ)言堆棧入門指南

    我身邊的一些編程的朋友以及在網(wǎng)上看帖遇到的朋友中有好多也說不清堆棧,所以我想有必要給大家分享一下我對(duì)堆棧的看法,有說的不對(duì)的地方請(qǐng)朋友們不吝賜教,這對(duì)于大家學(xué)習(xí)會(huì)有很大幫助
    2014-01-01
  • VC實(shí)現(xiàn)的病毒專殺工具完整實(shí)例

    VC實(shí)現(xiàn)的病毒專殺工具完整實(shí)例

    這篇文章主要介紹了VC實(shí)現(xiàn)的病毒專殺工具完整實(shí)例,詳細(xì)講述了針對(duì)病毒的進(jìn)程終止、刪除文件及回復(fù)注冊(cè)表與啟動(dòng)項(xiàng)等,同時(shí)介紹了與之相關(guān)的系統(tǒng)函數(shù),非常具有參考借鑒價(jià)值,需要的朋友可以參考下
    2014-10-10
  • C語(yǔ)言計(jì)算大數(shù)階乘的方法

    C語(yǔ)言計(jì)算大數(shù)階乘的方法

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言計(jì)算大數(shù)階乘的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C/C++中memset,memcpy的使用及fill對(duì)數(shù)組的操作

    C/C++中memset,memcpy的使用及fill對(duì)數(shù)組的操作

    這篇文章主要介紹了C/C++中memset,memcpy的使用及fill對(duì)數(shù)組的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2020-12-12
  • C++中的拷貝構(gòu)造函數(shù)詳解

    C++中的拷貝構(gòu)造函數(shù)詳解

    大家好,本篇文章主要講的是C++中的拷貝構(gòu)造函數(shù)詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • Qt+Opencv實(shí)現(xiàn)梯度矯正功能

    Qt+Opencv實(shí)現(xiàn)梯度矯正功能

    這篇文章主要為大家詳細(xì)介紹了Qt如何結(jié)合Opencv實(shí)現(xiàn)梯度矯正功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • C/C++程序開發(fā)中實(shí)現(xiàn)信息隱藏的三種類型

    C/C++程序開發(fā)中實(shí)現(xiàn)信息隱藏的三種類型

    這篇文章主要介紹了C/C++程序開發(fā)中實(shí)現(xiàn)信息隱藏的三種類型的相關(guān)資料,需要的朋友可以參考下
    2016-02-02

最新評(píng)論

永城市| 鄱阳县| 万源市| 繁昌县| 林周县| 佛坪县| 平潭县| 辉县市| 水城县| 慈利县| 保亭| 苍山县| 景洪市| 舒兰市| 望都县| 灌云县| 津南区| 麻城市| 封丘县| 惠水县| 泗洪县| 墨竹工卡县| 扬州市| 习水县| 万安县| 沙坪坝区| 阜新| 榆中县| 平泉县| 霍林郭勒市| 江北区| 苗栗县| 怀宁县| 平武县| 新巴尔虎右旗| 岑溪市| 嘉荫县| 沽源县| 江阴市| 宁津县| 鲁甸县|