2013-08-01 2 views
1

Q_D 매크로를 사용하여 파생 클래스에서 d- 포인터를 사용하고 싶습니다.qt 개인 클래스에서 불완전한 형식을 잘못 사용했습니다.

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); 
} 

에서 나는 D-포인터를 사용하고자하는 나는 방법을 쓰기 클래스를 파생 GraphicsDImg보기 :

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

howev 어 빌드 나에게

graphicsdimgview.h:128:11: error: forward declaration of ‘class GraphicsDImgView::GraphicsDImgViewPrivate’

In member function ‘bool Digikam::ImageRegionWidget::movingInProgress()’:...path.... error: invalid use of incomplete type ‘class GraphicsDImgView::GraphicsDImgViewPrivate’

나는 내가 잘못 어디로 갔는지 그래서 나도 몰라 정확히 문서를 다음에 다음과 같은 오류 메시지를 제공합니다. 어쩌면 내가 부주의한지도 모르겠다. 제 실수를 지적하겠습니다. 감사합니다 :)

+0

, 전체 코드를 보여주십시오. 'GraphicsDImgViewPrivate'의 선언과 포함 순서에 오류가있는 것으로 보입니다. 또한 ... 당신을위한 "속성"은 무엇입니까? –

+0

죄송합니다. 나는 그들을 바로 잡을 것입니다 ... – wceo

답변

3

샘플에서 실수를 바로 잡을 수 없습니다. 코드는 더러 우며 명확하지 않습니다. 나는 당신이 그러한 권고를받는 기사를 모른다. 나의 제안은 다음 방법으로 pimpl을하는 것입니다 :

에서 MyClass.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; 
}; 

인 MyClass.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; 
} 
+0

답변 해 주셔서 감사합니다! 나는 'MyClass (MyClassPrivate & dd, QObject * parent)'생성자가 선택적인지 아닌지 알고 싶다. 게다가, 나는 왜 당신이 Q_D (MyClass)를 사용하는 어떤 방법에서 d-> q_ptr을 사용했는지 알고 싶다. 대단히 고마워요 :) – wceo

+0

q_ptr은 private (매크로 Q_Q, Q_D와 비슷 함)에서 공용 클래스에 액세스하는 데 사용됩니다. 한 번에 초기화에 사용되었습니다. protected 생성자 -i는 서브 클래 싱을 위해이 방법으로 사용됩니다. "thanks"에는 "vote up"과 "accept"와 같은 특별한 버튼이 있습니다.) –

+0

나는 당신의 코드를 시험했으나, 아직은 운이 없다 ... 어딘가에 엉망이되어 버린 것 같습니다 ... – wceo

관련 문제