在绘图中缩放已绘制的 QPolygonF

Posted

技术标签:

【中文标题】在绘图中缩放已绘制的 QPolygonF【英文标题】:Scaling an already drawn QPolygonF in drawing 【发布时间】:2013-10-23 16:41:46 【问题描述】:

所以, 我在我定义的区域中绘制了一个 QPolygonF。该区域继承自 QGraphicsView。

我想要做的是让用户在 QPolygonF 的控制点周围移动,并在多边形创建后改变它。我真的找不到关于如何做到这一点的参考资料。

由于我画线来闭合并表示多边形,并且在可绘制区域中可以有更多的东西,清除它并一遍又一遍地绘制它似乎不正确。

有谁知道我该如何解决这个问题?

谢谢!

【问题讨论】:

【参考方案1】:

我有点困惑为什么你描述你的“区域”继承自 QGraphicsView,然后讨论 QPolygonF。如果您使用的是 QGraphicsView,这意味着您有一个 QGraphicsScene 并且将使用 QGraphicsPolygonItem。

但是,假设 QGraphicsView 在这里无关紧要,QPolygonF 只是一个从点向量继承的类; QVector。

您应该能够遍历这些点并将它们移动到您想要的任何位置。你可以得到一个这样的观点:-

QPolygonF poly; // assume it has been given a number of points
QPointF& point = poly[index]; // where index is the index into the QVector of points

然后你可以移动点:-

point.SetX(xPos);
point.SetY(yPos);

在移动点时重绘项目应该不是问题。

【讨论】:

是的,这正是我想到的,但因为我想要鼠标移动来指示任何点在多边形中的移动方式。当鼠标移动时,我不想一次又一次地绘制所有内容。所以我想知道是否有一种方法可以仅绘制 1 个多边形(带有新点)删除了该多边形(旧点)的前一个实例,没有别的。 通过更新 Polygon 的点并在其 Widget 上调用 update(),仅重绘 Widget 及其内容。视频游戏曾经使用相同的“脏矩形”方法,直到人们意识到使用后台缓冲区重新绘制整个屏幕更快、更容易。 Qt 也是如此,所以只需让 Qt 通过在小部件上调用 update 来处理它。如果您在重绘时遇到问题,那么您可以看看如何优化您的代码。【参考方案2】:

清除它并重新绘制整个场景可能是最有效的方法。唯一的其他选择是在多边形更改时尝试计算多边形的最小边界矩形并尝试仅使该区域无效,但这实际上是同一件事。 Qt 绘图速度非常快,尤其是当您利用 opengl 集成时。当我开始担心重绘整个场景时,我提醒自己电子游戏一直都在这样做。 :P

【讨论】:

您能否提供我如何使特定区域无效。无论如何,这仍然不能解决我必须绘制其他多边形的问题,因为我无效的区域也可能包含其他多边形。

以上是关于在绘图中缩放已绘制的 QPolygonF的主要内容,如果未能解决你的问题,请参考以下文章

如何在pyqtgraph中缩放绘图

转载CAD画图比例如何设置

Shapefile 缩放以使用 geopandas 进行绘图

如何在缩放图像上绘图?

在画布上绘制位图已缩放

C#如何消除绘制图形缩放时抖动,总结