【Qt】信号和槽简介

        信号与槽是 Qt编程的基础,也是 Qt的一大创新。有了信号与槽的编程机制,在 Qt 中处理界面上各个组件的交互操作就变得比较直观和简单。

        信号(signal)是在特定情况下被发射的通知,例如QPushButton较常见的信号就是点击鼠标时发射的 clicked()信号。GUI程序设计的主要工作就是对界面上各组件的信号进行响应,只需要
知道什么情况下发射哪些信号,合理地去响应和处理这些信号就可以了。

        槽(slot)是对信号进行响应的函数。槽就是函数,所以也称为槽函数。槽函数与一般的 C++
函数一样,可以具有任何参数,也可以被直接调用。槽函数与一般的函数不同的是:槽函数可以与信号关联,当信号被发射时,关联的槽函数被自动运行。

        将信号和槽关联起来的函数时connect(),其声明如下:

connect(const QObject *sender, const char *signal,const QObject *receiver, 
        const char *member, Qt::ConnectionType = Qt::AutoConnection);

connect(const QObject *sender, const QMetaMethod &signal,const QObject *receiver,
        const QMetaMethod &method,Qt::ConnectionType type = Qt::AutoConnection);

connect(const QObject *sender, const char *signal,const char *member,
        Qt::ConnectionType type = Qt::AutoConnection) const;

        sender是发射信号的对象的名称;signal是信号,信号可以看作特殊的函数,需要带有括号,有参数时还需要指明各参数类型;receiver是接收信号的对象的名称;slot()是槽函数,需要带有括号,有参数时还需要指明各参数类型。关于信号与槽的使用,有以下一些规则需要注意:

        1、一个信号可以连接多个槽函数。

        2、多个信号可以连接同一个槽函数。

        3、一个信号可以连接另一个信号。

        4、信号与槽的参数个数和类型需要一致,至少信号的参数不能少于槽的参如果参数不匹配,会出现编译错误或运行错误。

        5、在使用信号与槽的类中,必须在类的定义中插入宏Q_OBJECT。

        6、当一个信号被发射时,与其关联的槽函数通常被立即运行,就像正常调用函数一样。只有当信号关联的所有槽函数运行完毕后,才运行发射信号处后面的代码。

    QPushButton *button1 = new QPushButton(this);
    button1->setText("按钮");
    //button1->setParent(this);
    button1->move(0,0);
    button1->resize(200,100);

    connect(button1,&QPushButton::clicked,this,&QWidget::close);

上述代码就是信号和槽的简单实例