1、Qt 渐变(一): 线性渐变
QLinearGradient类与QBrush结合使用以指定线性渐变画笔。
线性渐变会在起点和终点之间插入颜色。 在这些点之外,将根据当前设置的扩展方法来填充,反射或重复渐变。
使用QGradientStop类型的停止点(即位置和颜色)定义渐变中的颜色。 使用QGradient :: setColorAt()或QGradient :: setStops()函数来定义停止点。 渐变的完整停止点集描述了渐变区域应如何填充。 如果未指定任何停止点,则使用0处黑色到1处白色的渐变。
除了从QGradient继承的函数之外,QLinearGradient类还提供了finalStop()函数(该函数返回渐变的最终停止点)和start()函数(其返回渐变的起点)。
注意:受这样的习惯思维方式影响:人 们通常认为光线(例如阳光)总是从他们上方照射,而不是从它们下方。
下面的代码演示了如何使用一个GradientPaint创建一个从浅颜色到深颜色的渐变以在窗口中突出一个组件
DepthButton继承了 QPushbutton并复写paintEvent()以改变这个组件的背景颜色。
当创建一个新的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);
}