StupidBeauty
Read times:935Posted at:Thu Jan 23 21:52:37 2014
- no title specified

Qt®4的Ruby教程翻译:第7章:一件事将引发另一件事,Chapter 7: One Thing Leads to Another

Screenshot: One Thing Leads to AnotherScreenshot: One Thing Leads to Another


文件:

概述

这个示例,演示的是,如何创建出带有信号和信号槽的自定义部件,以及如何以更复杂的形式将它们连接起来。现在,我们第一次将源代码分开放置在不同文件中。

一行行地分析

lcdrange.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::LCDNumberQLCDNumber::display()信号槽和LCDRange valueChanged()信号。

因此,当那个信号被发射时,LCDRange会发射它自身的valueChanged()信号。另外,Qt::LCDNumber::display()被调用并且显示出新的数字值。

注意,无法确保两段代码之间的执行顺序;LCDRange::valueChanged()可能会在Qt::LCDNumber::display()被调用之前或者之后被发射。(☯:从Qt4.6开始,是按照连接的顺序来执行的了,这篇教程的作者所用的Qt4版本是Qt4.2,所以说是无序的

t7.rb

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

单击右下角滑动器左侧的把柄。结果如何?为什么妳看到的是正确的行为呢?

[下一篇 8章 ]

未知美人

未知美人

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

HxLauncher: Launch Android applications by voice commands