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. CodeForces 213 E

    /* 线段树 + hash: 首先我们可以知道A序列是1~n的排列,那么我们可以先在B序列中把1~n的排列找出来,看其相对位置是否与A相同(hash可做),相同即表明存在一个d满足条件. 以此类推,我 ...

  2. Win7系统安装 MySQL 8.0.11

    1. 下载 MySQL 8.0.11 版本 下载地址: https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.11-winx64.zip 2. 下载 ...

  3. 男神的约会(状压dp)

    有一天男神约了学姐姐去看电影,电影院有一个活动,给你一个10*10的矩阵,每一个格子上都有一个0-9的整数,表示一共十种优惠券中的一种. 观众从左上角的格子开始走,走到右下角.每走到一个有着a号优惠券 ...

  4. EasyNVR摄像机网页无插件直播使用过程中问题的自我排查-设备不在线问题的自我排查

    系列背景 由于EasyNVR的受众越来越多,时长会遇到很对类似的问题咨询,之前虽然有写过很多的博文进行技术的或者使用问题的解答,随着客户询问的增多,我发现,要想然客户了解问题和解决问题,往往引导和给一 ...

  5. 巨蟒django之CRM4 一些小功能

    内容回顾: 修改的地方 (1) (2) (3) (4) (5) 整体回顾前几天内容: 现在可以登录的原因,session内部存储了信息 这个时候我们再访问刚才的地址,会发现,跳转到了登录页面login ...

  6. PS导出@3x、@2x、@1x格式的iOS切图神器-Retinize

    Retinize动作下载地址:http://retinize.it/ 使用:ps-载入动作-选中图片-执行动作

  7. AWS入门-1

    对于 Amazon Linux AMI,用户名为 ec2-user. 对于 RHEL AMI,用户名称是 ec2-user 或 root. 对于 Ubuntu AMI,用户名称是 ubuntu 或 r ...

  8. Nginx配置参数说明

    一.主配置段1.正常运行必备的配置#运行用户和组,组身份可以省略user nginx nginx; #指定nginx守护进程的pid文件pid path/to/nginx.pid; #指定所有work ...

  9. 4.2 使用STM32控制MC20发送短信

    需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...

  10. javascript高级语法

    一.JavaScript对象 1.js对象简介 1.1 在JavaScript中除了null和undefined以外其他的数据类型都被定义成了对象,也可以用创建对象的方法定义变量,在JavaScrip ...