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(&QSlider::valueChanged),
        spinbox,
        &QSpinBox::setValue);

实际上就是一个函数指针类型的转化。


关于信号与槽新语法的详细介绍可以看这里:Qt 学习之路 2(16):深入 Qt5 信号槽新语法

你可能感兴趣的:(C/C++)