1

我想借助 Q_D 宏在派生类中使用 d 指针。

这是我的父类:

class DIGIKAM_EXPORT GraphicsDImgView : public QGraphicsView
{
    Q_OBJECT

public:
    class GraphicsDImgViewPrivate;

protected:
    GraphicsDImgViewPrivate* const d_ptr;

protected:
    Q_DECLARE_PRIVATE(GraphicsDImgView)
};

和我的 GraphicsDImgViewPrivate 类:

class GraphicsDImgView::GraphicsDImgViewPrivate
{
public:

    GraphicsDImgViewPrivate()
    {
        scene            = 0;
        item             = 0;
        layout           = 0;
        cornerButton     = 0;
        panIconPopup     = 0;
        movingInProgress = false;
        showText         = true;
    }

    QGraphicsScene*           scene;
    GraphicsDImgItem*         item;
    SinglePhotoPreviewLayout* layout;

    QToolButton*              cornerButton;
    KPopupFrame*              panIconPopup;

    QPoint                    mousePressPos;
    QPoint                    panningScrollPos;
    bool                      movingInProgress;
    bool                      showText;
};

GraphicsDImgView::GraphicsDImgView(QWidget* const parent)
    : QGraphicsView(parent), d_ptr(new GraphicsDImgViewPrivate)
{
    Q_D(GraphicsDImgView);
    d->scene  = new QGraphicsScene(this);
    d->scene->setItemIndexMethod(QGraphicsScene::NoIndex);

    setScene(d->scene);
    d->layout = new SinglePhotoPreviewLayout(this);
    d->layout->setGraphicsView(this);
}

派生类中,我编写了一个方法,我想在其中使用 GraphicsDImgView 的 d 指针:

bool ImageRegionWidget::movingInProgress()
{
    Q_D(GraphicsDImgView);
    return d->movingInProgress;
}

但是构建给了我以下错误消息

在成员函数'bool Digikam::ImageRegionWidget::movingInProgress()':...path....错误:无效使用不完整类型'class GraphicsDImgView::GraphicsDImgViewPrivate'</p>

graphicsdimgview.h:128:11:错误:'class GraphicsDImgView::GraphicsDImgViewPrivate'的前向声明</p>

我完全按照文档进行了操作,所以我不知道我哪里出错了。也许是我不小心。请帮我指出我的错误。谢谢 :)

4

1 回答 1

3

我无法纠正您样本中的错误。代码很脏而且不清楚。我不知道文章,你从哪里得到这样的建议。我的建议是用下一种方式做 pimpl:

我的类.h

class MyClassPrivate;
class MyClass
    : public QObject
{
Q_OBJECT
public:
  explicit MyClass(QObject *parent = 0);
~MyClass()
protected:
  MyClassPrivate * const d_ptr;
  MyClass(MyClassPrivate &dd, QObject * parent);
private:
  Q_DECLARE_PRIVATE(MyClass);
};

MyClass_p.h

#include "myclass.h"

class MyClassPrivate
{
  Q_DECLARE_PUBLIC(MyClass);
public:
  MyClassPrivate();
  virtual ~MyClassPrivate();

  MyClass * q_ptr;
};

我的类.cpp

#include "myclass.h"
#include "myclass_p.h"

MyClassPrivate::MyClassPrivate()
{}

MyClassPrivate::~MyClassPrivate()
{}

MyClass::MyClass(QObject *parent)
  :QObject(parent)
  ,d_ptr(new MyClassPrivate())
{
  Q_D(MyClass);
  d->q_ptr = this;
}

MyClass::MyClass(MyClassPrivate &dd, QObject * parent)
  :QObject(parent)
  ,d_ptr(&dd)
{
  Q_D(MyClass);
  d->q_ptr = this;
}

MyClass::~MyClass()
{
  Q_D(MyClass);
  delete d;
}
于 2013-08-01T13:39:31.267 回答