QGraphicsItem::toGraphicsObject() возвращает 0 в собственном классе, производном от QGraphicsPixmapItem

На данный момент я пытаюсь получить элементы из моего собственного 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, поэтому мне нужно преобразовать его в. Надеюсь, мой исходный код говорит немного больше:

-- А.ч --

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();
}

person user1533754    schedule 25.07.2012    source источник


Ответы (1)


Прежде всего, QGraphicsObject сам по себе является особым классом. Вы не можете создать новый класс из QObject и любого из QGraphicsItems и использовать его как QGraphicsObject. Эти двое даже не находятся в одной иерархии классов. Таким образом, вы не можете бросить одно на другое.

Во-вторых, setTargetObject принимает QObject, а не QGraphicsObject. Таким образом, вы можете получить свой объект, который является QObject, таким образом:

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

setTargetObject с радостью примет его.

person Stephen Chu    schedule 25.07.2012