1. 程式人生 > >Qt實現金字塔圖(3D和2D)

Qt實現金字塔圖(3D和2D)

利用QPainter實現金字塔圖,2D和3D效果。如下:
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

核心程式碼如下
標頭檔案

#ifndef CPYRAMIDDLG_H
#define CPYRAMIDDLG_H

#include <QWidget>
#include <QPainter>


enum PyramidStyle
{
    DefaultPyramid=0,
    ShadingPyramid,
    ShapePyramid,
    Pyramid
};

class CPyramidDlg : public QWidget
{
    Q_OBJECT

public
: CPyramidDlg(QObject *parent = NULL); ~CPyramidDlg(); void setLayerCount(int count); void setPyramidStyleSheet(PyramidStyle pstype); void setColorList(QList<QColor> colorlist); void setColor(int index, QColor color); protected: void paintEvent(QPaintEvent *e); private
: void init(); void drawPyramid(QPainter *painter); void drawDefaultPyramid(QPainter *painter); void drawShadingPyramid(QPainter *painter); void drawShapePyramid(QPainter *painter); private: QList<QColor> m_colorlist; int m_layercount; //層數 預設4 PyramidStyle m_pyrstyle; }; #endif
// CPYRAMIDDLG_H

cpp檔案

#include “cpyramiddlg.h”
#include

CPyramidDlg::CPyramidDlg(QObject *parent)
{
init();
}

CPyramidDlg::~CPyramidDlg()
{

}

void CPyramidDlg::init()
{
setPyramidStyleSheet(ShapePyramid);
m_colorlist << QColor(255,242,0);
m_colorlist << QColor(141,198,63);
m_colorlist << QColor(251,176,64);
m_colorlist << QColor(146,39,143);
m_colorlist << QColor(136,68,255);
m_colorlist << QColor(102,170,238);
m_colorlist << QColor(238,187,34);

m_layercount = 5;

}

void CPyramidDlg::setLayerCount( int count )
{
if (count > 0)
m_layercount = count;
}

void CPyramidDlg::setPyramidStyleSheet( PyramidStyle pstype )
{
m_pyrstyle = pstype;
}

void CPyramidDlg::setColorList( QList colorlist )
{
m_colorlist.clear();
m_colorlist = colorlist;
}

void CPyramidDlg::setColor( int index, QColor color )
{
if (m_colorlist.count() > index)
m_colorlist.replace(index,color);
else
m_colorlist.append(color);
}

void CPyramidDlg::paintEvent( QPaintEvent *e )
{
QPainter *painter = new QPainter(this);
painter->setRenderHint(QPainter::Antialiasing);
painter->setRenderHint(QPainter::SmoothPixmapTransform);
painter->setRenderHint(QPainter::TextAntialiasing);

drawPyramid(painter);

}

void CPyramidDlg::drawPyramid( QPainter *painter )
{
switch (m_pyrstyle)
{
case DefaultPyramid: drawDefaultPyramid(painter); break;
case ShadingPyramid: drawShadingPyramid(painter); break;
case ShapePyramid: drawShapePyramid(painter); break;
default:drawDefaultPyramid(painter);break;
}
}

void CPyramidDlg::drawDefaultPyramid( QPainter *painter )
{
painter->save();
//painter->setPen(Qt::NoPen);
int w = width();
int h = height();
int radia = qMin(w,h)*0.8;
QPoint cerentpoint(w/2,h/2);

QPoint topp(w/2,radia*0.1);
QPoint leftbottom(w/2-radia/2,h-20);
QPoint rigthbottom(w/2+radia/2,h-20);   
int hradia = h;


int laycount = m_layercount;
if (laycount < 2)
    laycount = 5;

int step = radia/m_layercount/10;


for (int i = 0 ;i < laycount-1; ++i)
{
    int indexradia = radia/2*i/laycount;
    int hindexradia = hradia*i/laycount;

    int indexradia1 = radia/2*(i+1)/laycount;
    int hindexradia1 = hradia*(i+1)/laycount;

    QPoint p1(topp.x()-indexradia,topp.y()+hindexradia);
    QPoint p2(topp.x()+indexradia,topp.y()+hindexradia);
    QPoint p3(topp.x()-indexradia1,topp.y()+hindexradia1-step);
    QPoint p4(topp.x()+indexradia1,topp.y()+hindexradia1-step);

    QPainterPath rectpath;
    rectpath.moveTo(p1);
    rectpath.lineTo(p2);
    rectpath.lineTo(p4);
    rectpath.lineTo(p3);
    rectpath.lineTo(p1);

    QColor color(Qt::blue);
    if (i < m_colorlist.count())
    {
        color = m_colorlist.at(i);
    }

    QLinearGradient lineGradient(p1, p3);
    lineGradient.setColorAt(0, color/*.lighter(120)*/);
    //lineGradient.setColorAt(1.0, color/*.lighter(80)*/);
    painter->setBrush(lineGradient);
    painter->drawPath(rectpath);

}
painter->restore();

}

void CPyramidDlg::drawShadingPyramid( QPainter *painter )
{
painter->save();
//painter->setPen(Qt::NoPen);
int w = width();
int h = height();
int radia = qMin(w,h)*0.8;
QPoint cerentpoint(w/2,h/2);

QPoint topp(w/2,60);
QPoint leftbottom(w/2-radia/2,h-20);
QPoint rigthbottom(w/2+radia/2,h-20);   
int hradia = h;


int laycount = m_layercount;
if (laycount < 2)
    laycount = 5;

int step = radia/m_layercount/10;


for (int i = 0 ;i < laycount-1; ++i)
{
    int indexradia = radia/2*i/laycount;
    int hindexradia = hradia*i/laycount;

    int indexradia1 = radia/2*(i+1)/laycount;
    int hindexradia1 = hradia*(i+1)/laycount;

    QPoint p1(topp.x()-indexradia,topp.y()+hindexradia);
    QPoint p2(topp.x()+indexradia,topp.y()+hindexradia);
    QPoint p3(topp.x()-indexradia1,topp.y()+hindexradia1-step);
    QPoint p4(topp.x()+indexradia1,topp.y()+hindexradia1-step);

    QPainterPath rectpath;
    rectpath.moveTo(p1);
    rectpath.lineTo(p2);
    rectpath.lineTo(p4);
    rectpath.lineTo(p3);
    rectpath.lineTo(p1);

    QColor color(Qt::blue);
    if (i < m_colorlist.count())
    {
        color = m_colorlist.at(i);
    }

    QLinearGradient lineGradient(p3, p4);
    lineGradient.setColorAt(0, color.lighter(80));
    lineGradient.setColorAt(0.48, color.lighter(150));
    lineGradient.setColorAt(0.52, color.lighter(150));
    lineGradient.setColorAt(1.0, color.lighter(80));
    painter->setBrush(lineGradient);

    painter->drawPath(rectpath);

}
painter->restore();

}

void CPyramidDlg::drawShapePyramid( QPainter *painter )
{
painter->save();
//painter->setPen(Qt::NoPen);
int w = width();
int h = height();
int radia = qMin(w,h)*0.8;
QPoint cerentpoint(w/2,h/2);

QPoint topp(w/2,radia*0.1);
QPoint leftbottom(w/2-radia/2,h-20);
QPoint rigthbottom(w/2+radia/2,h-20);   
int hradia = h;


int laycount = m_layercount;
if (laycount < 2)
    laycount = 5;

int step = hradia*0.04;


int length = 10;

for (int i = 0 ;i < laycount-1; ++i)
{
    int indexradia = radia/2*i/laycount;
    int hindexradia = hradia*i/laycount;


    int indexradia1 = radia/2*(i+1)/laycount;
    int hindexradia1 = hradia*(i+1)/laycount-step;

    QPoint p1(topp.x()-indexradia,topp.y()+hindexradia);
    QPoint p2(topp.x()+indexradia,topp.y()+hindexradia);
    QPoint p3(topp.x()-indexradia1,topp.y()+hindexradia1);
    QPoint p4(topp.x()+indexradia1,topp.y()+hindexradia1);

    QPainterPath rectpath;
    rectpath.moveTo(p1);
    rectpath.lineTo(p2);
    rectpath.lineTo(p4);
    rectpath.lineTo(p3);
    rectpath.lineTo(p1);


    QColor color(Qt::blue);
    if (i < m_colorlist.count())
    {
        color = m_colorlist.at(i);
    }

    QLinearGradient lineGradient(p3, p4);
    lineGradient.setColorAt(0, color.dark(100));

// lineGradient.setColorAt(0.48, color.lighter(150));
// lineGradient.setColorAt(0.52, color.lighter(150));
// lineGradient.setColorAt(1.0, color.dark(180));
painter->setBrush(lineGradient);

    painter->drawPath(rectpath);

    lineGradient.setColorAt(0, color.dark(200));
    painter->setBrush(lineGradient);
    //上邊的部分
    QPainterPath toprectpath;
    int yL = step*0.2*i;
    int xL = step*0.2*i;
    QPoint topleft(p1.x()+xL,p1.y()-yL);
    QPoint toprigth(p2.x()+xL,p2.y()-yL);
    QPoint bottomrigth(p4.x()+xL+step*0.5,p4.y()-yL);
    toprectpath.moveTo(p1);
    toprectpath.lineTo(topleft);
    toprectpath.lineTo(toprigth);
    toprectpath.lineTo(p2);
    painter->drawPath(toprectpath);

    lineGradient.setColorAt(0, color.dark(150));
    painter->setBrush(lineGradient);
    //右側部分
    QPainterPath rightrectpath;
    rightrectpath.moveTo(p2);
    rightrectpath.lineTo(p4);
    rightrectpath.lineTo(bottomrigth);
    rightrectpath.lineTo(toprigth);
    painter->drawPath(rightrectpath);

}
painter->restore();

}

相關推薦

Qt實現金字塔3D2D

利用QPainter實現金字塔圖,2D和3D效果。如下: 核心程式碼如下 標頭檔案 #ifndef CPYRAMIDDLG_H #define CPYRAMIDDLG_H #include <QWidget> #include

快照lvm---全截ext4xfs

ext cimage 分享 rip ges -- orien http ext1 *******************************************************************************************

【資料結構】資料結構C語言的實現鄰接表法

圖(鄰接表法) /* * 鄰接表的建立和圖的遍歷的程式碼實現 */ #include <stdio.h> #include <stdlib.h> #define TRUE 1 #define FALSE 0 #define O

Qt實現遍歷資料夾檔案目錄,並過濾獲取檔案資訊、字尾名、字首名

下面是自己的實際工作中寫的程式碼,請大家斧正#ifndefINQUIRYDIALOG_H#defineINQUIRYDIALOG_H#include<QDialog>#include<QFileDialog>#include<QDir>#i

ASP.NET Core 簡單實現七牛圖片上傳FormData Base64

private stream public 圖片 ASP.NET Core 簡單實現七牛圖片上傳(FormData 和 Base64)七牛圖片上傳 SDK(.NET 版本):https://developer.qiniu.com/kodo/sdk/1237/csharpUpoladServic

Matplotlib學習---用seaborn畫直方圖核密度histogram & kdeplot

tro ima 直方圖 subplot 平滑 style 創建 hist detail 由於直方圖受組距(bin size)影響很大,設置不同的組距可能會產生完全不同的可視化結果。因此我們可以用密度平滑估計來更好地反映數據的真實特征。具體可參見這篇文章:https://bl

mxGraph實現魚骨因果轉自CSDN,鏈接附於文中

view rto https bind right drawpath point sub nta 魚骨圖由日本管理大師石川馨先生所發明,故又名石川圖。魚骨圖是一種發現問題“根本原因”的方法,它也可以稱之為“Ishikawa”或者“因果圖”。其特點是簡捷實用,深入直觀。它看

DLIB庫example中3d_point_cloud_ex.cpp3D點雲學習與實現

!免責!以下全是個人理解,新人菜鳥難免出錯,希望指正。 一、函式學習 1、perspective_window::overlay_dot (類,繼承自drawable_window, noncopyable)perspective_window: This is a simple win

基於Restful服務端的客戶端實現WebClient HttpURLConnection

前提: 1、Restful風格的WS服務端:Web Service筆記(五):CXF開發RESTful風格的Web Service 2、訪問客戶端的技術太多了,這邊總結下本人使用過的,主要是四種:WebClient 、HttpURLConnection、HttpClient 和Res

js h5頁面調起AppIOS android實現方法

js h5頁面調起App(IOS 和android)的實現方法 第一次寫這個:我們的app是由原聲和h5組成的,當用戶使用瀏覽器開啟我們的頁面時我們會引導使用者使:開啟App 下載App 剛開始我是使用定時器來實現的,當用戶點選了開啟App經過一定時間之後沒有反應,則我們認為她調起App

vue中用computed簡單實現資料的雙向繫結getter setter

vue是號稱實現了資料雙向繫結的框架,但事實上在日常開發中我們用的最多的就是 v-model 將data(vue例項中)裡面的是資料和view 相關聯,實現 data 更新,view自動重新整理的效果。但是,在移動成都上來說,這種資料雙向繫結的效果並不是特別的明顯。 今天,我用輸入框和 co

純css實現圍繞圓心運動的軌跡圓形方形

主要使用keyframes屬性。 目前瀏覽器都不支援 @keyframes 規則。 Firefox 支援替代的 @-moz-keyframes 規則。 Opera 支援替代的 @-o-keyframes 規則。 Safari 和 Chrome 支援替代的 @-webkit-keyframes 規則。

每日一題——的遍歷BFS DFS

題目描述 從鍵盤接收有向圖的頂點集,弧集,建立有向圖,並完成下列任務: (1)計算結點的出度、入度以及度; (2) 從第一個頂點出發,求一個深度優先遍歷序列; (3) 從第一個頂點頂點出發,求一個廣度優先遍歷序列。 注意:以使用者輸入各個頂點

Android如何獲取視訊預覽或首幀獲取視訊時長

Android獲取視訊預覽圖(或首幀)和獲取時長需要用到MediaMetadataRetriever類,獲取預覽圖使用getFrameAtTime()方法,獲取時長使用extractMetadata(MediaMetadataRetriever.METADATA_KEY_DU

QT實現HTTP請求超時阻塞

postdata.hpp #ifndef POSTDATA_HPP #define POSTDATA_HPP class PostData : public QObject {     Q_OBJECT public:   &nb

Android框架之路——Banner實現輪播RecyclerView新增Header

一、簡介 Banner能實現迴圈播放多個廣告圖片和手動滑動迴圈等功能。因為原生ViewPager並不支援迴圈翻頁, 要實現迴圈還得需要自己去動手。Banner框架可以進行不同樣式、不同動畫設定, 以及完善的api方法能滿足大部分軟體首頁輪播圖效果的需求。

Android 實現簡單的登陸註冊功能SharedPreferencesSQLite

最近剛好做了一個Android的登入註冊介面,將資料利用SharedPreferences或者SQLite繫結到Android程式中,實現簡單的登陸註冊功能,本文未涉及到與伺服器的交流。 首先,對於登陸註冊要有一個明確的邏輯順序,不管是對於SharedPreferences

C++實現的螢幕截PNG或BMP

上回分享了一個全屏截圖的程式碼,儲存為BMP, 實際使用的過程中我發現截圖檔案實在大,無賴又整成了PNG截圖,現在分享出來。 MakePNG.h //MakePNG.h #pragma once #include <GdiPlus.h> using nam

相關的鄰接矩陣表示C++及最最小生成樹演算法primkruskal

一.測試用圖 鄰接矩陣表示: //prim注意是無向圖 vector<vector<int>> p(6, vector<int>(6, INF));//類似dijikstra,沒有邊的點設為INF p[0][1] = 10;

Java 實現圖片等比例縮 Thumbnailator + Jsp+SpringMVC

Web應用為上傳圖片生成縮圖是常見的基本功能,通過縮圖生成提高了資訊瀏覽時的效能,在保證使用者使用體驗的同時減少了資料傳輸量。本次以例項的方式,講解如何使用使用Java實現圖片等比例縮圖生成功能。 效果檢視 程式碼編寫 Thumbn