我是 C++ 新手,正在学习 Qt。
考虑这一行:
connect(ui->horizontalSlider, &QSlider::valueChanged,
ui->progressBar, &QProgressBar::setValue);
我不明白的是为什么你传递的是一个静态(是静态的吗?)方法valueChanged(&QSlider::valueChanged
)的地址,而不是当前对象的方法地址&ui ->horizontalSlider->valueChanged
。尽管我可以使用同样有效的第二个选项。
最佳答案
您传递应调用的成员函数的地址。 成员函数不是静态的,这意味着它需要一个对象才能工作。
class MyClass
{
void aFunction();
}
这里 MyClass::aFunction
是一个成员函数。
编译器创建的和这个类似
class MyClass
{
static void aFunction(MyClass *this);
}
所以每当你像my_instance.aFunction()
那样调用aFunction
时,this
指针就会被隐式传递,所以调用基本上变成了MyClass::aFunction(&my_instance)
。
因此,aFunction
的地址对于 MyClass
的每个实例都是相同的。
然而,要执行 aFunction
,您需要 MyClass
的实例。
这就是为什么在你的情况下你必须提供 connect
实例 ui->horizontalSlider
以及要在其上调用的函数 &QSlider: :valueChanged
.
我所描述的过于简单化,因此请对它持保留态度。 此外,当您拥有虚函数时,情况就会发生变化。
关于c++ - 这些参数有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28515298/