关于QT的一个小问题

时间:2022-02-05 17:35:08
.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。

6 个解决方案

#1


你这代码能不能全一点啊,看不懂
d是哪儿来的啊
d是个指针 d_ptr是对象

#2


肯定还有个地方定义了 d 
d是一个指向d_ptr的指针。
从->就可以猜出来。

#3


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;

#4


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

引用 3 楼 dext 的回复:
Q_D(UIMainControl); 宏

C/C++ code?123456#define Q_D(Class) Class##Private * const d = d_func() #define Q_DECLARE_PRIVATE(Class) \    inline Class##Private* d_func() { return reinterpret……

#5


这些和 Qt的历史有关。有的时候 研究Qt需要看考KDE的代码。
总的来说,d_ptr 是继承来的,指向的对象可能不是自己当前的类所需要的,需要转换一下。
例如,d_ptr在定义的时候 可能是 QWidgetPrivate
现在用的时候 需要让其成为 QLabelPrivate

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

#6


Qt有种机制。 public class 和 private class


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

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

#1


你这代码能不能全一点啊,看不懂
d是哪儿来的啊
d是个指针 d_ptr是对象

#2


肯定还有个地方定义了 d 
d是一个指向d_ptr的指针。
从->就可以猜出来。

#3


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;

#4


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

引用 3 楼 dext 的回复:
Q_D(UIMainControl); 宏

C/C++ code?123456#define Q_D(Class) Class##Private * const d = d_func() #define Q_DECLARE_PRIVATE(Class) \    inline Class##Private* d_func() { return reinterpret……

#5


这些和 Qt的历史有关。有的时候 研究Qt需要看考KDE的代码。
总的来说,d_ptr 是继承来的,指向的对象可能不是自己当前的类所需要的,需要转换一下。
例如,d_ptr在定义的时候 可能是 QWidgetPrivate
现在用的时候 需要让其成为 QLabelPrivate

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

#6


Qt有种机制。 public class 和 private class


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

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