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. COGS 693. [SDOI2005]Antiprime数 唯一分解定理逆用

    693. Antiprime数 ★★   输入文件:antip.in   输出文件:antip.out   简单对比 时间限制:1 s   内存限制:128 MB 如果一个自然数n(n>=1), ...

  2. 《从零开始学Swift》学习笔记(Day 36)——静态方法

    原创文章,欢迎转载.转载请注明:关东升的博客 静态方法与静态属性类似,Swift中定义了静态方法,也称为类型方法.静态方法的定义与静态属性类似,枚举和结构体的静态方法使用的关键字是static:类静态 ...

  3. c# 如何利用异或运算进行简单加密解密

    利用“^”异或运算对字符串进行加密 原理:按位做“异或”运算是->位值相同得1,不同得0,如下计算 1 ^ 1 = 0 1 ^ 0 = 1 0 ^ 1 = 1 0 ^ 0 = 0 例如: < ...

  4. FTP上传和下载文件的应用

    FTP(File Transfer Protocol)协议主要用来在网络上进行文件传输.FTP通讯除了有一个默认的端口21外,还有其他端口,同城两个端口同时进行数据传输.一个是默认的端口(通常为21) ...

  5. 20160924-2——mysql常见问题集锦

    一.数据类型相关问题 1.varchar(N)占用多少空间 (1)varchar(N)里的N是字符数,而不是字节数: (2)字符类型(varchar text blob等)空间=字符实际长度+字段长度 ...

  6. Cookies with curl the command line tool

    w https://curl.haxx.se/docs/http-cookies.html curl has a full cookie "engine" built in. If ...

  7. java爬虫-简单爬取网页图片

    刚刚接触到“爬虫”这个词的时候是在大一,那时候什么都不明白,但知道了百度.谷歌他们的搜索引擎就是个爬虫. 现在大二.再次燃起对爬虫的热爱,查阅资料,知道常用java.python语言编程,这次我选择了 ...

  8. VCL控件组件大都应该重载TWinControl的虚函数WndProc来进行处理窗口消息的工作

    TWinControl的构造函数中会调用MakeObjectInstance并且传递MainWndProc作为窗口消息处理函数,而MainWndProc则会调用虚函数WndProc来处理窗口消息.留个 ...

  9. Linux考试题附答案

    一.选择题 1.在登录Linux时,一个具有唯一进程ID号的shell将被调用,这个ID是什么(B)? A.NID B.PID C.UID D.CID 2.下面哪个目录存放用户密码信息(B) A./b ...

  10. 002-基本业务搭建【日志,工具类dbutils,dbcp等使用】

    一.需求分析 1.1.概述 1.用户进入“客户管理”,通过列表方式查看用户: 2.客户名称,模糊查询用户列表 3.客户名称,可查看客户详细信息 4.新增.编辑.删除功能等 二.系统设计 需要对原始需求 ...