查找 QPolygon 是否包含 QPoint - 得不到预期结果

5

我正在使用PyQt开发一个程序,创建了一个小部件,用于显示一个网格和一组多边形,你可以在该网格上移动和单击。当我尝试实现对多边形的单击操作时,似乎不起作用。以下是无法正常工作的函数:

def mouseMoveCustom(self, e):
    for poly in reversed(self.polys):
        if poly.contains(e.pos()):
            self.cur_poly = poly
            self.setCursor(Qt.PointingHandCursor)
            print('mouse cursor in polygon')
            break
        else:
            self.setCursor(Qt.CrossCursor)

为了更好地理解, self.polys 是一个 QPolygons 的列表,而 e.pos() 表示鼠标的位置。我尝试过输入


print(poly)
print(poly.contains(QPoint(1,1)))

为了测试它是否适用于控制点,但在控制台中,它只给了我这个:

<PySide.QtGui.QPolygon(QPoint(50,350) QPoint(50,0) QPoint(0,0) QPoint(0,350) )  at 0x000000000547D608>
False

我是否做错了什么,或者我该如何将上述“多边形”转换为实际的QPolygon以便于操作?

编辑:

下面是用于生成列表self.polys的代码:

self.polys.append(QPolygon([QPoint(points[i][X]+self.transform[X], points[i][Y]+self.transform[Y]) for i in range(len(points))]))

也许使用内联for循环将QPolygons添加到列表中可能会出现问题吗?
1个回答

8
这段代码无法正常工作的原因是因为bool QPolygon.contains(QPoint)会在点位于多边形的顶点或者边缘时返回true。以下是一些例子,你的设置下将返回true: QPoint(0,0)QPoint(0,200),或者任何满足这些条件的点。

你想要的函数可能是一个判断点是否在多边形内而不是在边缘上的函数。你所需要的函数是QPolygon.containsPoint(QPoint, Qt.FillRule)。第一个参数表示点,第二个参数是0或1(分别用Qt.OddEvenFill和Qt.WindingFill表示),它们决定了如何判断一个点是否在多边形内部。关于Qt.FillRule的更多信息可以在这里找到:https://doc.qt.io/archives/qtjambi-4.5.2_01/com/trolltech/qt/core/Qt.FillRule.html

更正后的代码如下:

print(poly)
print(poly.containsPoint(QPoint(1,1), Qt.OddEvenFill))

谢谢!我以为QPolygon.contains()是用来判断一个点是否在多边形内部,而不仅仅是在多边形的顶点上。 - Jonathan Liu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接