001 信号重载
【Qt5解决方案】
应该用函数指针去解决这个问题
例如:
QSpinBox 的信号
两种使用函数指针的方式:
QSpinBox * spin = new QSpinBox(this);
QSlider * slider = new QSlider(Qt::Horizontal,this);
void (QSpinBox::* testSignal)(int) = &QSpinBox::valueChanged;
connect(spin,testSignal,slider,&QSlider::setValue);
还有一种
QSpinBox * spin = new QSpinBox(this);
QSlider * slider = new QSlider(Qt::Horizontal,this);
connect(spin,static_cast<void (QSpinBox::*)(int)>
(&QSpinBox::valueChanged),slider,&QSlider::setValue);
【Qt4解决方案】
编写代码的时候:
会有选项告诉你让你选哪个
connect(spin,SIGNAL(valueChanged(int)),slider,SLOT(setValue(int)));
Qt4也有其局限性
1. 槽函数必须添加约束
public slots:
public slots: // 槽函数====
void myslot();
// 槽函数和信号是对应的,因为信号没有返回值,槽函数没有返回值,
// 信号如果有参数,槽函数就可以有参数
void changeWin();
2. SIGNAL函数是一种字符串转换函数,假设信号名写错了,例如上面
connect(spin,SIGNAL(valueChd(int)),slider,SLOT(setValue(int)));
这里编译期间并不会报错,只在运行期间报错,告诉我们找不到valueChd
说到信号与槽
信号必须通过关键字声明
signals:
//信号必须有这个关键字,来声明
// 信号没有返回值。,但可以有参数
// 信号就是函数的声明,只需要声明,不需要定义
void mySignal();
使用这个信号的时候,是通过
emit mySignal();