Archive:Development/Tutorials/Qt4 Ruby Tutorial/Chapter 09 (zh CN)
Template:I18n/Language Navigation Bar (zh CN)
Template:TutorialBrowser (zh CN)
With Cannon You Can
档案:
概览
在这个范例中,我们来绘制一个可爱小巧的蓝色加农炮。只有 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。设定一枝调色盘笔刷。