Correct us of d_ptr pattern



  • Hi
    I am developing a library and in Qt Tradition I want to use the d_ptr pattern.
    I have no previous experience of using this pattern and have a simple example working but wanted to check that my implementation is correct.
    To that end I have set out my classes below and would be grateful if anyone could confirm that my approach is correct(or not)

    Thanks

    Header file
    @
    #ifndef DISPLAYWIDGET_H
    #define DISPLAYWIDGET_H
    #include "DisplayWidgetsGlobal.h"
    #include <QWidget>

    class DisplayWidgetPrivate;

    class DISPLAYWIDGETS_EXPORT DisplayWidget : public QWidget
    {
    Q_OBJECT

    public:
    DisplayWidget(QWidget *parent);
    ~DisplayWidget();

    private:
    DisplayWidgetPrivate* d_ptr;
    Q_DECLARE_PRIVATE(DisplayWidget)
    };

    #endif // DISPLAYWIDGET_H
    @

    Private Header file
    @
    #include "DisplayWidget.h"

    class QLabel;
    class DisplayWidgetPrivate
    {
    public:
    DisplayWidgetPrivate (DisplayWidget* parent);
    void init();

    QLabel* m_label;
    DisplayWidget* const q_ptr;
    Q_DECLARE_PUBLIC(DisplayWidget)

    public:
    DisplayWidgetPrivate();
    };
    @

    Implementation file
    @
    #include <QLabel>
    #include "DisplayWidget.h"
    #include "DisplayWidget_p.h"

    DisplayWidgetPrivate::DisplayWidgetPrivate(DisplayWidget* parent)
    : q_ptr(parent)
    {

    }

    void DisplayWidgetPrivate::init()
    {
    m_label = new QLabel("This is a label",q_ptr);
    }

    DisplayWidget::DisplayWidget(QWidget *parent)
    : QWidget(parent),
    d_ptr(new DisplayWidgetPrivate(this))
    {
    Q_D(DisplayWidget);
    d->init();
    }

    DisplayWidget::~DisplayWidget()
    {

    }
    @


  • Moderators

    On a quick look, it looks good.



  • Thanks - good to hear



  • Hi,

    to read more about d-pointer you can see "here":qt-project.org/wiki/Dpointer.

    In your code I found only a problem, you don't have to define d_ptr and q_ptr because they are defined in QObject and QObjectPrivate classes; if you class inherits (directly or not) from QObject you don't have to define them.



  • Thanks mcosta
    But if I remove the declarations for q_ptr and d_ptr the compilation fails

    @
    DisplayWidget.cpp(11): error C2614: 'DisplayWidgetPrivate' : illegal member initialization: 'q_ptr' is not a base or member
    @



  • Hi,

    sorry MY ERROR , q_ptr is avalable only if your *Private Class inherits from QObjectPrivate.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.