2016-10-18 32 views
3

我正在使用PyQt中的程序并创建一个窗口小部件,该窗口小部件在该网格上显示网格和一组多边形,您可以移动并单击。当我尝试实现多边形的点击时,它似乎不起作用。下面是不起作用的功能:查找QPolygon是否包含QPoint - 未给出预期结果

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.polysQPolygonse.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到列表中的一个问题?

回答

3

不工作的原因是因为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)) 
+0

谢谢!我认为'QPolygon.contains()'在多边形内找到了一个点,而不仅仅是多边形的外部顶点。 –

相关问题