gpt4 book ai didi

c++ - 如何在 Qt 中使用 QGraphicsItem 的 itemChange

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:35:38 29 4
gpt4 key购买 nike

我有自定义椭圆 QGraphicsItem 类和自定义线类。在现场,我假设有两个椭圆和它们之间用一条线连接起来。 Ellipse 有一个指向这条线的指针并且是可移动的。我的问题是我不知道如何使用 QGraphicsItem 中的 itemChange()。我想建立会随着椭圆运动而变化的联系。所以我想使用 itemChange() 方法来更改线坐标,使其始终位于椭圆的中心。我阅读了来自 QGraphicsItem::itemChange() 的文档但我不知道如何在我的案例中使用它。

最佳答案

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

下面是一个完整的示例来证明这一点:

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

上面的代码绘制了两个可移动的椭圆,在它们之间画了一条线。线条位置会调整以跟随省略号。

运行时,你会得到这样的东西: Preview of elipses and line

关于c++ - 如何在 Qt 中使用 QGraphicsItem 的 itemChange,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32192607/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com