Qt5中信号与槽新语法
Qt5中引入了一种新的信号与槽的语法,旧的语法仍然可用。
举例说明
如果我们将一个QSlider对象的valueChanged信号链接到一个QSpinBox对象的setValue槽,使用传统方式:
connect(slider, SIGNAL(valueChanged(int)), spinbox, SLOT(setValue(int)));
而使用新语法:
connect(slider, &QSlider::valueChanged, spinbox, &QSpinBox::setValue);
新语法的优点
- 编译期:检查信号与槽是否存在,参数类型检查,Q_OBJECT是否存在
- 信号可以和普通的函数、类的普通成员函数、lambda函数连接(而不再局限于信号函数和槽函数)
- 参数可以是 typedef 的或使用不同的namespace specifier
- 可以允许一些自动的类型转换(即信号和槽参数类型不必完全匹配)
注意
新语法中,信号与槽都是函数指针。但是,如果信号或者槽的函数有重载函数,那么就不能直接用函数名了,可以声明一个函数指针,用来区分到底是重载函数中的哪一个。
void (QSlider::*valueChangeInt)(int) = &QSlider::valueChanged;
connect(slider, valueChangedInt, spinbox, &QSpinBox::setValue);
也可以把这两行写在一起,实际上就是一个函数指针类型的转化:
connect(slider,
static_cast<void (QSlider:: *)(int)>(&QSlider::valueChanged),
spinbox,
&QSpinBox::setValue);
关于信号与槽新语法的详细介绍可以看这里。