QT:渐变
渐变,是指逐渐的,有规律性的变化,是一种规律性很强的现象。Qt提供了一个与渐变相关的QGradient类,目前支持三种渐变画刷,分别是线性渐变(QLinearGradient)、辐射渐变(QRadialGradient)、角度渐变(QConicalGradient),如下图所示:
从左到右依次为:线性渐变、辐射渐变、角度渐变
下面来看一下实现的代码,由于程序较简单,所以将解释都加在了每行代码的后边:
#include<QtGui/QApplication> #include"gradient_test.h" intmain(intargc,char*argv[]) { QApplicationa(argc,argv); gradient_testw; w.show(); returna.exec(); } //gradient_test.h: #ifndefGRADIENT_TEST_H #defineGRADIENT_TEST_H #include<QtGui/QWidget> #include<QPainter> #include<QStyleOption> #include<QResizeEvent> classgradient_test:publicQWidget { Q_OBJECT public: explicitgradient_test(QWidget*parent=0); virtualQSizesizeHint()const; protected: voidpaintEvent(QPaintEvent*event); voidresizeEvent(QResizeEvent*event); private: QSizeinitSize; QImagewheel; voiddrawLine(constQSize&newSize); }; #endif//GRADIENT_TEST_H //gradient_test.cpp: #include"gradient_test.h" gradient_test::gradient_test(QWidget*parent) :QWidget(parent),initSize(300,300) { resize(650,250); //窗口大小 } voidgradient_test::drawLine(constQSize&newSize) { QPainterpainter(&wheel); //wheel作为画图对象? painter.setRenderHint(QPainter::Antialiasing); //消除锯齿 wheel.fill(Qt::white); //线性渐变 QLinearGradientlinearGradient(20,20,150,150); //创建了一个QLinearGradient对象实例,参数为起点和终点坐标,可作为颜色渐变的方向 //painter.setPen(Qt::NoPen); linearGradient.setColorAt(0.0,Qt::green); linearGradient.setColorAt(0.2,Qt::white); linearGradient.setColorAt(0.4,Qt::blue); linearGradient.setColorAt(0.6,Qt::red); linearGradient.setColorAt(1.0,Qt::yellow); painter.setBrush(QBrush(linearGradient)); painter.drawEllipse(10,10,200,200); //前面为左边,后面两个参数为横轴和纵轴,上面的四行分别设置渐变的颜色和路径比例 //辐射渐变 QRadialGradientradialGradient(310,110,100,310,110); //创建了一个QRadialGradient对象实例,参数分别为中心坐标,半径长度和焦点坐标,如果需要对称那么中心坐标和焦点坐标要一致 radialGradient.setColorAt(0,Qt::green); //radialGradient.setColorAt(0.2,Qt::white); radialGradient.setColorAt(0.4,Qt::blue); //radialGradient.setColorAt(0.6,Qt::red); radialGradient.setColorAt(1.0,Qt::yellow); painter.setBrush(QBrush(radialGradient)); painter.drawEllipse(210,10,200,200);//在相应的坐标画出来 //弧度渐变 QConicalGradientconicalGradient(510,110,0); //创建了一个QConicalGradient对象实例,参数分别为中心坐标和初始角度 conicalGradient.setColorAt(0,Qt::green); conicalGradient.setColorAt(0.2,Qt::white); conicalGradient.setColorAt(0.4,Qt::blue); conicalGradient.setColorAt(0.6,Qt::red); conicalGradient.setColorAt(0.8,Qt::yellow); conicalGradient.setColorAt(1.0,Qt::green); //设置渐变的颜色和路径比例 painter.setBrush(QBrush(conicalGradient)); painter.drawEllipse(410,10,200,200);//在相应的坐标画出来 } QSizegradient_test::sizeHint()const { returnQSize(height(),height()); } voidgradient_test::resizeEvent(QResizeEvent*event) { wheel=QImage(event->size(),QImage::Format_ARGB32_Premultiplied); wheel.fill(palette().background().color()); drawLine(event->size()); update(); } voidgradient_test::paintEvent(QPaintEvent*event) { QPainterpainter(this); QStyleOptionopt; opt.init(this); painter.drawImage(0,0,wheel); style()->drawPrimitive(QStyle::PE_Widget,&opt,&painter,this); }