什么导致类型不完整? (QGraphicsItem:源或目标具有不完整类型)

时间:2012-04-11 15:06:41

标签: c++ qt qgraphicsitem incomplete-type

我有一个自定义QGraphicsItem,其中(除其他外)使用Qt文档中描述的标准过程将光标更改为单击时打开的手。这在过去两周左右的时间里运作良好。 昨天,我在课堂上改变了一些东西。最重要的是,我现在直接从QGraphicsPixmapItem继承而不是QGraphicsItem。

在某些时候我开始收到以下错误(部分是我自己的翻译):

  

C664:将参数1从'Qt :: CursorShape'转换为'const   QCursor&'不可能。来源或目标的类型不完整。

我现在试图弄清楚为什么我的项目有不完整的类型。不幸的是,当这个问题开始发生时,我无法回溯。改变后的基类是我唯一的猜测,但我真的想不出这是怎么回事。在谷歌搜索错误之后,我找到了一些示例,其中类的成员有些不明确,但我在声明中找不到错误。所以,这是标题,万一我错过了一些东西:

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

如果这个文件是正确的,那么是否有任何常见的问题导致我可以查看未定义的类型?也许我甚至在错误的地方寻找?

谢谢你的时间, 路易丝

2 个答案:

答案 0 :(得分:9)

什么导致类型不完整?

当不包括定义类型的头文件时,添加以下行:

class myclass;

It Forward声明了类myclass,这意味着对于编译器来说,它是不完整类型。对于不完整的类型,我不能创建它的对象或做任何需要编译器知道myclass布局的事情,而不是myclass只是一个类型。即:编译器不知道它的成员是什么以及它的内存布局是什么。 但由于指向所有对象的指针只需要相同的内存分配,因此只需将不完整类型作为指针进行处理即可使用前向声明。

简而言之,您正在声明一个类,然后执行一些需要编译器知道该类布局的操作,因为编译器不知道它因此错误。

答案 1 :(得分:2)

您的标题中的转发声明通常很好,只需确保您在顶部的相应代码文件中包含该类标题(例如#include "itemsource.h")。

响应编辑:如果我确定我已经正确地包含了自己的标题,而且我仍然会收到不完整的类型错误,那么下一步就是更改{{1}对于整个Qt包。除非有明确的可识别的好处,否则我总是倾向于完全包括该包装。它只是确保满足该包的内部依赖性。

最后,在Qt 4.x中,QGraphicsPixmapItem出现在QtGui中,但已被移出到5.x中的QtWidgets。因此,如果您使用4,请尝试将#include <QGraphicsPixmapItem>替换为#include <QGraphicsPixmapItem>,然后尝试将#include <QtGui>替换为#include <QtWidgets>