
Screenshot: Smooth as Silk
文件:
•. cannon.rb
•. t10.rb
•. lcdrange.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)。
构造函数几乎是与前一章相同,仅仅是加上了少量新代码。
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 放置在布局中的左下角单元格里。现在,我们想在那个单元格里放置两个部件,于是,我们创建一个竖向的框框,将该框放置在网格布局里的那个单元格里,然后将 angle和range都放置在那个竖向的框框里。
force.setValue(25)
我们将力道值初始化为25。
我们现在有个力道控制器了。
让加农炮的炮筒尺寸随着力道值而改变。
将加农炮放置在右下角。
试着加入一个更好的键盘接口。例如,让+和-分别用来增加及减小力道值,让回车键控制打炮。如果妳对向左方向键(Left)和向右方向键(Right)的行为也不满意的话,那么也修改一下它们吧。[提示:重写Qt::Widget::keyPressEvent()。]
刚小希
HxLauncher: Launch Android applications by voice commands