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