StupidBeauty
Read times:964Posted at:Mon Jan 27 01:43:32 2014
- no title specified

Qt®4的Ruby教程翻译:第10章:如丝般顺滑,Chapter 10: Smooth as Silk

Screenshot: Smooth as SilkScreenshot: Smooth as Silk


文件:

概述

在这个示例中,我们加入力道控制。

一行行地研究

cannon.rb

现在,CannonField中,除了角度值之外,还有了一个力道值。

signals 'angleChanged(int)', 'forceChanged(int)'

slots 'setAngle(int)', 'setForce(int)'

关于力道的接口与关于角度的接口是类似的。

def initialize(parent = nil)

super()

@currentAngle = 45

@currentForce = 0

setPalette(Qt::Palette.new(Qt::Color.new(250, 250, 200)))

setAutoFillBackground(true)

end

力道值@currentForce被初始化为0.

def setAngle(angle)

if angle < 5

angle = 5

elsif angle > 70

angle = 70

end

if @currentAngle == angle

return

end

@currentAngle = angle

update(cannonRect())

emit angleChanged(@currentAngle)

end

我们对setAngle()函数做了点小修改。它只会重绘本部件中包含着加农炮的那个区域。

def setForce(force)

if force < 0

force = 0

end

if @currentForce == force

return

end

@currentForce = force

emit forceChanged(@currentForce)

end

setForce()的实现与对setAngle()的实现非常类似。唯一的区别就是,我们不需要显示出力道值,因而就不需要重绘本部件。

def paintEvent(event)

painter = Qt::Painter.new(self)

painter.setPen(Qt::NoPen)

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

painter.translate(0, height())

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

painter.rotate(-@currentAngle)

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

painter.end()

end

我们就像第9章中一样地绘制。

def cannonRect()

result = Qt::Rect.new(0, 0, 50, 50)

result.moveBottomLeft(rect().bottomLeft())

return result

end

cannonRect()函数以部件本身的坐标值的形式返回包含着加农炮的矩形。首先我们创建一个尺寸为 50 x 50 的矩形,然后,移动这个矩形,以让它的左下角等于部件本身的左下角。

Qt::Widget::rect()函数会以该部件自身的坐标值的形式返回包含着该部件的矩形。矩形的左上角永远是(0, 0)。

t10.rb

构造函数几乎是与前一章相同,仅仅是加上了少量新代码。

force = LCDRange.new()

force.setRange(10, 50)

我们加入了第二个LCDRange,它可用来设置力道值。

connect(force, SIGNAL('valueChanged(int)'),

cannonField, SLOT('setForce(int)'))

connect(cannonField, SIGNAL('forceChanged(int)'),

force, SLOT('setValue(int)'))

我们就像之前对angle 部件所做的一样,将force部件和cannonField部件连接起来。

leftLayout = Qt::VBoxLayout.new()

leftLayout.addWidget(angle)

leftLayout.addWidget(force)

gridLayout = Qt::GridLayout.new()

gridLayout.addWidget(quit, 0, 0)

gridLayout.addLayout(leftLayout, 1, 0)

gridLayout.addWidget(cannonField, 1, 1, 2, 1)

gridLayout.setColumnStretch(1, 10)

在第9章中,我们将 angle 放置在布局中的左下角单元格里。现在,我们想在那个单元格里放置两个部件,于是,我们创建一个竖向的框框,将该框放置在网格布局里的那个单元格里,然后将 anglerange都放置在那个竖向的框框里。

force.setValue(25)

我们将力道值初始化为25。

运行程序

我们现在有个力道控制器了。

练习

让加农炮的炮筒尺寸随着力道值而改变。

将加农炮放置在右下角。

试着加入一个更好的键盘接口。例如,让+-分别用来增加及减小力道值,让回车键控制打炮。如果妳对向左方向键(Left)和向右方向键(Right)的行为也不满意的话,那么也修改一下它们吧。[提示:重写Qt::Widget::keyPressEvent()。]

[下一篇: 11章 ]

刚小希

Your opinions
Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands