当前位置: 代码迷 >> QT开发 >> 关于QT的一个小疑点
  详细解决方案

关于QT的一个小疑点

热度:80   发布时间:2016-04-25 04:06:06.0
关于QT的一个小问题
.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

引用:
那么d这个是不是指向d_ptr的指针
能不能帮我大体说一下Q_D到底有什么作用,我在网上看了一下,没怎么看懂

------解决方案--------------------
Qt有种机制。 public class 和 private class


一个public class有一个d指针。指向private class。private class会根据每个平台不同。实现不一样。

我们在平时用到的Qt api就是public class..private class需要跟踪源码才能看到。
  相关解决方案