2012-04-11 13 views
2

Qtドキュメントに記載されている標準的な手順を使用して、クリックしたときにカーソルを開いた手に変更したカスタムQGraphicsItemがあります。これは過去2週間ほどうまくいった。 昨日、クラス内でいくつか変更しました。最も重要なのは、QGraphicsItemの代わりにQGraphicsPixmapItemから直接サブクラス化することです。ことはできない '&のconst QCursor' に 'Qtの:: CursorShape' から、パラメータ1の変換:不完全なタイプの原因は何ですか? (QGraphicsItem:ソースまたはターゲットに不完全な型があります)

C664:

は、いくつかの時点で私は、次のようなエラー(一部翻訳)を取得するために始めました。ソースまたはターゲットに不完全な型があります。

ここで、アイテムに不完全な型がある理由を理解しようとします。残念ながら、この問題が発生し始めたときは、私はリトレースできません。変更された基本クラスは私の唯一の推測でしたが、どうしてこれが原因である可能性があるかについては考えられませんでした。エラーを見つけた後、私はクラスのメンバーが多少定義されていないサンプルを見つけましたが、私の宣言にエラーが見つかりませんでした。だから、私は何かを逃した場合には、ここでヘッダーは、次のとおりです。このファイルが正しい場合

#include <QGraphicsPixmapItem> 
class Collection; 
class ItemSource; 

class PhotoItem : public QGraphicsPixmapItem 
{ 
public: 
    PhotoItem(QString sourceFilePath, Collection *collection =0, QColor color =Qt::white, qreal size = 80.0); 

    enum Orientation { portrait, landscape }; 

    QPixmap content(); 
    bool hasContent(); 
    QColor color(); 

    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); 
    QRectF boundingRect() const; 

    void mousePressEvent(QGraphicsSceneMouseEvent *event); 
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event); 
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); 
    void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); 

private: 
    qreal _size; 
    Orientation _orientation; 
    QPixmap _content; 
    QColor _color; 
    Collection *_collection; 
    ItemSource *_source; 
}; 

を、そして私がチェックアウトすることができ、未定義の型につながる任意の一般的な問題があるのですか?たぶん私は間違った場所で検索していますか?不完全型につながるどのようなお時間を

おかげで、 ルイーズ

答えて

9

代わりにタイプを定義するヘッダファイルを含めての、あなたが行を追加します。

class myclass; 

それフォワードは、それが不完全タイプあるコンパイラ手段MyClassクラスを宣言します。 Incomplete型では、myclassが単なる型であるという事実よりも、myclassのレイアウトを知るために、オブジェクトのオブジェクトを作成したり、コンパイラを必要とするものを作成することはできません。すなわち、コンパイラはメンバーが何であるか、そのメモリレイアウトが何であるかを知らない。 しかし、すべてのオブジェクトへのポインタは同じメモリ割り当てを必要とするだけなので、ポインタとしてIncomplete型を返すだけで、前方宣言を使用できます。

要するに、クラスを宣言し、そのクラスのレイアウトを知るためにコンパイラに必要な操作を実行します。コンパイラはエラーを知りません。

+1

ヘッダの代わりに前方宣言が良いことを指摘する価値はあると思います。だから、提案された解決策は、次のようにする必要があります。エラーが発生した場所の.cppに型を宣言するヘッダーを含めます。 –

+0

@FrankOsterfeld:私はこれをすでにチェックしたことを忘れていました。すべての前方宣言されたクラスは、実装に正当に含まれていました。今日は最小のテストケースを作成しましたが、これには前方宣言は含まれていません。私はこの質問を元の状態に戻し、あなたの答えを受け入れることにしました。それは他の人に役立つかもしれません(私はこの特定の質問が以前に答えられているので、削除することもできます)。私は最小のシナリオでこのエラーで新しい質問を追加しました[ここ](http://stackoverflow.com/questions/10122219/weird-incomplete-type-error-in-a-qqraphicsitem) – Louise

+0

これはStyne666の解答で解決することができます。私は、この方法でそれを分割することはOKです(まだSOの新しい;))。私はあなたの一般的な答えが他の人に役立つと思っていましたが、私の特定の問題はqt固有のものでした。 – Louise

2

ヘッダーには通常前方一致宣言がありますが、上部の対応するコードファイルにクラスのヘッダーを含めてください(例:#include "itemsource.h")。編集に対応して

私は私が正しく自分のヘッダを含めましたし、私はまだ不完全な型エラーを取得しています確信している場合は、次のステップは、全体のQtパッケージの#include <QGraphicsPixmapItem>を変更することです。はっきりと識別できる利益がない限り、私はいつもパッケージを完全に含めることを薦める。そのパッケージの内部の依存関係が満たされていることを確認します。

最後に、Qt 4.xではQGraphicsPixmapItemはQtGuiにありますが、5.xではQtWidgetsに移動されています。したがって、4を使用している場合は、を#include <QtGui>に、5を試してみて#include <QtWidgets>としてみてください。

+0

上記の編集をご覧ください。 – Louise

+0

フランクの答えに対するコメントで説明したように、私は質問を分割しました。その1つに既に答えがありました - 雷が速い!私は明らかにこのウェブサイトのために遅くすることをタイプしている;)。基本的にはあなたと同じです。しかし、そのアイデアを追加して、一般にテスト用の大きなパッケージを含めることができます。また、「欠落しているインクルード」が発生する場所まで作業することもできます。 – Louise

関連する問題