
[上一篇: Qt Jambi教程6 - 构建丰富的方块 !( Building Blocks Galore! )][Qt Jambi教程]
代码 :
这个示例展示的是如何创建拥有信号和信号槽的自定义部件,以及如何用更复杂的方式将它们连接起来。
这个文件主要是从第6 章中的BlocksGalore 修改过来的;在这里只说那些重要的改动 。
现在,除了构造函数之外,LCDRange 类还包含3个成员。在一个程序中 ,它们组成咯这个部件与其它组件之间的接口。直到现 在, LCDRange才真正拥有咯一个应用编程接口。我们 会在代码中碰到它们的时候研究它们。
这个类的大部分与第6 章中的那个LCDRange 是相同的,在这里只看作咯改变的地方 。
quit.setFont(new QFont("Times", 18, QFont.Weight.Bold.value()));
我们加上咯一个私有的变量,它记录着显示出来的数字。
public final Signal1<Integer> valueChanged = new Signal1<Integer>();
在这里我们声明我们的第一个自定义的信号: valueChanged 。每当LCD 的值改变时 ,我们就会发射它。一个信号是某 个信号类的一个实例,信号类包括Signal1、Signal2 ... Signal9。后缀的数字是指这个信号的参数的个数;参数的类型必须是通用的类 。我们想使用 1个参数(LCD 的值) ,所以我们使用Signal1 类和Integer。你已经知道如何与信号连接起来咯 。这个信号可以连接到任何以一个Integer 作为参数的方法。
我们接下来看构造函数:
public LCDRange()
{
...
slider.valueChanged.connect(lcd, "display(int)");
slider.valueChanged.connect(valueChanged);
...
}
我们将滑标的valueChanged 信 号连接到我们的display()信号槽以及我们自己的valueChanged 信号。你所连接的信号会由被连接到的信号触发。
让我们仔细地看看,当用户操作滑标时会发生什么。滑标发 现自己的值改变咯 ,于是发射 QSlider .valueChanged 信号。那个信号同时连接到咯 QLCDNumber .display()信 号槽和 LCDRange 的 valueChanged 信号。
所以,当这个信号被发射的时候, LCDRange也发射它自己的valueChanged 信号。另外,QLCDNumber.display() 被调用,于是显示出新数字。
注意,你不能确保任何特定的执行顺序; LCDRange.valueChanged可能会在QLCDNumber.display() 被调用之前或者之后发射。
public int value()
{
return value;
}
value()的实现是很直观 的。它简单地返回滑标的值。
public void setValue(int value)
{
slider.setValue(value);
}
setValue()的实现也 是很直观的。注意,由于滑标和 LCD 数字是连接上咯的 ,所以设置滑标的值会自 动地更新 LCD 的数字。另外,如果滑标的值超出咯它的允许范围,它会自动调整 。
ConnectedSlider 类 是从前一章的BlocksGalore 复制过来的,只是构造函数不同。我们来看看所作的改动:
LCDRange previousRange = null;
for (int row = 0; row < 3; ++row) {
for (int column = 0; column < 3; ++column) {
LCDRange lcdRange = new LCDRange();
grid.addWidget(lcdRange, row, column);
if (previousRange != null)
lcdRange.valueChanged.
connect(previousRange, "setValue(int)");
previousRange = lcdRange;
}
}
当我们创建这9个 LCDRange 对象时,我们使用 信号和信号槽 机制将它们连接起来。每个对象的 valueChanged 信号都与前一个对象的 setValue() 信号槽连接起来。 因为 LCDRange 会在它的值发生改变的时候发射 valueChanged 信号,所 以我们在这里就创建咯一个信号与信号槽的链 。
刚启动时,这个程序与前一个的外观是完全相同的。试试操 作一下右下角的滑标。
使用右下角的滑标将全部LCD的值设置成50。然后通过 点击上一行对应的那个滑标来将上面 6个LCD的值设置成30。现在,使用刚才操作过 的那个滑标左边的滑标来将前 5个LCD的值恢复成50。
点击右下角的滑标的滑块的左侧。发生咯什么?为什么这是 正确的行为?
[上一篇: Qt Jambi教程6 - 构建丰富的方块 !( Building Blocks Galore! )][Qt Jambi教程]
代码 :
这个示例展示的是如何创建拥有信号和信号槽的自定义部件,以及如何用更复杂的方式将它们连接起来。
这个文件主要是从第6 章中的BlocksGalore 修改过来的;在这里只说那些重要的改动 。
现在,除了构造函数之外,LCDRange 类还包含3个成员。在一个程序中 ,它们组成咯这个部件与其它组件之间的接口。直到现 在, LCDRange才真正拥有咯一个应用编程接口。我们 会在代码中碰到它们的时候研究它们。
这个类的大部分与第6 章中的那个LCDRange 是相同的,在这里只看作咯改变的地方 。
quit.setFont(new QFont("Times", 18, QFont.Weight.Bold.value()));
我们加上咯一个私有的变量,它记录着显示出来的数字。
public final Signal1<Integer> valueChanged = new Signal1<Integer>();
在这里我们声明我们的第一个自定义的信号: valueChanged 。每当LCD 的值改变时 ,我们就会发射它。一个信号是某 个信号类的一个实例,信号类包括Signal1、Signal2 ... Signal9。后缀的数字是指这个信号的参数的个数;参数的类型必须是通用的类 。我们想使用 1个参数(LCD 的值) ,所以我们使用Signal1 类和Integer。你已经知道如何与信号连接起来咯 。这个信号可以连接到任何以一个Integer 作为参数的方法。
我们接下来看构造函数:
public LCDRange()
{
...
slider.valueChanged.connect(lcd, "display(int)");
slider.valueChanged.connect(valueChanged);
...
}
我们将滑标的valueChanged 信 号连接到我们的display()信号槽以及我们自己的valueChanged 信号。你所连接的信号会由被连接到的信号触发。
让我们仔细地看看,当用户操作滑标时会发生什么。滑标发 现自己的值改变咯 ,于是发射 QSlider .valueChanged 信号。那个信号同时连接到咯 QLCDNumber .display()信 号槽和 LCDRange 的 valueChanged 信号。
所以,当这个信号被发射的时候, LCDRange也发射它自己的valueChanged 信号。另外,QLCDNumber.display() 被调用,于是显示出新数字。
注意,你不能确保任何特定的执行顺序; LCDRange.valueChanged可能会在QLCDNumber.display() 被调用之前或者之后发射。
public int value()
{
return value;
}
value()的实现是很直观 的。它简单地返回滑标的值。
public void setValue(int value)
{
slider.setValue(value);
}
setValue()的实现也 是很直观的。注意,由于滑标和 LCD 数字是连接上咯的 ,所以设置滑标的值会自 动地更新 LCD 的数字。另外,如果滑标的值超出咯它的允许范围,它会自动调整 。
ConnectedSlider 类 是从前一章的BlocksGalore 复制过来的,只是构造函数不同。我们来看看所作的改动:
LCDRange previousRange = null;
for (int row = 0; row < 3; ++row) {
for (int column = 0; column < 3; ++column) {
LCDRange lcdRange = new LCDRange();
grid.addWidget(lcdRange, row, column);
if (previousRange != null)
lcdRange.valueChanged.
connect(previousRange, "setValue(int)");
previousRange = lcdRange;
}
}
当我们创建这9个 LCDRange 对象时,我们使用 信号和信号槽 机制将它们连接起来。每个对象的 valueChanged 信号都与前一个对象的 setValue() 信号槽连接起来。 因为 LCDRange 会在它的值发生改变的时候发射 valueChanged 信号,所 以我们在这里就创建咯一个信号与信号槽的链 。
刚启动时,这个程序与前一个的外观是完全相同的。试试操 作一下右下角的滑标。
使用右下角的滑标将全部LCD的值设置成50。然后通过 点击上一行对应的那个滑标来将上面 6个LCD的值设置成30。现在,使用刚才操作过 的那个滑标左边的滑标来将前 5个LCD的值恢复成50。
点击右下角的滑标的滑块的左侧。发生咯什么?为什么这是 正确的行为?
HxLauncher: Launch Android applications by voice commands