Поиск, содержит ли QPolygon QPoint - Не дает ожидаемых результатов
Я работаю над программой на 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))]))
Может быть, это проблема с использованием встроенного цикла for для добавления QPolygons
к списку?
1 ответ
Причина, по которой это не работает, заключается в том, что 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))