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實現金字塔圖(3D和2D)
利用QPainter實現金字塔圖,2D和3D效果。如下: 核心程式碼如下 標頭檔案 #ifndef CPYRAMIDDLG_H #define CPYRAMIDDLG_H #include <QWidget> #include
快照lvm---全截圖(ext4和xfs)
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.cpp(3D點雲)學習與實現
!免責!以下全是個人理解,新人菜鳥難免出錯,希望指正。 一、函式學習 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頁面調起App(IOS 和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 實現簡單的登陸註冊功能(SharedPreferences和SQLite)
最近剛好做了一個Android的登入註冊介面,將資料利用SharedPreferences或者SQLite繫結到Android程式中,實現簡單的登陸註冊功能,本文未涉及到與伺服器的交流。 首先,對於登陸註冊要有一個明確的邏輯順序,不管是對於SharedPreferences
C++實現的螢幕截圖(PNG或BMP)
上回分享了一個全屏截圖的程式碼,儲存為BMP, 實際使用的過程中我發現截圖檔案實在大,無賴又整成了PNG截圖,現在分享出來。 MakePNG.h //MakePNG.h #pragma once #include <GdiPlus.h> using nam
圖相關(三)圖的鄰接矩陣表示(C++)及最最小生成樹演算法(prim和kruskal)
一.測試用圖 鄰接矩陣表示: //prim注意是無向圖 vector<vector<int>> p(6, vector<int>(6, INF));//類似dijikstra,沒有邊的點設為INF p[0][1] = 10;
Java 實現圖片等比例縮圖 (Thumbnailator + Jsp+SpringMVC)
Web應用為上傳圖片生成縮圖是常見的基本功能,通過縮圖生成提高了資訊瀏覽時的效能,在保證使用者使用體驗的同時減少了資料傳輸量。本次以例項的方式,講解如何使用使用Java實現圖片等比例縮圖生成功能。 效果檢視 程式碼編寫 Thumbn