Что приводит к неполным типам? (QGraphicsItem: Источник или цель имеет неполный тип)

У меня есть собственный QGraphicsItem, который (среди прочего) изменял курсор на открытую руку при нажатии, используя стандартную процедуру, описанную в документации Qt. Это работало нормально в течение последних двух недель или около того. Вчера я изменил несколько вещей в классе. Самое важное, что теперь я создаю подкласс непосредственно из QGraphicsPixmapItem вместо QGraphicsItem.

В какой-то момент я начал получать следующую ошибку (частично мой собственный перевод):

C664: Conversion of parameter 1 from 'Qt::CursorShape' to 'const QCursor &' not possible. Source or target has incomplete type.

Теперь я пытаюсь выяснить, почему мой предмет имеет неполный тип. К сожалению, я не могу отследить, когда именно эта проблема начала возникать. Измененный базовый класс был моей единственной догадкой, но я не мог придумать, как это могло быть причиной. После поиска ошибки я нашел примеры, когда члены класса были несколько плохо определены, но я не смог найти ошибку в моих объявлениях. Итак, вот Заголовок, на случай, если я что-то пропустил:

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

Если этот файл правильный, то есть ли общие проблемы, которые приводят к неопределенным типам, которые я могу проверить? Может быть, я даже ищу не в том месте?

Спасибо за ваше время, Луиза

Ответы на вопрос(2)

просто убедитесь, что вы включили класс & apos; верхний колонтитул в соответствующем файле кода (например,#include "itemsource.h").

In response to the edit: Если я уверен, что я правильно включил свои собственные заголовки и у меня все еще возникают неполные ошибки типа, то следующим шагом будет изменение#include <QGraphicsPixmapItem> для всего пакета Qt. Если нет четко обозначенной выгоды, я всегда предпочитаю включать пакет полностью. Это просто гарантирует, что внутренние зависимости этого пакета удовлетворены.

И наконец, в Qt 4.x кажется, что QGraphicsPixmapItem находится в QtGui, но был перемещен в QtWidgets в 5.x. Поэтому, если вы используете 4, попробуйте заменить#include <QGraphicsPixmapItem> с#include <QtGui> и на 5 попыток#include <QtWidgets>.

 Louise12 апр. 2012 г., 13:25
как объяснено в комментарии к ответу Фрэнка выше, я разделил вопросы. На этот вопрос уже был ответ - молниеносно! Я набираю медленный для этого сайта, по-видимому;). Это происходит в основном так же, как у вас. Тем не менее, вы можете добавить эту идею, чтобы обычно включать большие пакеты для тестирования, а затем работать там, где «отсутствующие включают» & quot; происходит.
 Louise11 апр. 2012 г., 18:23
Смотрите редактирование выше.
Решение Вопроса

What leads to incomplete types?

Когда вместо включения заголовочного файла, который определяет тип, вы добавляете строку:

class myclass;

Это Forward объявляет класс myclass, что означает, что для компилятора этоIncomplete type, С незавершенными типами, Нельзя создавать объекты этого или делать что-либо, что требует компилятора, чтобы знать расположение myclass больше, чем факт, что myclass - просто тип. Т.е.: компилятор не знает, каковы его члены и какова его структура памяти. Но поскольку указатели на все объекты требуют одинакового распределения памяти, вы можете использовать прямое объявление, когда просто ссылаетесь на незавершенный тип в качестве указателя.

Итак, короче говоря, вы можете объявить класс и затем выполнить некоторые операции, для которых компилятору необходимо знать макет этого класса, поскольку компилятор не знает его, следовательно, это ошибка.

 Louise12 апр. 2012 г., 13:15
который может быть решен с помощью ответа Styne666. Я надеюсь, что разделение этого пути в порядке (все еще плохо знакомый с SO;)). Я просто подумал, что ваш общий ответ будет полезен для других, в то время как моя конкретная проблема была более специфичной для qt.
 Louise12 апр. 2012 г., 13:13
@FrankOsterfeld: я забыл упомянуть, что уже проверил это, все объявленные вперед классы были по праву включены в реализацию. Сегодня я сделал минимальный тестовый пример, который не включает никаких предварительных деклараций. Я решил вернуть этот вопрос в исходное состояние и принять ваш ответ, чтобы он мог помочь другим (думаю, на этот конкретный вопрос уже был дан ответ, поэтому его также можно удалить). Я добавил новый вопрос с этой ошибкой в минимальном сценарииhere
 11 апр. 2012 г., 17:29
Я думаю, что стоит отметить, что предварительные декларации вместо заголовков - это хорошая вещь. Таким образом, предлагаемое решение должно быть: включить заголовок, который объявляет тип в .cpp, где вы получите ошибку.

Ваш ответ на вопрос