Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';这些参数之间的区别是什么 我是C++新手,我正在学习QT._C++_Qt - Fatal编程技术网

什么';这些参数之间的区别是什么 我是C++新手,我正在学习QT.

什么';这些参数之间的区别是什么 我是C++新手,我正在学习QT.,c++,qt,C++,Qt,以这一行为例: connect(ui->horizontalSlider, &QSlider::valueChanged, ui->progressBar, &QProgressBar::setValue); 我不明白的是,为什么要传递静态(是静态的吗?)方法valueChanged(&QSlider::valueChanged)的地址,而不是当前对象方法地址&ui->horizontalsloider->valueChanged。尽管我也可以使用第

以这一行为例:

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

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

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

class MyClass
{
    void aFunction();
}
这里的
MyClass::aFunction
是一个成员函数

编译器创建的内容与此类似

class MyClass
{
    static void aFunction(MyClass *this);
}
因此,无论何时调用
aFunction
比如
my_instance.aFunction()
这个
指针都将被隐式传递,因此调用基本上变成
MyClass::aFunction(&my_instance)
。 因此,
a函数
的地址对于
MyClass
的每个实例都是相同的。 然而要执行
a函数
,您需要一个
MyClass
的实例

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

我所描述的是一种过于简单化的说法,所以对此持保留态度。
此外,当您使用虚拟函数时,情况会发生变化。

我相信这是Qt在应用程序周围分发异步事件的独特方式的一部分。您不会传递接收事件的对象,而是传递关联的方法。我现在猜,但我认为两者之间的区别在于Qt将在后台做一些额外的工作,从您提供的对象获取方法调用。它们不同于一般指针。