Qt中的Connect( )函数的几种写法风格连接信号和槽,处理信号重载

这篇博客介绍了在Qt编程中如何处理信号重载的问题,以QSpinBox的valueChanged信号为例,提供了两种正确连接信号到槽函数的方法:通过函数指针强转和使用QOverload。同时,对比了Qt4和Qt5风格的connect函数在处理信号重载时的不同,强调了类型匹配的重要性,以避免编译错误。
摘要由CSDN通过智能技术生成

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()));//编译不报错但是毫无意义的代码


  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值