#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()
нашел точку внутри многоугольника, а не только внешние вершины многоугольника.