Как правильно получить / наследовать от QGraphicsLineItem? - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь создать собственный QGraphicsLineItem под названием Edge, но у меня это плохо получается. Я новичок в Qt. На данный момент я не могу, например, выполнить scene->add(edgeItem) без ошибок, нет жизнеспособного преобразования из 'Edge' в 'QGraphicsItem *'.

My edge.h

#ifndef EDGE_H
#define EDGE_H

#include <QWidget>
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsItem>


class Edge:public QGraphicsLineItem
{
private:
    QGraphicsEllipseItem * state1;
    QGraphicsEllipseItem * state2;

public:
    enum { Type = UserType + 2 };
    int type() const override;
    Edge(QGraphicsEllipseItem * s1, QGraphicsEllipseItem* s2);

    QGraphicsEllipseItem *getState1() const;
    void setState1(QGraphicsEllipseItem *value);
    QGraphicsEllipseItem *getState2() const;
    void setState2(QGraphicsEllipseItem *value);


     QList<QPointF> centerPoints();

};

#endif // EDGE_H

Мой край. cpp

#include "edge.h"
#include <QGraphicsEllipseItem>

Edge::Edge(QGraphicsEllipseItem* s1, QGraphicsEllipseItem* s2)
{
    setState1(s1);
    setState2(s2);
    setFlag(QGraphicsItem::ItemIsMovable);
    setFlag(QGraphicsItem::ItemSendsScenePositionChanges);
    setFlag(QGraphicsItem::ItemIsSelectable);

}

int Edge::type() const
{
    return Type;
}

QGraphicsEllipseItem *Edge::getState1() const
{
    return state1;
}

void Edge::setState1(QGraphicsEllipseItem *value)
{
    state1 = value;
}

QGraphicsEllipseItem *Edge::getState2() const
{
    return state2;
}

void Edge::setState2(QGraphicsEllipseItem *value)
{
    state2 = value;
}



QList<QPointF> Edge::centerPoints()
{

            QPointF point1(state1->rect().x() + state1->rect().width()/2,state1->rect().y()+ state1-> rect().height()/2);
            QPointF point2(state2->rect().x()+state2->rect().width()/2,state2->rect().y()+ state2-> rect().height()/2);

            QList<QPointF> list;
            list.append(point1);
            list.append(point2);

            return list;

}

Может ли кто-нибудь показать мне, как я могу изменить свой Edge, чтобы он стал «настоящим» QGraphicsItem?

Ответы [ 2 ]

2 голосов
/ 20 июня 2020

вот пример правильного наследования

поэтому .h

 class Edge: public QGraphicsLineItem
    {
    public:
        Edge(QGraphicsEllipseItem * s1 = nullptr, QGraphicsEllipseItem* s2= nullptr, QGraphicsItem* parent = nullptr);
        //.....
    
    };

и .cpp

Edge::Edge(QGraphicsEllipseItem * s1, QGraphicsEllipseItem* s2, QGraphicsItem* parent) 
    :QGraphicsLineItem( parent)
{
 //.........
}
0 голосов
/ 21 июня 2020

При создании экземпляра класса Edge сделайте это следующим образом.

Edge* someinstance = new Edge(); 
scene->addItem(someinstance);

Я предполагаю, что вы делаете именно так.

Edge instance;
scene->addItem(instance);

Итак, компилятор пытается неявно преобразовать объект Edge в QGraphicsItem * объект, который невозможно.

...