.cpp文件中
//QScopedPointer<UIMainControlPrivate> d_ptr; .h文件中
d_ptr.reset(new UIMainControlPrivate(GetUIONSList(),
GetPopupList()));
Singleton<UIKeyTranslator>::create();
UIKeyTranslatorInst.onInitialize();
UIKeyManagerInst.setTranslator(&UIKeyTranslatorInst);
Q_D(UIMainControl);
d->m_controllersManager.onInitialize();//这里的d其实就是d_ptr,这个我不怎么明白
麻烦谁熟悉QT的能不能告诉我为什么这里的d由d_ptr对象变成了d。
qt c++
------解决方案--------------------
你这代码能不能全一点啊,看不懂
d是哪儿来的啊
d是个指针 d_ptr是对象
------解决方案--------------------
肯定还有个地方定义了 d
d是一个指向d_ptr的指针。
从->就可以猜出来。
------解决方案--------------------
Q_D(UIMainControl); 宏
#define Q_D(Class) Class##Private * const d = d_func()
#define Q_DECLARE_PRIVATE(Class) \
inline Class##Private* d_func() { return reinterpret_cast<Class##Private *>(qGetPtrHelper(d_ptr)); } \
inline const Class##Private* d_func() const { return reinterpret_cast<const Class##Private *>(qGetPtrHelper(d_ptr)); } \
friend class Class##Private;
------解决方案--------------------
这些和 Qt的历史有关。有的时候 研究Qt需要看考KDE的代码。
总的来说,d_ptr 是继承来的,指向的对象可能不是自己当前的类所需要的,需要转换一下。
例如,d_ptr在定义的时候 可能是 QWidgetPrivate
现在用的时候 需要让其成为 QLabelPrivate
------解决方案--------------------
Qt有种机制。 public class 和 private class
一个public class有一个d指针。指向private class。private class会根据每个平台不同。实现不一样。
我们在平时用到的Qt api就是public class..private class需要跟踪源码才能看到。