Название: отваливается AnchorUnderMouse при реализации mouseMoveEvent Отправлено: 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 Название: Re: отваливается AnchorUnderMouse при реализации mouseMoveEvent Отправлено: kirainluck от Май 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) |