Figure
8.1. QPainter's most frequently used
draw...()
functions

Figure 8.2. Cap and join
styles

Figure 8.3. Pen styles

Figure 8.4. Predefined brush
styles

现在来看看具体的例子。下面的代码是绘制图8.5(a)中椭圆的代码:
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing,
true);
painter.setPen(QPen(Qt::black, 12,
Qt::DashDotLine, Qt::RoundCap));
painter.setBrush(QBrush(Qt::green,
Qt::SolidPattern));
painter.drawEllipse(80, 80, 400,
240);
调用函数setRenderHint(QPainter::Antialiasing,true),使绘制时边缘平滑,使用颜色浓度的变化,把图形的边缘转换为象素时引起的扭曲变形尽可能减少,在支持这一功能的平台或者绘图设备上得到一个平滑的边缘。
Figure
8.5. Geometric shape examples

下面的代码是图8.5(b)中绘制扇形的代码:
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing,
true);
painter.setPen(QPen(Qt::black, 15, Qt::SolidLine,
Qt::RoundCap,
Qt::MiterJoin));
painter.setBrush(QBrush(Qt::blue,
Qt::DiagCrossPattern));
painter.drawPie(80, 80, 400, 240, 60 * 16, 270 *
16);
函数drawPie()的最后两个参数值的单位为一度的十六分之一。
下面的代码是图8.5(c)中绘制贝赛尔曲线的代码:
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing,
true);
QPainterPath path;
path.moveTo(80, 320);
path.cubicTo(200, 80, 320, 80, 480,
320);
painter.setPen(QPen(Qt::black, 8));
painter.drawPath(path);
通过连接基本图形元素,直线,椭圆,多段线,圆弧,二次和三次贝塞尔曲线等,QPainterPath类能确定任何矢量图形。因此,绘图路径(Painter
paths)是最基本的绘制元素,任何图形和图形的组合都可以同路径(path)表示。
一个路径能够确定一个轮廓,由这个轮廓确定的区域可以由刷子来填充。在图8.5(c)中我们没有设置刷子,因此只绘制了轮廓。
以上的三个例子都是使用了默认的刷子(Qt::SolidePattern,Qt::DiagCrossPattern,Qt::NoBrush)。在现在的应用程序中,单色填充已经很少使用,渐变色填充开始收到欢迎。渐变是依靠颜色的变化实现两种或者多种颜色之间平滑的过渡。渐变通常用来处理3D效果,如使用Plastique渐变方式来表现QPushButtons。
Qt支持三种类型的渐变:线形渐变,圆锥渐变和圆形渐变(linear, conical,
and radial)。下一节的OvenTimer例子就是在一个控件中使用了所有这三种渐变。
线形渐变由两个控制点和直线上的一系列颜色点组成。图8.6由下面的代码得到:在两个控制点之间,在三个不同的位置确定了三个不同的颜色值。位置有0到1的浮点数得到,0为第一个控制点,1为第二个控制点。不同位置点之间的颜色由差值计算得到。
LinearGradient gradient(50, 100, 300,
350);
gradient.setColorAt(0.0,
Qt::white);
gradient.setColorAt(0.2,
Qt::green);
gradient.setColorAt(1.0,
Qt::black);
Figure 8.6. QPainter's gradient brushes

圆形渐变由颜色组,圆心(xc,yc),半径r和焦点(xf,yf)定义。圆心和半径定义一个圆,颜色从焦点开始扩散到周围,焦点可以是圆心也可以是圆内的任意一个点。
圆锥渐变由圆心(xc,yc)和一个角度a定义。颜色从圆心开始像表的秒针一样扩散。
我们已经提到了QPainter的画笔,刷子和字体设置。此外,QPainter还有其他一些设置影响图形和文字的绘制:
1.
背景刷子,当背景模式为Qt::OpaqueMode(缺省值为Qt::transparentMode)时,背景刷子用来填充几何图形,文字,和位图的背景(在绘图刷子的下面)
2.
刷子的起点:刷子的起始绘制点,通常为控件的左上角。
3.
剪辑区域,剪辑区域为绘图设备上可以绘制的区域,在剪辑区域意外进行的绘制是无效的。
4.
视口,窗口,世界坐标:这三个决定了QPainter的逻辑坐标映射到物理坐标的方式。通常,逻辑坐标和物理坐标是重合的。坐标系统在下一节介绍。
5.
组合方式:组合方式决定绘制设备上新绘制的象素和已经存在的象素的影响方式。缺省方式为覆盖式(source
over),新象素画在已有元素的上面。只是有限一个绘图设备支持组合方式的设置,将在本章后面介绍
在任何时候,我们可以调用save()把QPainter当前的设置保存在一个内部栈里,然后调用restore()进行恢复。我们能够临时改变QPainter的一些设置,然后恢复先前的值。
本文详细介绍了QT中QPainter的使用,包括设置抗锯齿、画笔样式、画刷模式,以及如何绘制椭圆、扇形和贝塞尔曲线。通过实例展示了如何创建平滑边缘的图形,并探讨了渐变填充在3D效果中的应用,如线性、圆锥和圆形渐变。同时提到了背景刷子、剪辑区域、视口和组合方式等QPainter的其他设置。
3373

被折叠的 条评论
为什么被折叠?



