如何在Qt中使用QGraphicsItem中的itemChange

Mak*_*mba 4 c++ qt qgraphicsitem

我有自定义椭圆QGraphicsItem类和自定义行类.在场景中我让我们说两个椭圆并用它们在它们之间建立连接.Ellipse有一个指向这一行的指针,可以移动.我的问题是,我不知道如何使用itemChange()QGraphicsItem.我想建立与椭圆运动一起改变的连接.所以我想用itemChange()方法改变线坐标,使其总是在椭圆的中心.我从QGraphicsItem :: itemChange()读取文档,但我不知道如何在我的情况下使用它.

Ant*_*nyG 6

正如其他人已经指出的那样,您需要覆盖(重新实现)类中的方法.

下面是一个完整的例子,证明了这一点:

#include "Dialog.h"
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsEllipseItem>
#include <QGraphicsLineItem>


class CustomElipse : public QGraphicsEllipseItem
{
public:
    CustomElipse (const QRectF& rect) : QGraphicsEllipseItem(rect) {
        setFlag(QGraphicsItem::ItemIsMovable);
        setFlag(QGraphicsItem::ItemSendsScenePositionChanges);
    }

    void addLine(QGraphicsLineItem *line, bool isPoint1) {
        this->line = line;
        isP1 = isPoint1;
    }

    QVariant itemChange(GraphicsItemChange change, const QVariant &value)
    {
        if (change == ItemPositionChange && scene()) {
            // value is the new position.
            QPointF newPos = value.toPointF();

            moveLineToCenter(newPos);
        }
        return QGraphicsItem::itemChange(change, value);
    }

    void moveLineToCenter(QPointF newPos) {
        // Converts the elipse position (top-left)
        // to its center position
        int xOffset = rect().x() + rect().width()/2;
        int yOffset = rect().y() + rect().height()/2;

        QPointF newCenterPos = QPointF(newPos.x() + xOffset, newPos.y() + yOffset);

        // Move the required point of the line to the center of the elipse
        QPointF p1 = isP1 ? newCenterPos : line->line().p1();
        QPointF p2 = isP1 ? line->line().p2() : newCenterPos;

        line->setLine(QLineF(p1, p2));
    }

private:
    QGraphicsLineItem *line;
    bool isP1;
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QGraphicsScene scene;

    CustomElipse *elipse1 = new CustomElipse(QRectF(30, 30, 15, 25));
    scene.addItem(elipse1);

    CustomElipse *elipse2 = new CustomElipse(QRectF(70, 70, 25, 15));
    scene.addItem(elipse2);

    QGraphicsLineItem *line = scene.addLine(QLineF(40, 40, 80, 80));

    elipse1->addLine(line, true);
    elipse2->addLine(line, false);

    QGraphicsView view(&scene);
    view.show();

    return a.exec();
}
Run Code Online (Sandbox Code Playgroud)

上面的代码绘制了两个可移动的elipses,在它们之间绘制了一条线.线位置调整为遵循elipses.

在运行时,你得到这样的东西: 预览的elipses和线