3

私はカスタムQGraphicsItemを持っています。これは、Qtのドキュメントで説明されている標準的な手順を使用して、クリックするとカーソルを開いた手に変更します。これは過去2週間ほどは問題なく機能しました。昨日、クラス内でいくつか変更しました。最も重要なことは、QGraphicsItemではなくQGraphicsPixmapItemから直接サブクラス化することです。

ある時点で、私は次のエラーを受け取り始めました(部分的に私自身の翻訳):

C664:パラメータ1を「Qt ::CursorShape」から「constQCursor&」に変換できません。ソースまたはターゲットのタイプが不完全です。

私は今、私のアイテムが不完全なタイプである理由を理解しようとしています。残念ながら、この問題が発生し始めた時期をさかのぼることはできません。変更された基本クラスは私の唯一の推測でしたが、これがどのように原因であるかを実際に考えることはできませんでした。エラーをグーグルで調べた後、クラスのメンバーがやや不明確な例を見つけましたが、宣言にエラーは見つかりませんでした。だから、私が何かを逃した場合に備えて、ここにヘッダーがあります:

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

このファイルが正しい場合、チェックアウトできる未定義の型につながる一般的な問題はありますか?たぶん私は間違った場所を探していますか?

お時間をいただきありがとうございます、ルイーズ

4

2 に答える 2

10

不完全型の原因は何ですか?

型を定義するヘッダー ファイルをインクルードする代わりに、次の行を追加します。

class myclass;

クラス myclass を Forward 宣言します。これは、コンパイラにとってIncomplete typeであることを意味します。不完全な型では、そのオブジェクトを作成したり、コンパイラが myclass が単なる型であるという事実以上に myclass のレイアウトを知る必要があることを行うことはできません。つまり、コンパイラは、そのメンバーとそのメモリ レイアウトが何であるかを知りません。ただし、すべてのオブジェクトへのポインターは同じメモリ割り当てを必要とするため、不完全な型をポインターとして参照するだけの場合は、前方宣言を使用できます。

要するに、クラスを前方宣言してから、コンパイラがそのクラスのレイアウトを知る必要があるいくつかの操作を実行しています。コンパイラはそれを認識していないため、エラーが発生します。

于 2012-04-11T15:10:49.803 に答える
2

前方宣言は通常、ヘッダーで問題ありません。クラスのヘッダーが上部の対応するコードファイルに含まれていることを確認してください(例#include "itemsource.h")。

編集への応答:自分のヘッダーを正しく含めても、不完全なタイプエラーが発生する場合は、次のステップは#include <QGraphicsPixmapItem>Qtパッケージ全体を変更することです。明確に識別できる利点がない限り、私は常にパッケージを完全に含めることを好みます。そのパッケージの内部依存関係が満たされていることを確認するだけです。

そして最後に、Qt 4.xではQGraphicsPixmapItemはQtGuiにあるように見えますが、5.xではQtWidgetsに移動されています。したがって、4を使用している場合は、に置き換え #include <QGraphicsPixmapItem>てみて#include <QtGui>ください。5の場合は試してください#include <QtWidgets>

于 2012-04-11T15:16:16.893 に答える