与标题一样,为什么将“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*/
感到非常沮丧,任何人都可以告诉我这个秘密吗?谢谢!
答案 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_PRIVATE
和Q_DECLARE_PUBLIC
宏创建的每个类,宏的定义不同:结果是,static_cast
总是在转换到正确的类型。我再次建议阅读链接。