05_自定义信号和槽

来源:互联网 发布:unity3d 联网 编辑:程序博客网 时间:2024/05/16 05:12

    1) 信号的定义必须在signals:保留字下,并且不需要实现
    2)槽的定义必须在slots:保留字下,需要实现
    3)信号和槽通过QObject::connect函数连接
    4)当信号被触发时,槽函数被调用

    需要注意的是:
    1)信号和槽,是QT的拓展,所以实现信号和槽的类,必须是QObject 的子类
    2)实现信号和槽的类,必须以宏Q_OBJECT开始
    3)连接信号和槽,要用到SIGNAL和SLOT宏,转换函数为字符串
    4)一个信号可以和多个槽连接,槽函数调用的顺序是不确定的
    5)多个信号可以同时连接一个槽
    6)信号可以连接信号,形成信号传导
    7)信号和槽的参数应该一样多,而且类型必须相同
    8)信号和槽都可以重载
    9)信号和槽都可以有默认参数
    10)槽函数可以像普通函数一样被调用
    11)在槽函数中,调用sender可以获得信号调用者

    总结下:
    一个类:QObject
    三个宏:Q_OBJECT SIGNAL SLOT
    三个保留字:signals, slots, emit

    /***FileName:main.cpp*/#include "myslot.h"#include "mysignal.h"    MySignal sig ;int main(int argc, char *argv[]){    QApplication a(argc, argv);    MySlot slot ;    QObject::connect( &sig , SIGNAL( sig() ) , &slot , SLOT(slot()) ) ;    QPushButton button("button") ;    QObject::connect( &button , &QPushButton::clicked , [&](){        emit sig.sig() ;        } ) ;    button.show( );    return a.exec();}
    /***FileName:MySlot.cpp*/#pragma once#include "qobject.h"#include "MyButton.h"class MySlot:public QObject{    Q_OBJECTpublic:    explicit    MySlot(QObject *parent = 0):QObject(parent) {}    ~MySlot() {}signals:public slots:    void slot()  {        qDebug()<<"myslot";    }};
    /***FileName:MySignal*/#include "qobject.h"#include "MyButton.h"class MySignal:public QObject{    Q_OBJECTpublic:    explicit        MySignal(QObject *parent = 0):QObject(parent){}    ~MySignal() {}signals:    void sig() ;public slots:} ;
    原创粉丝点击