예제 #1
0
class RectItemInserter(ItemInserter):
    def __init__(self,
                 labeltool,
                 scene,
                 default_properties=None,
                 prefix="",
                 commit=True):
        ItemInserter.__init__(self, labeltool, scene, default_properties,
                              prefix, commit)
        self._aiming = True
        self._helpLines = None
        self._helpLinesPen = QPen(Qt.green, 2, Qt.DashLine)
        self._init_pos = None

    def mousePressEvent(self, event, image_item):
        self._aiming = False
        if self._helpLines is not None and self._helpLines.scene() is not None:
            self._scene.removeItem(self._helpLines)
            self._helpLines = None

        pos = event.scenePos()
        self._init_pos = pos
        self._item = QGraphicsRectItem(QRectF(pos.x(), pos.y(), 0, 0))
        self._item.setPen(self.pen())
        self._scene.addItem(self._item)
        event.accept()

    def mouseMoveEvent(self, event, image_item):
        if self._aiming:
            if self._helpLines is not None and self._helpLines.scene(
            ) is not None:
                self._scene.removeItem(self._helpLines)

            self._helpLines = QGraphicsItemGroup()
            group = self._helpLines

            verticalHelpLine = QGraphicsLineItem(event.scenePos().x(), 0,
                                                 event.scenePos().x(),
                                                 self._scene.height())
            horizontalHelpLine = QGraphicsLineItem(0,
                                                   event.scenePos().y(),
                                                   self._scene.width(),
                                                   event.scenePos().y())

            horizontalHelpLine.setPen(self._helpLinesPen)
            verticalHelpLine.setPen(self._helpLinesPen)

            group.addToGroup(verticalHelpLine)
            group.addToGroup(horizontalHelpLine)

            self._scene.addItem(self._helpLines)
        else:
            if self._item is not None:
                assert self._init_pos is not None
                rect = QRectF(self._init_pos, event.scenePos()).normalized()
                self._item.setRect(rect)

        event.accept()

    def mouseReleaseEvent(self, event, image_item):
        if self._item is not None:
            if self._item.rect().width() > 1 and \
               self._item.rect().height() > 1:
                rect = self._item.rect()
                self._ann.update({
                    self._prefix + 'x': rect.x(),
                    self._prefix + 'y': rect.y(),
                    self._prefix + 'width': rect.width(),
                    self._prefix + 'height': rect.height()
                })
                self._ann.update(self._default_properties)
                if self._commit:
                    image_item.addAnnotation(self._ann)
            if self._item is not None and self._item.scene() is not None:
                self._scene.removeItem(self._item)
            self.annotationFinished.emit()
            self._init_pos = None
            self._item = None

        self._aiming = True
        self._scene.views()[0].viewport().setCursor(Qt.CrossCursor)
        event.accept()

    def allowOutOfSceneEvents(self):
        return True

    def abort(self):
        if self._helpLines is not None and self._helpLines.scene() is not None:
            self._scene.removeItem(self._helpLines)
            self._helpLines = None

        if self._item is not None and self._item.scene() is not None:
            self._scene.removeItem(self._item)
            self._item = None
            self._init_pos = None
        ItemInserter.abort(self)