• 信号函数没有返回值,且只是一个函数声明,必须有 signals: 声明
  • 槽函数的函数标签必须和信号函数相同(相同的返回值类型和形参列表)
  • Qt5 后成员函数也可作为 slots,可以不用 slots: 声明
  • slots: 声明前要添加访问权限修饰符
  • 信号函数和槽函数其实都可以被重载
    // signal 和 slots 都可以重载
    // Qt5的方式
    void(subWindow::*pFun1)() = &subWindow::showMainWindow;
    void(MainWindow::*pSlot1)() = &MainWindow::onShowMainWindow;
    connect(&sw, pFun1, this, pSlot1);
    void(subWindow::*pFun2)(int,QString) = &subWindow::showMainWindow;
    void(MainWindow::*pSlot2)(int,QString) = &MainWindow::onShowMainWindow;
    connect(&sw, pFun2, this, pSlot2);

    // Qt4的方式
    // 1. SIGNAL、SLOT宏会把信号和槽转成字符串,所以就不能进行编译期错误检查
    // 2. 槽函数前面必须有 slots 标签,否则无法识别为槽函数
    connect(&sw, SIGNAL(showMainWindow()), this, SLOT(onShowMainWindow()));
    connect(&sw, SIGNAL(showMainWindow(int,QString))
            , this, SLOT(onShowMainWindow(int,QString)));

    // Lambda 表达式
    void(subWindow::*pFun1)() = &subWindow::showMainWindow;
    connect(&sw, pFun1,
            [](){
                qDebug()<<"没有参数的信号";
            }
    );
    void(subWindow::*pFun2)(int,QString) = &subWindow::showMainWindow;
    connect(&sw, pFun2,
            [](int a, QString msg){
                qDebug()<<a<<msg;
            }
    );

    // Lambda 表达式使用注意事项
    // 如果b3是局部变量或者成员变量,lambda不要使用引用传值
    QPushButton *b3 = new QPushButton(this);
    b3->setText("Lambda");
    int a = 10, b = 100;
    connect(&b2/*b3*/, &QPushButton::clicked,
            [=](){                  // 此处使用 & 传值会有问题
                qDebug()<<a<<b;
            }
    );