http://blog.csdn.net/wangwei890702/article/details/8552482

QT:渐变

渐变,是指逐渐的,有规律性的变化,是一种规律性很强的现象。Qt提供了一个与渐变相关的QGradient类,目前支持三种渐变画刷,分别是线性渐变(QLinearGradient)、辐射渐变(QRadialGradient)、角度渐变(QConicalGradient),如下图所示:

从左到右依次为:线性渐变、辐射渐变、角度渐变

下面来看一下实现的代码,由于程序较简单,所以将解释都加在了每行代码的后边:

  1. #include<QtGui/QApplication>
  2. #include"gradient_test.h"
  3. intmain(intargc,char*argv[])
  4. {
  5. QApplicationa(argc,argv);
  6. gradient_testw;
  7. w.show();
  8. returna.exec();
  9. }
  10. //gradient_test.h:
  11. #ifndefGRADIENT_TEST_H
  12. #defineGRADIENT_TEST_H
  13. #include<QtGui/QWidget>
  14. #include<QPainter>
  15. #include<QStyleOption>
  16. #include<QResizeEvent>
  17. classgradient_test:publicQWidget
  18. {
  19. Q_OBJECT
  20. public:
  21. explicitgradient_test(QWidget*parent=0);
  22. virtualQSizesizeHint()const;
  23. protected:
  24. voidpaintEvent(QPaintEvent*event);
  25. voidresizeEvent(QResizeEvent*event);
  26. private:
  27. QSizeinitSize;
  28. QImagewheel;
  29. voiddrawLine(constQSize&newSize);
  30. };
  31. #endif//GRADIENT_TEST_H
  32. //gradient_test.cpp:
  33. #include"gradient_test.h"
  34. gradient_test::gradient_test(QWidget*parent)
  35. :QWidget(parent),initSize(300,300)
  36. {
  37. resize(650,250);    //窗口大小
  38. }
  39. voidgradient_test::drawLine(constQSize&newSize)
  40. {
  41. QPainterpainter(&wheel);   //wheel作为画图对象?
  42. painter.setRenderHint(QPainter::Antialiasing);  //消除锯齿
  43. wheel.fill(Qt::white);
  44. //线性渐变
  45. QLinearGradientlinearGradient(20,20,150,150);
  46. //创建了一个QLinearGradient对象实例,参数为起点和终点坐标,可作为颜色渐变的方向
  47. //painter.setPen(Qt::NoPen);
  48. linearGradient.setColorAt(0.0,Qt::green);
  49. linearGradient.setColorAt(0.2,Qt::white);
  50. linearGradient.setColorAt(0.4,Qt::blue);
  51. linearGradient.setColorAt(0.6,Qt::red);
  52. linearGradient.setColorAt(1.0,Qt::yellow);
  53. painter.setBrush(QBrush(linearGradient));
  54. painter.drawEllipse(10,10,200,200);
  55. //前面为左边,后面两个参数为横轴和纵轴,上面的四行分别设置渐变的颜色和路径比例
  56. //辐射渐变
  57. QRadialGradientradialGradient(310,110,100,310,110);
  58. //创建了一个QRadialGradient对象实例,参数分别为中心坐标,半径长度和焦点坐标,如果需要对称那么中心坐标和焦点坐标要一致
  59. radialGradient.setColorAt(0,Qt::green);
  60. //radialGradient.setColorAt(0.2,Qt::white);
  61. radialGradient.setColorAt(0.4,Qt::blue);
  62. //radialGradient.setColorAt(0.6,Qt::red);
  63. radialGradient.setColorAt(1.0,Qt::yellow);
  64. painter.setBrush(QBrush(radialGradient));
  65. painter.drawEllipse(210,10,200,200);//在相应的坐标画出来
  66. //弧度渐变
  67. QConicalGradientconicalGradient(510,110,0);
  68. //创建了一个QConicalGradient对象实例,参数分别为中心坐标和初始角度
  69. conicalGradient.setColorAt(0,Qt::green);
  70. conicalGradient.setColorAt(0.2,Qt::white);
  71. conicalGradient.setColorAt(0.4,Qt::blue);
  72. conicalGradient.setColorAt(0.6,Qt::red);
  73. conicalGradient.setColorAt(0.8,Qt::yellow);
  74. conicalGradient.setColorAt(1.0,Qt::green);
  75. //设置渐变的颜色和路径比例
  76. painter.setBrush(QBrush(conicalGradient));
  77. painter.drawEllipse(410,10,200,200);//在相应的坐标画出来
  78. }
  79. QSizegradient_test::sizeHint()const
  80. {
  81. returnQSize(height(),height());
  82. }
  83. voidgradient_test::resizeEvent(QResizeEvent*event)
  84. {
  85. wheel=QImage(event->size(),QImage::Format_ARGB32_Premultiplied);
  86. wheel.fill(palette().background().color());
  87. drawLine(event->size());
  88. update();
  89. }
  90. voidgradient_test::paintEvent(QPaintEvent*event)
  91. {
  92. QPainterpainter(this);
  93. QStyleOptionopt;
  94. opt.init(this);
  95. painter.drawImage(0,0,wheel);
  96. style()->drawPrimitive(QStyle::PE_Widget,&opt,&painter,this);
  97. }
#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);
}

QT 学习记录:渐变-QLinearGradient,QRadialGradient,QConicalGradient)的更多相关文章

  1. Qt学习记录--Qt::CaseSensitive

    Qt::CaseSensitivity 为枚举类型, 可取值Qt::CaseSensitive 和 Qt::CaseInsensitive, 表示匹配的灵敏度. 比较字符串的时候 Qt::CaseSe ...

  2. Qt学习记录--02 Qt的信号槽机制介绍(含Qt5与Qt4的差异对比)

    一 闲谈: 熟悉Window下编程的小伙伴们,对其消息机制并不陌生, 话说:一切皆消息.它可以很方便实现不同窗体之间的通信,然而MFC库将很多底层的消息都屏蔽了,尽管使用户更加方便.简易地处理消息,但 ...

  3. QT学习记录(1)-控件 QPushButton, QLineEdit, QLabel, QHBoxLayout, QGridLayout

    1.一个简单的QT程序(QPushButton) /* 应用程序抽象类 */ #include <QApplication> /*窗口类*/ #include <QWidget> ...

  4. QT学习记录

    QApplication app(argc,argv); 创建了一个QApplication对象,这个对象用于管理应用程序级别的资源.QApplication的构造函数要求两个参数,分别来自main的 ...

  5. QT学习记录之控件布局

    作者:朱金灿 来源:http://blog.csdn.net/clever101 想到控件布局就会想到Windows编程中要实现对话框上的控件的合理布局是一件多么艰难的事情.对此QT提出了一个很方便的 ...

  6. QT学习记录之理解信号槽机制

    作者:朱金灿 来源:http://blog.csdn.net/clever101 QT的事件机制采用的信号槽机制.所谓信号槽机制,简而言之就是将信号和信号处理函数绑定在一起,比如一个按钮被单击是一个信 ...

  7. QT学习记录之环境搭建

    作者:朱金灿 来源:http://blog.csdn.net/clever101 1. 安装qt-win-opensource-4.8.5-vs2008.exe(对应的IDE是VS2008),安装路径 ...

  8. 线性渐变、辐射渐变、角度渐变-QLinearGradient,QRadialGradient,QConicalGradient

    渐变,是指逐渐的,有规律性的变化,是一种规律性很强的现象.Qt提供了一个与渐变相关的QGradient类,目前支持三种渐变画刷,分别是线性渐变(QLinearGradient).辐射渐变(QRadia ...

  9. 30.QT-渐变之QLinearGradient、 QConicalGradient、QRadialGradient

    渐变有三种:QLinearGradient.QConicalGradient . QRadialGradient 它们都有一个QGradient父类 QGradient父类的常用公共函数有: void ...

随机推荐

  1. [Spring Data MongoDB]学习笔记--建立数据库的连接

    1. 有了上一篇的Mongo后,连接数据库我们还需要更多的信息,比如数据库名字,用户名和密码等. 我们可以继续来配置MongoDbFactory的实例. public interface MongoD ...

  2. grafana-----Annotation

    注释提供了一个方法,在丰富的活动中做个标志点.当你鼠标移到这个注释上,你可以得到title,tags,和text information的事件. Queries 注释事件获得是通过一个注释查询.打开d ...

  3. docker desktop

    https://github.com/rogaha/docker-desktop http://blog.csdn.net/tinylab/article/details/45443563

  4. 整理前端css/js/jq常见问题及解决方法(2)

    移动端 手机 1.点击图片或按钮,选中状态影响到其他范围解决:html{-webkit-user-select:none}<meta name="msapplication-tap-h ...

  5. 前端基础 & Bootstrap框架

    Bootstrap介绍 Bootstrap是Twitter开源的基于HTML.CSS.JavaScript的前端框架. 它是为实现快速开发Web应用程序而设计的一套前端工具包. 它支持响应式布局,并且 ...

  6. python函数补充

    一 作用域 作用域介绍 python中的作用域分4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局      ...

  7. hdu 4956 Poor Hanamichi BestCoder Round #5(数学题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4956 Poor Hanamichi Time Limit: 2000/1000 MS (Java/Ot ...

  8. 什么是 XML Schema(转)

    什么是 XML Schema? XML Schema 的作用是定义 XML 文档的合法构建模块,类似 DTD. XML Schema 的作用: 定义可出现在文档中的元素 定义可出现在文档中的属性 定义 ...

  9. BigDecimal类型、Long类型判断值是否相等,以及BigDecimal加减乘除

    //Long是需要比较精度的,所以要用longValueif(project.getFriendId().longValue() != friendId.longValue()) { return t ...

  10. jQuery EasyUI - 数据表格(DataGrid)

    由于工作需要,项目使用前端 jQuery EasyUI - DataGrid 来控制数据表格. 1.加载相关js和css,因为easyui依赖jquery,所有加载easyui前要先加载jquery, ...