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*/

これは、private 実装オブジェクト ( PIMPL idiom ) が、対象となるオブジェクト (非 private QObject) について通知される場所です。これは、Qt とs (d_ptr)に関する情報への適切なリンクです。d pointer

Q_Qマクロは へのポインターを返すQObjectので、そこからシグナルを発することができます (とりわけ)。ビットに関しては、マクロはおよびマクロstatic_castによって作成されたクラスごとに異なるように定義されているため、安全です。結果は、常に正しい型にキャストされます。繰り返しますが、リンクを読むことをお勧めします。Q_DECLARE_PRIVATEQ_DECLARE_PUBLICstatic_cast

于 2012-04-18T04:33:37.103 に答える