QRadialGradient,QLinearGradient, QConicalGradient

 

//renderlabel.h
#ifndef RENDERLABEL_H
#define RENDERLABEL_H
#include <QLabel>
#include <QPainter>


class RenderLabel : public QLabel
{
    Q_OBJECT
public:
    RenderLabel(QWidget *parent=0);
    enum BrushPattern{LinearGradient,RadialGradient,ConicalGradient,TexturePattern};
    void setBrushPattern(BrushPattern brushPattern);
protected:
    void paintEvent(QPaintEvent *);

private :
    BrushPattern brushPattern;

};

#endif // RENDERLABEL_H

//widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "renderlabel.h"

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void on_LineButton_clicked();

    void on_RdaidButton_clicked();

    void on_ConicalButon_clicked();

    void on_TextureButton_clicked();

private:
    Ui::Widget *ui;
    RenderLabel *renderLabel;
};

#endif // WIDGET_H



//widget.cpp
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);


    renderLabel = new RenderLabel(this);
    this->renderLabel->setGeometry(0,0,500,500);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_LineButton_clicked()
{
    renderLabel->setBrushPattern(RenderLabel::LinearGradient);
    renderLabel->update();
}

void Widget::on_RdaidButton_clicked()
{
    renderLabel->setBrushPattern(RenderLabel::RadialGradient);
    renderLabel->update();
}

void Widget::on_ConicalButon_clicked()
{
    renderLabel->setBrushPattern(RenderLabel::ConicalGradient);
    renderLabel->update();
}

void Widget::on_TextureButton_clicked()
{
    renderLabel->setBrushPattern(RenderLabel::TexturePattern);
    renderLabel->update();
}

//renderlabel.cpp
#include "renderlabel.h"
#include <QBrush>
#include <QtWidgets>
#include <QLinearGradient>

RenderLabel::RenderLabel(QWidget *parent):QLabel(parent)
{

}

void RenderLabel::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing,true);
    QRadialGradient radialGradient(200,200,200,300,300); //辐射渐变 中心点 半径 焦点
    QLinearGradient linearGradient(10,10,410,210); //声明线性渐变对象 左上角 右下角坐标
    QConicalGradient conicalGradient(200,200,30); //锥形渐变  中心 角度
    switch(this->brushPattern)
    {
    case RenderLabel::LinearGradient:

        linearGradient.setColorAt(0,Qt::red);
        linearGradient.setColorAt(0.3,Qt::green);
      //  linearGradient.setColorAt(0.5,Qt::black);
        linearGradient.setColorAt(1,Qt::yellow);
       // painter.setBrush(QBrush(Qt::red,Qt::SolidPattern));
        painter.setBrush(linearGradient); //用线性渐变作为画刷
        painter.drawRect(10,10,400,200);
        break;
    case RenderLabel::RadialGradient:
        //辐射渐变

        radialGradient.setColorAt(0,Qt::red);
        radialGradient.setColorAt(1,Qt::yellow);
        painter.setBrush(radialGradient);
        painter.drawEllipse(10,10,300,300);
        painter.drawText(100,100,tr("...."));
        break;
    case RenderLabel::ConicalGradient:
        //锥形渐变
        conicalGradient.setColorAt(0,Qt::green);
        conicalGradient.setColorAt(0.5,Qt::red);
        conicalGradient.setColorAt(1,Qt::yellow);
        painter.setBrush(conicalGradient);
        painter.setPen(Qt::NoPen);     //取消画笔
        painter.drawEllipse(10,10,390,390);
        painter.drawText(100,100,tr("ok"));
        break;

    case RenderLabel::TexturePattern:
        painter.setBrush(QBrush(QPixmap(":/2.jpg")));
        painter.drawEllipse(10,10,500,500);
        painter.drawText(100,100,tr("hello"));
        break;
    }

}

void RenderLabel::setBrushPattern(BrushPattern brushPatter)
{
    brushPattern = brushPatter;
}

//main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

 

转载于:https://my.oschina.net/osyunwei/blog/717708

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值