gpt4 book ai didi

c++ - 缩放 View 时如何保持QGraphicsItem的大小和位置?

转载 作者:太空狗 更新时间:2023-10-29 21:36:23 26 4
gpt4 key购买 nike

我在 QGraphicsScene 中有一些 QGraphicsItems,它们在缩放时应该保持相同的大小和位置。我试过 QGraphicsItem::ItemIgnoresTransformations 但事实证明这些项目的位置错误。下面是一个示例代码:

我像这样子类化了 QGraphicsView:

class Graphics : public QGraphicsView
{
public:
Graphics();
QGraphicsScene *scene;
QGraphicsRectItem *rect;
QGraphicsRectItem *rect2;

protected:
void wheelEvent(QWheelEvent *event);
};

在它的构造函数中:

Graphics::Graphics()
{
scene = new QGraphicsScene;
rect = new QGraphicsRectItem(100,100,50,50);
rect2 = new QGraphicsRectItem(-100,-100,50,50);
scene->addLine(0,200,200,0);

rect->setFlag(QGraphicsItem::ItemIgnoresTransformations, true);
scene->addItem(rect);
scene->addItem(rect2);

setScene(scene);
scene->addRect(scene->itemsBoundingRect());
}

wheelEvent 虚函数:

void Graphics::wheelEvent(QWheelEvent *event)
{
if(event->delta() < 0)
scale(1.0/2.0, 1.0/2.0);
else
scale(2, 2);
scene->addRect(scene->itemsBoundingRect());

qDebug() << rect->transform();
qDebug() << rect->boundingRect();
qDebug() << rect2->transform();
qDebug() << rect2->boundingRect();
}

原始 View 如下所示: 1

以线为路,以旁为标志。缩小时,矩形保持其大小但跳出场景: 2

应该是矩形的左上角到行的中间。我也对显示 boundingRect 和 transform 保持不变的调试信息感到困惑,这似乎没有任何改变!是什么导致了这个问题,有什么办法可以解决吗?有人可以帮忙吗?谢谢!

最佳答案

抱歉耽搁了,现在我已经自己解决了这个问题。

我发现 QGraphicsItem::ItemIgnoresTransformations 仅在您要坚持的点位于项目坐标中的 (0,0) 时才有效。您还需要以这种方式手动更新 boundingRect。尽管如此,我发现的最佳解决方案是子类化 QGraphicsItem 并根据世界矩阵在 paint() 中设置矩阵。下面是我的代码。

QMatrix stableMatrix(const QMatrix &matrix, const QPointF &p)
{
QMatrix newMatrix = matrix;

qreal scaleX, scaleY;
scaleX = newMatrix.m11();
scaleY = newMatrix.m22();
newMatrix.scale(1.0/scaleX, 1.0/scaleY);

qreal offsetX, offsetY;
offsetX = p.x()*(scaleX-1.0);
offsetY = p.y()*(scaleY-1.0);
newMatrix.translate(offsetX, offsetY);

return newMatrix;
}

和绘画功能:

void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
QWidget *widget)
{
QPointF p(left, top);
painter->setMatrix(stableMatrix(painter->worldMatrix(), p));
painter->drawRect(left, top, width, height);
}

stableMatrix 的第二个参数是粘点,在我的示例代码中它是项目的左上角。您可以根据自己的喜好更改它。它真的很好用!希望这篇文章有所帮助:)

关于c++ - 缩放 View 时如何保持QGraphicsItem的大小和位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40590798/

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