Qt 信号和槽
信号函数没有返回值,且只是一个函数声明,必须有 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; } );