1

如题,为什么“q_ptr”指针被赋值给QObject的“this”指针?在源代码中。

QObject::QObject(QObjectPrivate &dd, QObject *parent)
: d_ptr(&dd)
{
>>Q_D(QObject);
>>d_ptr->q_ptr = this;/*question*/
.......

然后,当Q_Q()在源代码中使用宏时,如吹:

Q_Q(QWidget)

它将返回由函数 q_fun() 处理的 q 指针:

QWidget*q_func() {return static_cast<QWidget*>(q_ptr);}

众所周知,static_cast从父母传给孩子是不安全的。

我很沮丧/*question*/,有人能告诉我这个秘密吗?谢谢!

4

1 回答 1

2
d_ptr->q_ptr = this;/*question*/

这是私有实现对象(PIMPL idiom)被告知它正在为/使用的对象(非私有QObject)的地方。这是有关 Qt 和s (d_ptr)信息的一个很好的链接。d pointer

Q_Q宏返回指向 的指针QObject,因此您可以从它发出信号(除其他外)。至于static_cast位,这是安全的,因为宏对由Q_DECLARE_PRIVATEQ_DECLARE_PUBLIC宏创建的每个类的定义不同:结果static_cast总是转换为正确的类型。再次,我建议阅读链接。

于 2012-04-18T04:33:37.103 回答