QT 学习记录:渐变-QLinearGradient,QRadialGradient,QConicalGradient)
2024-08-23 16:11:15
http://blog.csdn.net/wangwei890702/article/details/8552482
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);
- }
#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);
}
最新文章
- AndFix热修复 —— 实战与源码解析
- SQL怎么输出前n个记录? n是中间计算得到的,不支持变量传递
- Redis+Spring缓存实例
- .NET中Main函数使用小技巧
- 【BZOJ】1270: [BeijingWc2008]雷涛的小猫(DP+水题)
- 解决在.ashx文件中判断Session 总是NULL的方法
- Splashscreen
- PyQt4学习记录之事件和信号
- BZOJ1725: [Usaco2006 Nov]Corn Fields牧场的安排
- Chrome浏览器扩展开发系列之八:Chrome扩展的数据存储
- Linux修改文件permission属性
- Servlet第一篇【介绍Servlet、HTTP协议、WEB目录结构、编写入门Servlet程序、Servlet生命周期】
- JS中ptototype和__proto__的关系
- Github入门详情教程
- 给出两个单词word1和word2,写一个函数计算出将word1 转换为word2的最少操作次数。
- 获取外网出口ip
- TLS编程
- MongoDB的web可视化管理工具
- Linux基础和网络管理上机试题 - imsoft.cnblogs
- RotateWorldTest对层动作
热门文章
- [Spring Data Repositories]学习笔记--定义自己的repository
- 对 pthread 做的一个简陋封装
- 【BZOJ3995】[SDOI2015]道路修建 线段树区间合并
- CentOS7上elasticsearch5.0启动失败
- EasyNVR现场部署搭配EasyNVS云端集中控制应用于幼儿园直播场景的最佳方案!
- oracelp---随意 记录(nvl)
- LeNet5
- zabbix-2.4.8-1添加nginx状态监控
- mysql用户管理(新增用户及权限管理)
- deeplink