我正在研究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))]))
使用内联循环将QPolygons
添加到列表中可能会出现问题吗?
答案 0 :(得分:5)
这不起作用的原因是因为如果该点是多边形的顶点之一,或者该点落在多边形的边缘上,则bool QPolygon.contains( QPoint )
返回true。使用您的设置返回true的点的一些示例包括QPoint(0,0)
,QPoint(0,200)
或任何符合这些条件的内容。
您正在寻找的是一个函数,如果该点位于多边形内而不是多边形上,则返回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))