StupidBeauty
Read times:1292Posted at:Thu Feb 17 04:39:21 2011

Qt Jambi4.4.3文档翻译:Qt Jambi教程7 - 环环相扣Qt Jambi Tutorial 7 - One Thing Leads to Another

[上一篇 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 的值改变时 ,我们就会发射它。一个信号是某 个信号类的一个实例,信号类包括Signal1Signal2 ... 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 Jambi4.4.3文档翻译:Qt Jambi教程7 - 环环相扣Qt Jambi Tutorial 7 - One Thing Leads to Another

[上一篇 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 的值改变时 ,我们就会发射它。一个信号是某 个信号类的一个实例,信号类包括Signal1Signal2 ... 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。

点击右下角的滑标的滑块的左侧。发生咯什么?为什么这是 正确的行为?

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

HxLauncher: Launch Android applications by voice commands