查找 QPolygon 是不是包含 QPoint - 未给出预期结果

Posted

技术标签:

【中文标题】查找 QPolygon 是不是包含 QPoint - 未给出预期结果【英文标题】:Finding if a QPolygon contains a QPoint - Not giving expected results查找 QPolygon 是否包含 QPoint - 未给出预期结果 【发布时间】:2016-10-18 06:07:33 【问题描述】:

我正在使用 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.polysQPolygons 的列表,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】:

这不起作用的原因是,如果该点是多边形的顶点之一,或者该点落在多边形的边缘上,则 bool QPolygon.contains( QPoint ) 返回 true。 QPoint(0,0)QPoint(0,200) 或任何符合这些条件的任何点的一些示例都会在您的设置中返回 true。

您正在寻找的大概是一个函数,如果该点位于多边形内,而不是在多边形上,则该函数返回 true。您正在寻找的功能是QPolygon.containsPoint ( QPoint , Qt.FillRule )。该点如您所想,第二个值是 1 或 0(分别表示为 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() 在多边形内找到了一个点,而不仅仅是多边形的外部顶点。

以上是关于查找 QPolygon 是不是包含 QPoint - 未给出预期结果的主要内容,如果未能解决你的问题,请参考以下文章

将旋转的 QRect 变成 QPolygon

如何计算 QPolygon 面积

QPolygon:如何获得多边形的边缘

如何减去 QPainterPaths,QPolygon?

如何获得翻译后的 QPolygon 的终点

在 python 3.6+ 和 PyQt5 中腌制一个 QPolygon