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

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用vs制作音乐播放器和使用Qt制作音乐播放器在很多方面有一些相似之处,但也有一些显著的差异。 首先,无论是使用vs还是Qt,都可以实现创建一个形界面的音乐播放器。通过使用形界面,用户可以更直观地浏览和操作音乐文件。无论是选择vs还是Qt,都可以通过拖放控件、设置按钮和进度条等来构建用户友好的界面。 然而,vs和Qt的工作方式有所不同。在使用vs时,开发者通常会使用C#或C++等语言来编写代码。vs提供了一系列的形界面设计工具,如Windows Forms或WPF,可以方便地创建形界面。通过使用.NET Framework等库,可以轻松处理音乐文件的读取和播放。 相比之下,Qt是一个跨平台的开发框架,使用C++语言编写代码。Qt形界面开发方面拥有强大的功能和灵活性。通过使用Qt的库和类,可以轻松实现音乐文件的读取、解码和播放功能。Qt还提供了丰富的UI控件和可定制化的样式,以满足开发者对音乐播放器界面的自定义需求。 另一个重要的区别是vs和Qt的适用平台不同。使用vs创建的音乐播放器主要运行在Windows操作系统上,而使用Qt创建的音乐播放器可以在多个操作系统上运行,包括Windows、Linux和Mac OS等。这意味着,如果开发者希望将音乐播放器应用到不同的平台上,选择Qt可能更具有优势。 总而言之,在选择vs还是Qt制作音乐播放器时,需要考虑开发者的编程经验、目标平台和需求,然后选择最适合的工具和技术来实现功能丰富的音乐播放器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值