Jon*_*Liu 4 python pyqt qpolygon
我正在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)
Run Code Online (Sandbox Code Playgroud)
对于背景,self.polys是名单QPolygons和e.pos()为鼠标的位置。我尝试进入
print(poly)
print(poly.contains(QPoint(1,1)))
Run Code Online (Sandbox Code Playgroud)
测试它是否适用于控制点,但是在控制台中,它只会给我以下内容:
<PySide.QtGui.QPolygon(QPoint(50,350) QPoint(50,0) QPoint(0,0) QPoint(0,350) ) at 0x000000000547D608>
False
Run Code Online (Sandbox Code Playgroud)
我在这里做错什么了吗,或者如何将上面的“多边形”转换为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))]))
Run Code Online (Sandbox Code Playgroud)
使用内联for循环将QPolygons列表添加到列表中可能会出现问题吗?
小智 6
之所以不起作用,是因为QPolygon.contains( QPoint )如果该点是多边形的顶点之一,或者该点落在多边形的边缘上,则bool 返回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))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
988 次 |
| 最近记录: |