以QPushButton自带的信号QPushButton::clicked()和一个自定义槽函数cppSlot()为例:
补充:对于上图中第一种Qt 5的风格,如果遇到信号重载也有解决办法,而且十分推荐:
以QSpinBox控件为例:
它的 valueChanged 信号有两种重载
void valueChanged(int i)
void valueChanged(const QString &text)
如果直接使用Qt 5的风格进行connect的话会报错,因为信号重载导致编译器不知道绑定哪一个,所以给你报错,解决方法是函数指针的强转成指定类型再绑定:
// 以下例子在一个自定义的 MainWindow 类里进行,
// 且该类先假设有2个槽函数:
// void on_valueCanged_slot(int i)
// void on_valueCanged_slot_2(const QString &text)
// 这样写是错误的,因为信号有重载,编译器无法知道你绑定的是哪个信号
connect(ui->spinBox, &QSpinBox::valueChanged, this, &MainWindow::on_valueCanged_slot);
// 正确写法是这样:
// 先把函数指针转换成一个确定的重载类型
void (QSpinBox::* pQSpinBoxSignal)(int) = &QSpinBox::valueChanged;
// 再绑定
connect(ui->spinBox, pQSpinBoxSignal, this, &MainWindow::on_valueCanged_slot);
// 这样写也可以
connect(ui->spinBox, QOverload<int>::of(&QSpinBox::valueChanged), this, &MainWindow::on_valueCanged_slot);
// 或者:
connect(ui->spinBox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), this, &MainWindow::on_valueCanged_slot);
// 如果需要绑定 valueChanged(const QString &)信号,那么需要对应的槽函数(参数类型一致),槽函数也有重载的话就同样处理先转换成指定重载类型
connect(ui->spinBox, QOverload<const QString &>::of(&QSpinBox::valueChanged), this, &MainWindow::on_valueCanged_slot_2);
//或者:
connect(ui->spinBox, static_cast<void (QSpinBox::*)(const QString &)>(&QSpinBox::valueChanged), this, &MainWindow::on_valueCanged_slot_2);
// 如果使用Qt4的风格处理信号重载:
connect(ui->spinBox, SIGNAL(valueChanged(int)), this, SLOT(on_valueCanged_slot(int)));
connect(ui->spinBox, SIGNAL(valueChanged(const QString &)), this, SLOT(on_valueCanged_slot_2(const QString &)));
// Qt4风格由于不会对参数类型检测所以你写错了也可以编译通过,但不报错,有时会让人摸不着头脑,如下
connect(ui->spinBox, SIGNAL(valueChanged()), this, SLOT(on_valueCanged_slot()));//编译不报错但是毫无意义的代码