QGraphicsPathItem hoverEvents - подавить наведение на область, образованную путем
https://www.dropbox.com/s/phven3rriv36893/graphicsview-pathitem.png?dl=0 Интересно, есть ли способ заставить мой QGraphicsPathItem реагировать на mouseHoverEvents на фактическую кривую вместо всей оранжевой области, как видно на Docs.
https://www.dropbox.com/s/7m8w34nitp34sgf/pipes.png?dl=0 В моем приложении я не вижу области, которая фактически формирует путь, и поэтому я хочу только hoverEnterEvent, когда кривая Безье находится (и hoverLeaveEvent, когда останется безье, конечно).
Этого можно достичь с помощью QGraphicsPathItem или это совершенно неправильный подход? Если да, то как? Если нет, то какой объект QGraphics можно рассматривать как замену?
Если код действительно нужен, дайте мне знать.
Ура, Майкл
2 ответа
Вам нужно переопределить QGraphicsItem.shape
чтобы вернуть более точное представление вашей кривой. Реализация по умолчанию дает вам ограничивающий прямоугольник, как вы обнаружили.
Ответ Тима Уэйкхэма абсолютно верен: вам нужно заново реализовать shape()
чтобы предоставить более детальную форму для вашего элемента пути. Тем не менее, его ответ не совсем полезен, так как это не просто shape()
метод, возвращающий право QPainterPath
,
Это еще более запутанно, потому что в этом случае QGraphicsPathItem
уже может предоставить QPainterPath
от его path()
метод. К сожалению, это, как правило, неправильное значение для возврата из shape()
метод, поскольку он рисует элемент, а не разграничивает его снаружи.
К счастью, поскольку это довольно стандартное требование, существует встроенный класс для преобразования пути в контур, который можно использовать для фигуры: QPainterPathStroker
,
Вот код, который я использую для этого:
qp = QtGui.QPainterPathStroker()
qp.setWidth(MARGIN)
qp.setCapStyle(QtCore.Qt.SquareCap)
shape = qp.createStroke(self.path())