这些参数之间有什么区别

时间:2015-02-14 11:44:56

标签: c++ qt

我是C ++的新手,我正在学习Qt。

考虑这一行:

connect(ui->horizontalSlider, &QSlider::valueChanged,
        ui->progressBar, &QProgressBar::setValue);

我不明白为什么你传递静态(是静态?)方法valueChanged(&QSlider::valueChanged)而不是当前对象方法地址&ui->horizontalSlider->valueChanged的地址。虽然我可以使用第二个选项也可以。

1 个答案:

答案 0 :(得分:1)

您传递应该调用的成员函数的地址。 但成员函数不是静态的,这意味着它需要一个对象来处理。

class MyClass
{
    void aFunction();
}

此处MyClass::aFunction是成员函数。

编译器创建的内容与此

类似
class MyClass
{
    static void aFunction(MyClass *this);
}

因此,只要您像aFunction一样调用my_instance.aFunction()this指针就会被隐式移交,因此呼叫基本上变为MyClass::aFunction(&my_instance)。 因此,对于aFunction的每个实例,MyClass的地址都相同。 但要执行aFunction,您需要一个MyClass的实例。

这就是为什么在您的情况下,您必须为connect提供实例ui->horizontalSlider以及要在其上调用的函数&QSlider::valueChanged

我所描述的是过于简单化,所以要把它当作一粒盐。 此外,当您拥有虚拟功能时,事情会发生变化。