查找QPolygon是否包含未给出预期结果的QPoint

2024-09-29 01:25:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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()是鼠标位置。我试过进去

^{pr2}$

为了测试它是否适用于控制点,但在控制台中,它只提供以下信息:

<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))]))

使用inline for循环将QPolygons添加到列表中可能会有问题吗?在


Tags: inposself网格列表for部件qt
1条回答
网友
1楼 · 发布于 2024-09-29 01:25:02

这不起作用的原因是,如果该点是多边形的顶点之一,或者该点落在多边形的边上,boolQPolygon.contains( QPoint )将返回true。一些在设置中返回true的点的例子是QPoint(0,0)QPoint(0,200),或者任何与这些条件都匹配的点。在

你要找的大概是一个函数,如果点位于多边形内,而不是在多边形上,则返回true。您要查找的函数是QPolygon.containsPoint ( QPoint , Qt.FillRule )。这一点正如您所想的那样,第二个值要么是1,要么是0(表示为Qt.OddEvenFill公司或者Qt.通风填料它们决定了用什么方法来确定一个点是否在多边形内。关于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))

相关问题 更多 >