为什么这个Qt示例使用的是地址而不是对象和函数本身?没有插槽/信号关键字?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (11)

我在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&在a和b之前,在函数之前?A是发射对象(提供信号),b是接收对象(有插槽),那么为什么它们的地址在这里而不是仅使用对象本身(如果我没有弄错的话,获取对象的地址)?在其他Qt示例中,它不是这样的(没有使用地址,对象本身是这样的)

I'm not too sure how the & before the function calls (i.e. Counter::valueChanged and Counter::setValue) work...I think it forces them to return by reference, but I'm not sure how that's important here.

Lastly, why is it that there are not SLOT and SIGNAL keywords? Shouldn't it be SIGNAL(Counter::valueChanged) and SLOT(Counter::setValue)? Again, that's what I've seen in other examples of QObject:connect, and this example isn't making sense to me.

Any help is appreciated!

提问于
用户回答回答于

看这个:

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);

这有希望解释对象之前。然后是函数名称之前的。它是指向成员函数的指针的语法:

&Counter::valueChanged 

附加了::和成员函数名(valueChanged)的类名(Counter)前面带有&

它是指针的成员,在这种情况下作为第一个参数提供。这个被称为信号。在引擎盖下,Qt将它们召集在一起。

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

插槽也是如此。

最后,使用SIGNAL()和SLOT()宏<Qt 5.0。所以它已被弃用,不应再使用了。在一些罕见的情况下,您仍然应该使用它,因为没有其他选择,例如使用QtDBus,但这是另一个主题。

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

扫码关注云+社区

领取腾讯云代金券