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_OBJECTpublic:
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()
{}
@ -
On a quick look, it looks good.
-
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.