Поиск, содержит ли 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))
Другие вопросы по тегам