猿问

在两个 qgraphicsview 对象之间链接缩放

我正在尝试链接两个 qgraphicsview 对象,以便当一个窗口放大另一个 qgraphicsview 时也会缩放。我试图通过在一个窗口要缩放时调用测试函数来实现这一点。然后我尝试在另一个 qgraphicsview 对象中调用 self.scale(factor,factor) 。我收到一个错误:AttributeError:'PhotoViewer' 对象没有属性'viewer'。我如何得到我正在尝试调用类 ui self.viewer 但从错误判断我仍在 Photoviewer 对象中。当一个窗口被放大时,如何调用其他窗口 self.scale?提前致谢。


from PyQt5 import QtCore, QtGui, QtWidgets

from PyQt5.QtCore import Qt, QPoint

from PyQt5.QtWidgets import QMainWindow, QApplication

from PyQt5.QtGui import QPixmap, QPainter, QPen

import sys


class PhotoViewer(QtWidgets.QGraphicsView):

    photoClicked = QtCore.pyqtSignal(QtCore.QPoint)


    def __init__(self, parent,num_view):

        super(PhotoViewer, self).__init__(parent)

        #to track which viewer

        self.num_view=num_view

        self.drawmode=0

        self._zoom = 0

        self.drawing = False

        self.lastPoint = QPoint()

        self.image=False

        self.image=QPixmap(r"image.jpg")

        self._empty = True

        self._scene = QtWidgets.QGraphicsScene(self)

        self._photo = QtWidgets.QGraphicsPixmapItem()

        self._scene.addItem(self._photo)

        self.setScene(self._scene)

        self.setTransformationAnchor(QtWidgets.QGraphicsView.AnchorUnderMouse)

        self.setResizeAnchor(QtWidgets.QGraphicsView.AnchorUnderMouse)

        self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)

        self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)

        self.setBackgroundBrush(QtGui.QBrush(QtGui.QColor(30, 30, 30)))

        self.setFrameShape(QtWidgets.QFrame.NoFrame)


    def hasPhoto(self):

        return not self._empty


摇曳的蔷薇
浏览 261回答 1
1回答

MYYA

您可以为此使用信号,而不是尝试直接缩放视图:将以下代码添加到PhotoViewer:class PhotoViewer(QtWidgets.QGraphicsView):    scaled = QtCore.pyqtSignal(int, int, QtGui.QTransform, int)    ....    def scale(self, horz, vert):        super().scale(horz, vert)        self.scaled.emit(self.horizontalScrollBar().value(),                         self.verticalScrollBar().value(),                          self.transform(),                          self._zoom                        )    def set_transform(self, horz_scroll, vert_scroll, transform, zoom):        # temporary block signals from scroll bars to prevent interference        horz_blocked = self.horizontalScrollBar().blockSignals(True)        vert_blocked = self.verticalScrollBar().blockSignals(True)        self._zoom = zoom        self.setTransform(transform)        dx = horz_scroll - self.horizontalScrollBar().value()        dy = vert_scroll - self.verticalScrollBar().value()        self.horizontalScrollBar().setValue(dx)        self.verticalScrollBar().setValue(dy)        self.horizontalScrollBar().blockSignals(horz_blocked)        self.verticalScrollBar().blockSignals(vert_blocked)并ui:class ui(QtWidgets.QWidget):    def __init__(self):        ....        self.viewer.scaled.connect(self.viewer2.set_transform)        self.viewer2.scaled.connect(self.viewer.set_transform)同时删除对ui.test()form的调用PhotoViewer.wheelEvent。
随时随地看视频慕课网APP

相关分类

Python
我要回答