• 9463阅读
  • 0回复

【摘录】《KDE2/Qt编程金典》第四章:显示弹出式对话框——4.3 创建信号和slot的工作步骤清单 [复制链接]

上一主题 下一主题
离线XChinux
 

只看楼主 倒序阅读 楼主  发表于: 2005-09-15
  创建信号和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);
    ...

  3、包含定义了就要发送信号的类的头文件。
  4、编写代码创建将要发送信号的类的实例。只有这个实例存在,才能把slot和信号联系起来。
  5、把slot和信号连接起来。这项工作通常在构造函数中完成,但如果这个对象构造得比较晚,那么连接工作也可以晚些做。调用connect()方法将把你的slot加入到方法列表中,每当指定的信号发出时,这个方法就会被调用。像下面这样调用connect():

    connect(sender, SIGNAL(newName(QString &), this, SLOT(nameChange(QString &)));

 前两个参数指定信号的来源,后两个参数指定目标slot。宏SIGNAL()和SLOT()都需要完整的方法原型,原型必须遵循,用来调用一种方法的参数必须和个该种方法可以使用的参数保持一致。
  无论何时使用emit发送信号,就好像是你的程序直接调用每一个slot方法一样。也就是说,直到slot方法返回,你的重新才能继续执行。由此,通常应当保持在slot方法内部的处理过程尽可能的简单,这样才不会中止信号的发送。发送信号的可能是用户接口过程,操作过程表现得比较慢或者迟缓。
  必须当心不要创建死循环。如果一个slot方法发送了一个信号,此信号直接或者间接地执行了发送一个信号的方法,而这个信号又被最初的信号接收,那么信号持续调用slot,你的程序也将崩溃了。
  还需要当心slot和信号方法在连接语句中的参数是否匹配。当程序是,直到常识去解决这一问题时才可能得到出错信息。为了避免这种情况,必须确定每次增加内容时都进行测试,或者改变slot和信号部分。唯一的出错信息是当connect()方法找不到匹配对象时输出一个写到控制台上的字符串——此后,程序就忽略了这个只有从命令行运行程序时才能看到控制台输出。
[ 此贴被XChinux在2005-09-15 10:33重新编辑 ]
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
快速回复
限100 字节
 
上一个 下一个