我在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示例中看到的内容,并且该示例对我而言没有意义。
感谢您的帮助!
答案 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
插槽也一样。
最后, 我希望能解决您的一些问题。