为什么这个Qt示例使用地址而不是对象和函数本身?还没有SLOT / SIGNAL关键字吗?

时间:2019-06-10 15:04:08

标签: c++ qt signals signals-slots qt-signals

我在Qt文档中遇到了以下代码:

Counter a, b;

QObject::connect(&a, &Counter::valueChanged,

                 &b, &Counter::setValue);

a.setValue(12);     // a.value() == 12, b.value() == 12
b.setValue(48);     // a.value() == 12, b.value() == 48

为什么在a和b以及函数之前有一个&? a是发射对象(提供信号),b是接收对象(具有插槽),那么为什么要在这里获取其地址,而不是仅仅使用对象本身(如果我不使用,则使用对象的地址)错误)?在其他Qt示例中,它不是这样的(未使用地址,对象本身是)

在函数调用之前,我不太确定&的工作方式(即Counter :: valueChanged和Counter :: setValue)...我认为这迫使它们通过引用返回,但是我不确定在这里很重要。

最后,为什么没有SLOT和SIGNAL关键字?它不是SIGNAL(Counter :: valueChanged)和SLOT(Counter :: setValue)吗?再次,这就是我在其他QObject:connect示例中看到的内容,并且该示例对我而言没有意义。

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

看看这个:

Counter a, b; // objects created on the stack, they are not pointers

// get the addresses of the objects and assign them as pointers.
Counter *aPointer = &a;
Counter *bPointer = &b;

以下内容将不会编译,因为a和b不是指针,并且QObject connect期望指向从QObject继承的类的实例的指针。

QObject::connect(a, &Counter::valueChanged, b, &Counter::setValue);

以下内容将编译,因为您提供了指针:

QObject::connect(aPointer, &Counter::valueChanged, bPointer, &Counter::setValue);

类似地,这也是可行的,因为您采用了对象的地址(即指针):

QObject::connect(&a, &Counter::valueChanged, &b, &Counter::setValue);

希望可以在对象之前解释。然后,函数名称前有&'s 。这是指向成员函数的指针的语法:

&Counter::valueChanged 

在类名(Counter)后面加上::和成员函数名(valueChanged),在之前加上&

在这种情况下,它是作为第一个参数提供的指针的成员。这称为信号。 Qt在后台将它们一起调用。

QObject *sender = &a;
std::function<void()> signal = std::bind(&Counter::valueChanged,sender);
...
signal(); // the function is called here

插槽也一样。

最后,

我希望能解决您的一些问题。