我是C ++的新手,我正在学习Qt。
考虑这一行:
connect(ui->horizontalSlider, &QSlider::valueChanged,
ui->progressBar, &QProgressBar::setValue);
我不明白为什么你传递静态(是静态?)方法valueChanged(&QSlider::valueChanged
)而不是当前对象方法地址&ui->horizontalSlider->valueChanged
的地址。虽然我可以使用第二个选项也可以。
答案 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
。
我所描述的是过于简单化,所以要把它当作一粒盐。 此外,当您拥有虚拟功能时,事情会发生变化。