
Screenshot: One Thing Leads to Another
文件:
•. lcdrange.rb
•. t7.rb
这个示例,演示的是,如何创建出带有信号和信号槽的自定义部件,以及如何以更复杂的形式将它们连接起来。现在,我们第一次将源代码分开放置在不同文件中。
这个文件主要是从第6章中山寨过来的;这里只列出那些比较大的改变。
signals 'valueChanged(int)'
slots 'setValue(int)'
def value()
@slider.value()
end
def setValue(value)
@slider.setValue(value)
end
这些代码就创造出了本部件与程序中其它组件之间的一个接口。此前,LCDRange根本就没有一个真正的接口。
value()是一个公有函数,用于访问这个LCDRange 对象的值,setValue()是我们的第一个自定义信号槽,valueChanged()是我们的第一个自定义信号。
信号槽必须按照常规的方式来实现(一个信号槽同时也是一个Ruby成员函数)。信号是自动实现的。信号与受保护的(protected)Ruby 函数具有相同的访问权限(也就是说,只能由那些定义了它们的类或者那些类的子类来发射信号)。
当LCDRange 的值发生改变时,就会发射valueChanged()信号。
value()的实现是狠直观的。它就直接返回滑动器的值。
setValue()的实现也狠直观。注意,因为滑动器和液晶显示器数字部件是已经连接起来的,所以,当妳设置滑动器的值的时候,会自动更新液晶显示器数字部件的值。另外,如果滑动器的值超出了它所允许的范围,则会自动调整回来。
connect(@slider, SIGNAL('valueChanged(int)'),
lcd, SLOT('display(int)'))
connect(@slider, SIGNAL('valueChanged(int)'),
self, SIGNAL('valueChanged(int)'))
第一个QObject::connect()调用就跟妳在前一章中看到的一样。第二句是新代码;它将滑动器的QAbstractSlider::valueChanged()信号连接到这个对象本身的valueChanged()信号。是的,妳没看错。信号可与其它信号连接起来。当第一个信号被发射时,第二个信号会跟着被发射。
让我们看一看,当用户对滑动器做出操作时会怎么样。滑动器发现自己的值发生改变了,于是就发射QAbstractSlider::valueChanged()信号。那个信号已经被连接到Qt::LCDNumber的QLCDNumber::display()信号槽和LCDRange 的valueChanged()信号。
因此,当那个信号被发射时,LCDRange会发射它自身的valueChanged()信号。另外,Qt::LCDNumber::display()被调用并且显示出新的数字值。
注意,无法确保两段代码之间的执行顺序;LCDRange::valueChanged()可能会在Qt::LCDNumber::display()被调用之前或者之后被发射。(☯:从Qt4.6开始,是按照连接的顺序来执行的了,这篇教程的作者所用的Qt4版本是Qt4.2,所以说是无序的)
previousRange = nil
for row in 0..2
for column in 0..2
lcdRange = LCDRange.new()
grid.addWidget(lcdRange, row, column)
unless previousRange.nil?
connect(lcdRange, SIGNAL('valueChanged(int)'),
previousRange, SLOT('setValue(int)'))
end
previousRange = lcdRange
end
end
当我们创建这9个 LCDRange对象时,我们使用 信号和信号槽机制来连接它们。每个对象的 valueChanged()信号都被连接到前一个对象的setValue()信号槽。因为 LCDRange 会在它的值改变时发射 valueChanged() 信号,所以,我们这里实际上创建了一个由信号和信号槽构成的信息传递链。
刚启动时,这个程序的界面会与前一章中的那个一样。试着拖动一下右下角那个滑动器。
使用右下角的滑动器来将所有液晶显示器的值设置为50。然后在底部中央的滑动器的左侧把柄上单击一下,以将除了最后一个液晶显示器以外的那些液晶显示器都设置成40。现在,使用左下角的滑动器来将前7个液晶显示器的值重新设置为50。
单击右下角滑动器左侧的把柄。结果如何?为什么妳看到的是正确的行为呢?
未知美人
未知美人
HxLauncher: Launch Android applications by voice commands