Archive:Development/Tutorials/Qt4 Ruby Tutorial/Chapter 09 (zh CN)

From KDE TechBase
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Template:I18n/Language Navigation Bar (zh CN)

Template:TutorialBrowser (zh CN)

With Cannon You Can

档案:

概览

在这个范例中,我们来绘制一个可爱小巧的蓝色加农炮。只有 cannon.rb 不同于前面的章节。

一行一行的浏览

cannon.rb

def paintEvent(event)
  painter = Qt::Painter.new(self)

我们现在开始要认真的使用 Qt::Painter。我们建立了一个操作这个 widget 的 painter。

painter.setPen(Qt::NoPen)

Qt::Painter 使用笔触(pen)来绘制出边缘(edge)。这里我们将它设定为 Qt::NoPen。这意味着当我们绘制东西时,将不会有明确的边缘。

painter.setBrush(Qt::Brush.new(Qt::blue))

Qt::Painter 要填充矩形、圆形,或其他图形时,它会使用笔刷(Brush)来填充形状。这里我们把它设定为使用纯蓝色笔刷。(我们也可以用调色盘。)蓝色的画笔会填满直到我们画出东西的边缘。

painter.translate(0, rect().height())

Qt::Painter::translate() 函式转移(translate)了 Qt::Painter 的坐标系统(也就是说,藉由偏移量(offset)移动它)。在这里,我们设定 widget 的左下角为(0,0)。x 和 y 的方向维持不变,即所有在 widget 内的 y 坐标现在都是负的。(更多关于 Qt 坐标系统的信息,请见坐标系统。)

painter.drawPie(Qt::Rect.new(-35, -35, 70, 70), 0, 90 * 16)

Qt::Painter::drawPie() 函式使用起始角度以及弧长,在指定的矩形内画出圆饼的形状。角度单位为十六分之一度。零度位在3点钟方向。绘画方向是逆时针。这里我们在 widget 的左下角画出四分之一圆。圆饼填充了蓝色,而且没有边框。

painter.rotate(-@currentAngle)

Qt::Painter::rotate() 函式绕着原点旋转 Qt::Painter 的坐标系统的。旋转参数要给出度数(不是上面的十六分之一度),并且是顺时针方向。这里我们逆时针旋转坐标系统 @currentAngle 度。

painter.drawRect(Qt::Rect.new(30, -5, 20, 10))

Qt::Painter::drawRect() 函式画出指定的矩形。这里我们画出加农炮的炮管。

当坐标系统像上面这样经过转换(转移、旋转、缩放,或修剪)后,通常很难想象画出的结果。

在这种情况下,坐标系统首先是转移和旋转。如果矩形 Qt::Rect.new(30, -5, 20, 10) 被画在转移过的坐标系统,它看起来像是这样:

请注意,矩形会被 CannonField widget 的边界修剪。当我们旋转坐标系统,例如60度,矩形将绕着(0,0),也就是左下角旋转。因为我们已经转移了坐标系统。结果看起来像这样:

执行应用程序

当 slider 操作时,画出的加农炮角度也会跟着改变。

练习

设定一枝不同的笔触,代替 Qt::NoPen。设定一枝调色盘笔刷。