一、QGradient
该类是渐变画刷相关的类,有三个子类,分别是QConicalGradient、QRadialGradient和QLinearGradient
1、QConicalGradient是圆锥画刷;通过确定中心点,然后以跟初始轴的夹角位置,向两边扩散;x轴是中心点水平向右;angle是相对x轴的位置作为起始点
QConicalGradient(const QPointF ¢er, qreal angle)
QConicalGradient coneGradient(0,0,-90.0); coneGradient.setColorAt(0.0,Qt::darkGray); coneGradient.setColorAt(0.2,niceBlue); coneGradient.setColorAt(0.5,Qt::white); coneGradient.setColorAt(1.0,Qt::darkGray);
是以(0,0)位置为原点,相对x轴-90度,则相当于-Y轴方向为起始点开始渲染颜色;
setColorAt的第一个参数x是指360*x所对应的角度作为起始位置向两边扩散,着指定的颜色;
2、QRadialGradient是同心圆画刷;通过指定中心位置,然后指定跟中心点距离,假定全长为1,进行扩散;这个函数有两个中心点;center和focalPoint;center指定了实际的圆心;focalPoint则是指在渲染颜色的时候,跟center的中间点作为渲染圆心进行同心圆渲染;如下两张图所示
QRadialGradient haloGradient(0,0,20,0,0); QRadialGradient haloGradient(0,0,20,30,30);
这里通过修改如上标注的不同参数而产生的结果;
3、QLinearGradient是线性画刷;要指定以哪一条线为基准进行从a点到b渲染画刷;如下从start点到finalStop点进行渲染画刷;
QLinearGradient(const QPointF &start, const QPointF &finalStop)
二、世界变换;QTransform
它允许移动、缩放、旋转或者拉伸绘制的项;
如下则是旋转示例,加粗部分是对应的旋转的用法;
QTransform transform; for (int i = 0; i <= MaxMinutes; ++i) { transform.rotate(-i*DegreesPerMinute); painter->setWorldTransform(transform); if (i%5== 0) { painter->setPen(thickPen); painter->drawLine(0,-41,0,-44); painter->drawText(-15,-41,30,30, Qt::AlignHCenter|Qt::AlignTop, QString::number(i)); } else { painter->setPen(thinPen); painter->drawLine(0,-42,0,-44); } transform.rotate(i*DegreesPerMinute); }
上面代码显示的结果如下截图所示
QPainter里面也包含世界变换里面的简单函数;当只是进行简单旋转获得拉伸等操作的时候,直接使用painter进行操作即可;如下示例所示,也能达到上图的效果;
for (int i = 0; i <= MaxMinutes; ++i) { painter->save(); painter->rotate(-i*DegreesPerMinute); if (i%5== 0) { painter->setPen(thickPen); painter->drawLine(0,-41,0,-44); painter->drawText(-15,-41,30,30, Qt::AlignHCenter|Qt::AlignTop, QString::number(i)); } else { painter->setPen(thinPen); painter->drawLine(0,-42,0,-44); } painter->restore(); }