QGraphicsItem :: toGraphicsObject()在由QGraphicsPixmapItem派生的自己的类中返回0

时间:2012-07-25 12:47:32

标签: c++ linux qt qgraphicsitem

目前我正试图从我自己的QGraphicsView中获取项目:QObject和:QGraphicsPixmapItem。所以我在我的场景中添加了2个项目,现在我希望这些项目使用QList <QGraphicsItem*>以另一种方法将它们删除,但遗憾的是它不能很好地运行,QGraphicsItem::toGraphicsObject()返回0。

所以我在Qt-Reference-Documentation中找到了这个描述:

QGraphicsObject * QGraphicsItem::toGraphicsObject ()

Return the graphics item cast to a QGraphicsObject, if the class is actually a
graphics object, 0 otherwise.

因为我想要为项目设置动画,我想从itemList获取内容,并希望setTargetObject获取myAnimation。但是这个方法需要QGraphicsObject,所以我需要将其转换为。希望我的源代码能说明一点:

- A.h -

class A : public QObject, public QGraphicsPixmapItem
{
    Q_OBJECT
    Q_PROPERTY (QPointF pos READ pos WRITE setPos)

public:
    A()
    {
        setTransformationMode (Qt::SmoothTransformation);
    }

    QPointF itemPos;
};

- A.cpp -

void A::method()
{
    QList <QGraphicsItem*> itemList = myGraphicsView -> items();

    QGraphicsObject *test = itemList.at (0) -> toGraphicsObject();

    qDebug() << test; // <-- QGraphicsObject(0)

    myAnimation -> setTargetObject (test);
    myAnimation -> setPropertyName ("pos");
    myAnimation -> setStartValue (QPointF (0, 100));
    myAnimation -> setEndValue (QPointF (60, 100));

    myAnimation -> start();
}

1 个答案:

答案 0 :(得分:2)

首先,QGraphicsObject本身就是一个特定的类。您无法从QObject和任何QGraphicsItems创建新类,并将其用作QGraphicsObject。这两者甚至不在同一个类层次结构中。所以你不能把一个扔到另一个。

其次,setTargetObject需要QObject,而不是QGraphicsObject。因此,您可以通过以下方式获取对象,即QObject

A *test = dynamic_cast<A*>(itemList.at(0));

setTargetObject很乐意接受它。