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

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

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

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

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

谢谢!

【问题讨论】:

    标签: c++ qt qpolygon


    【解决方案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

    【讨论】:

    • 您能否提供我如何使特定区域无效。无论如何,这仍然不能解决我必须绘制其他多边形的问题,因为我无效的区域也可能包含其他多边形。
    猜你喜欢
    • 1970-01-01
    • 2019-02-23
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 2017-08-14
    • 1970-01-01
    相关资源
    最近更新 更多