为什么将“q_ptr”指针赋给QObject的“this”指针?

时间:2012-04-18 04:20:40

标签: qt

与标题一样,为什么将“q_ptr”指针赋给QObject的“this”指针?在源代码中。

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

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

Q_Q(QWidget)

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

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

众所周知,static_cast从父母转为子女时是不安全的。

我对/*question*/感到非常沮丧,任何人都可以告诉我这个秘密吗?谢谢!

1 个答案:

答案 0 :(得分:2)

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

这是私有实现对象(PIMPL idiom)被告知它正在为其工作的对象(非私有QObject)。有关Qt和d pointer s(d_ptr)的信息,请Here's a good link

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