Qt 渐变(一): 线性渐变 :自定义QPushbutton

1、Qt 渐变(一): 线性渐变

QLinearGradient类与QBrush结合使用以指定线性渐变画笔。

线性渐变会在起点和终点之间插入颜色。 在这些点之外,将根据当前设置的扩展方法来填充,反射或重复渐变。

使用QGradientStop类型的停止点(即位置和颜色)定义渐变中的颜色。 使用QGradient :: setColorAt()或QGradient :: setStops()函数来定义停止点。 渐变的完整停止点集描述了渐变区域应如何填充。 如果未指定任何停止点,则使用0处黑色到1处白色的渐变。
​ 除了从QGradient继承的函数之外,QLinearGradient类还提供了finalStop()函数(该函数返回渐变的最终停止点)和start()函数(其返回渐变的起点)。

注意:受这样的习惯思维方式影响:人 们通常认为光线(例如阳光)总是从他们上方照射,而不是从它们下方。

下面的代码演示了如何使用一个GradientPaint创建一个从浅颜色到深颜色的渐变以在窗口中突出一个组件

DepthButton继承了 QPushbutton并复写paintEvent()以改变这个组件的背景颜色。

image-20210801155708799

当创建一个新的QLinearGradient时,必须指定这个渐变开始的和结束的坐标和颜色。对于完 全填充一个按钮的垂直渐变,如图所示,坐标指定为(0, 0)和(0,按钮的高度)。通 过把(按钮的宽度,按钮的高度)用作为第二个坐标,可以创建一个对角的渐变,也可以选 择位于这个组件边界的内部或外部的坐标。在这个图中,白色是开始的颜色,淡蓝色是结束的 颜色。

DepthButton.h

class DepthButton : public QPushButton
{
    Q_OBJECT
public:
    DepthButton(QString str=QString() ,QWidget *parent = nullptr);

    void paintEvent(QPaintEvent *) override;

    void enterEvent(QEvent *e) override;
    void leaveEvent(QEvent *e) override;

    QSize minimumSizeHint() const override;

private:
    bool isHovered = false;
};

DepthButton.cpp

#include "DepthButton.h"
DepthButton::DepthButton(QString str, QWidget *parent) :QPushButton(str,parent)
{
}

void DepthButton::paintEvent(QPaintEvent *){
    QPainter painter(this);
    painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
    QLinearGradient g(0,0,0,height());
    g.setColorAt(0,QColor(0x63a5f7));
    g.setColorAt(0.6,QColor(0x3799f4));
    g.setColorAt(0.62,QColor(0x2d7eeb));
    g.setColorAt(1,QColor(0x30a5f9));

    painter.setBrush(g);
    painter.setPen(Qt::NoPen);
    QRect rect(1,1,this->width()-2,this->height()-2);
    painter.drawRoundedRect(rect,8,8);

    if(isHovered){
        QPen pen(Qt::red,3);
        painter.setPen(pen);
        painter.setBrush(Qt::NoBrush);
        painter.drawRoundedRect(rect,8,8);
    }else{
        painter.setPen(Qt::black);
    }

    QFont font = painter.font();
    painter.setFont(font);
    painter.drawText(rect,Qt::AlignCenter,text());
}

void DepthButton::enterEvent(QEvent *)
{
    isHovered = true;
}

void DepthButton::leaveEvent(QEvent *)
{
    isHovered = false;
}

QSize DepthButton::minimumSizeHint() const
{
    return QSize(100,30);
}

Widget.cpp

// Widget.h 文件略
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    QGridLayout *mainLayout = new QGridLayout(this);

    mainLayout->addWidget(new DepthButton("Open"),0,0);
    mainLayout->addWidget(new DepthButton("New"),0,1);
    mainLayout->addWidget(new DepthButton("Quit"),0,2);
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值