def _on_point_list_contents_changed(self): if not self._points: return if len(self._points) == 1: # Delete only point's line segment try: edge_item = self.point_items[self._points[0]].edge_item except AttributeError: return if edge_item.scene(): edge_item.scene().removeItem(edge_item) del self.point_items[self._points[0]].edge_item return # Make and update edges (line segments) as needed pis = [(point, self.point_items[point]) for point in self._points] for (point1, point_item1), (point2, point_item2) in zip(pis, pis[1:]): line = Qt.QLineF(point1.x, point1.y, point2.x, point2.y) if not hasattr(point_item1, 'edge_item'): point_item1.edge_item = Qt.QGraphicsLineItem( line, self.parentItem()) point_item1.edge_item.setPen(self.line_pen) point_item1.edge_item.installSceneEventFilter(self) point_item1.edge_item.setZValue(-1) elif point_item1.edge_item.line() != line: point_item1.edge_item.setLine(line) # Delete last point's line segment try: edge_item = self.point_items[self._points[-1]].edge_item except AttributeError: return if edge_item.scene(): edge_item.scene().removeItem(edge_item) del self.point_items[self._points[-1]].edge_item
def _on_point_item_list_content_reset(self): for line_item in self.line_items: self.view.scene().removeItem(line_item) self.line_items = [] if len(self.point_items) > 1: for point_item1, point_item2 in zip(self.point_items, self.point_items[1:]): line_item = Qt.QGraphicsLineItem( Qt.QLineF(point_item1.pos(), point_item2.pos()), self.parentItem()) line_item.setPen(self.line_pen) line_item.installSceneEventFilter(self) line_item.setZValue(-1) self.line_items.append(line_item)
def make_and_store_point_item(self, pos): self._ignore_point_item_position_changed = True try: super().make_and_store_point_item(pos) finally: self._ignore_point_item_position_changed = False if len(self.point_items) > 1: p1 = self.point_items[-2].pos() line_item = Qt.QGraphicsLineItem(Qt.QLineF(p1, pos), self.parentItem()) line_item.setPen(self.line_pen) line_item.installSceneEventFilter(self) line_item.setZValue(-1) self.line_items.append(line_item)