标题:【摘录】《KDE2/Qt编程金典》第四章:显示弹出式对话框——4.3 创建信号和slot的工作步骤清单
作者:XChinux
日期:2005-09-15 10:19
内容:
创建信号和slot的工作是相当的简单的,大多数的工作都自动由宏和MOC编译器完成了。发送信号的过程和slot接受信号的过程完全分离开来。一个对象可以发送人影信号 而不必知道到底发了多少,不管信号的数目有多大,slot都可以接收。下面详细总结了创建一个信号并把它发送出去所需要做的所有工作步骤:
1、在类定义的第一种行加入Q_OBJECT宏。类中的其它项都需要一个分号终止符,而Q_OBJECT却不需要,但如果你喜欢,也可以加上分号(因为编译器在处理时根本不考虑分号)。例如,可以像下面这样开始,定义类Rceiver:
class Sender {
Q_OBJECT
...
在一个类中可以定义任意数目的slot和信号,但Q_OBJECT只需要出现一次。
2、向类定义中加入信号的原型。例如,如果信号就要发送一个字符串对象作为参数,那么原型大致像下面这样:
...
signals:
void newName(QString &name);
...
上面的代码中没有公有或者私有的说明,这是因为并没有实际的方法——这只是一个原型定义,用来调用接收的slot。
3、使用发送语句来调用所有监听这个信号的方法。这一步骤使用的语法和用来调用一个局部方法的语法是一样的,只不过这时用emit关键字开头:
QString name;
emit newName(name);
值得注意的是,并没有关于信号方法实体的实际定义,emit命令并不寻找局部的方法;相反,它调用已经连接到此信号的slot列表中的所有slot。
下面是创建一个slot并把它和信号想连接的必需的步骤:
1、和信号一样,slot需要在类定义的上部加入Q_OBJECT宏:
class Receiver {
Q_OBJECT
...
2、向类定义中加入slot方法的原型。这个原型必须和它就要接收的信号一样(也就是说,具有同样的一套参数)。由于slot是方法,在作为slot使用的同时,也可以被直接调用,slot方法可以设置成公共属性。
...
public slots:
void nameChange(QString &name);
...
更常见的是,slot的目的仅仅是接收信号,这时你可以将它设置成私有的:
...
private slots:
void nameChange(QString &name);
  ..