Поиск, содержит ли QPolygon QPoint — не дает ожидаемых результатов

#python #pyqt #qpolygon

#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)
  

Для контекста — 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))
  

Комментарии:

1. Спасибо! Я думал, что QPolygon.contains() нашел точку внутри многоугольника, а не только внешние вершины многоугольника.