Qt5中信号与槽新语法

Qt5中引入了一种新的信号与槽的语法,旧的语法仍然可用。

举例说明

如果我们将一个QSlider对象的valueChanged信号链接到一个QSpinBox对象的setValue槽,使用传统方式:

connect(slider, SIGNAL(valueChanged(int)), spinbox, SLOT(setValue(int)));

而使用新语法:

connect(slider, &QSlider::valueChanged, spinbox, &QSpinBox::setValue);

新语法的优点

  1. 编译期:检查信号与槽是否存在,参数类型检查,Q_OBJECT是否存在
  2. 信号可以和普通的函数、类的普通成员函数、lambda函数连接(而不再局限于信号函数和槽函数)
  3. 参数可以是 typedef 的或使用不同的namespace specifier
  4. 可以允许一些自动的类型转换(即信号和槽参数类型不必完全匹配)

注意

新语法中,信号与槽都是函数指针。但是,如果信号或者槽的函数有重载函数,那么就不能直接用函数名了,可以声明一个函数指针,用来区分到底是重载函数中的哪一个。

void (QSlider::*valueChangeInt)(int) = &QSlider::valueChanged;
connect(slider, valueChangedInt, spinbox, &QSpinBox::setValue);

也可以把这两行写在一起,实际上就是一个函数指针类型的转化:

connect(slider,
    static_cast<void (QSlider:: *)(int)>(&QSlider::valueChanged),
    spinbox,
    &QSpinBox::setValue);

关于信号与槽新语法的详细介绍可以看这里