Russian Qt Forum
Апрель 20, 2024, 15:10 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: отваливается AnchorUnderMouse при реализации mouseMoveEvent  (Прочитано 1915 раз)
kirainluck
Гость
« : Май 05, 2016, 18:59 »

Добрый день, (Qt 5.5) есть GraphicsView с реализовнным зумом, необходимо чтобы обязательно было событие, регистрирующее перемещение мыши,
проблема в том, что при добавления данного события в код отваливается зум по курсору мыши, зумится по крайнему левому углу, необходимо чтобы и событие mouseMoveEvent было и зумилось по курсору мыши:

class ElementImageViewer(QGraphicsView):
    def __init__(self, main_window, parent=None, track_mouse=False):
        super(QGraphicsView, self).__init__(parent)
        self.image = QImage()
        self.mouseCallback = lambda x, y: None
        self.image_scale_k = 1.
        self.lines = []
        self.track_mouse = track_mouse
        self.setMouseTracking(track_mouse)
        self.label = main_window.findChild(QLabel, "label")
        self.main_window = main_window
        self.scene = QGraphicsScene()
        self.setScene(self.scene)
        #self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        #self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self._pan = False
        self._panStartX, self._panStartY = 0, 0

        painter = QPainter(self)
        painter.setViewport(self.rect())
        color = QColor()
        color.setHslF(0.5, 0.75, 0.5)  # hue: 0 = red, 0.3 = green, 0.5 = cyan

        outline_pen = QPen(color)
        outline_pen.setWidthF(2.)

        pin_pen = QPen(color)
        pin_pen.setWidthF(4.)

        red_pen = QPen(QColor(255, 0, 0))
        red_pen.setWidthF(4.)
        green_pen = QPen(QColor(0, 255, 0))
        green_pen.setWidthF(4.)

        text_pen = QPen(color)
        text_pen.setWidthF(2.)

        elements = self.main_window.elements
        if len(elements) > 0:
            for e in elements:
                svgname = "./svg/" + e.name + ".svg"
                if (not os.path.isfile(svgname)):
                    svgname = "./svg/noimage.svg"
                renderer = QtSvg.QSvgRenderer(svgname)
                pts = []
                for pt in e.bounding_zone:
                    pts.append(QtCore.QPoint(self.scale_coord(pt[1]), self.scale_coord(pt[0])))

                painter.setPen(outline_pen)
                painter.drawPolygon(QtGui.QPolygon(pts))

                rect = makeQrect(pts)
                rcx = rect.center().x()
                rcy = rect.center().y()
                painter.translate(rcx, rcy)
                painter.rotate(90.0 * e.rotation)
                painter.translate(-rcx, -rcy)

                rot_rect = rotRect(rect, e.rotation)
                renderer.render(painter, rot_rect)

                painter.translate(rcx, rcy)
                painter.rotate(-90.0 * e.rotation)
                painter.translate(-rcx, -rcy)

                painter.setPen(text_pen)
                painter.drawText(rect, e.name)

                painter.setPen(pin_pen)
                for pin in e.pins:
                    if (pin.ivc == []):
                        painter.setPen(pin_pen)
                        painter.drawPoint(self.scale_coord(pin.y), self.scale_coord(pin.x))
                    else:
                        painter.setPen(red_pen)
                        painter.drawPoint(self.scale_coord(pin.y), self.scale_coord(pin.x))


    def wheelEvent(self, event):
        zoomFactor = 1.15
        delta = event.angleDelta().y()

        self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)

        if delta > 0:
            self.scale(zoomFactor, zoomFactor)
            self.image_scale_k*=zoomFactor
        else:
            self.scale(1 / zoomFactor, 1 / zoomFactor)
            self.image_scale_k /= zoomFactor

    def mousePressEvent(self, event):
        if (event.button() == Qt.LeftButton):
            self._pan = True
            self._panStartX = event.x()
            self._panStartY = event.y()

    def mouseMoveEvent(self, event):
        if self.track_mouse:
            x = event.pos().x() * self.image_scale_k
            y = event.pos().y() * self.image_scale_k
            self.label.setText("%d, %d" % self.posToPixXY(event.pos()))

        if self._pan:
            self.setCursor(Qt.ClosedHandCursor)
            self.horizontalScrollBar().setValue(self.horizontalScrollBar().value() - (event.x() - self._panStartX))
            self.verticalScrollBar().setValue(self.verticalScrollBar().value() - (event.y() - self._panStartY))
            self._panStartX = event.x()
            self._panStartY = event.y()

    def mouseReleaseEvent(self, event):
        if event.button() != Qt.LeftButton:
            return

        self._pan = False
        cur = self.cursor().shape()
        self.setCursor(Qt.ArrowCursor)

        x, y = self.posToPixXY(event.pos())
        mw = self.main_window

        if mw.checkBox.isChecked():
            x, y = mw.state.t((x, y))[0]
            # log("Go:", x, y)
            mw.state.device.move_to_xy((x, y), wait=False)
            return

        if hasattr(mw, 'ia_stitcher') and mw.ia_stitcher is not None and (cur != Qt.ClosedHandCursor):
            mw.ia_stitcher.setPoint((x, y))
            return
Записан
kirainluck
Гость
« Ответ #1 : Май 05, 2016, 20:07 »

Нашёл решение, если кто-нибудь столкнётся

    def wheelEvent(self, event):
        zoomFactor = 1.15
        delta = event.angleDelta().y()

        self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)

        if delta > 0:
            self.scale(zoomFactor, zoomFactor)
            self.image_scale_k*=zoomFactor

        else:
            self.scale(1 / zoomFactor, 1 / zoomFactor)
            self.image_scale_k /= zoomFactor

        hs = self.horizontalScrollBar()
        vs = self.verticalScrollBar()
        xRat = event.pos().x() / self.scene.sceneRect().width()
        yRat = event.pos().y() / self.scene.sceneRect().height()
        vMax = vs.maximum()
        hMax = hs.maximum()
        vMin = vs.minimum()
        hMin = hs.minimum()
        vs.setValue(yRat * (vMax - vMin) + vMin * zoomFactor)
        hs.setValue(xRat * (hMax - hMin) + hMin * zoomFactor)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 20.