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
|