[Python] How to translate/drag/move QGraphicsScene?

Discussão em 'Python' iniciado por Stack, Fevereiro 18, 2025.

  1. Stack

    Stack Membro Participativo

    I know this question was answered a lot of times especially in C++ version of Qt, but I am not so good in C++ and I can't find the solution.

    I have a code with QGraphicsView with rectangle made out of QGraphicsPolygonItem in center. I am trying to find a way to make QGraphicsScene translatable/movable/dragable by a user(anything would be okay, I am just trying to give a user an option to move around scene). But none of my tries would work.

    I tried setting :


    • self.horizontalScrollBar().setValue() and self.verticalScrollBar().setValue()


    • self._scene.setSceneRect(x,y,w,h)


    • setting anchor to AnchorUnderMouse and NoAnchor


    • using translate()

    None of it makes my scene move... Only thing which made my scene move is setSceneRect(), but once I put it under mouseMoveEvent(self,event) it stops working. Can somebody help me to learn how to move around that rectangle in scene ?

    Code:

    from PyQt5.QtGui import QColor, QPolygonF, QPen, QBrush
    from PyQt5.QtCore import Qt, QPointF, QPoint, pyqtSignal
    from PyQt5.QtWidgets import QDialog, QVBoxLayout, QGraphicsView, QGraphicsScene, QGraphicsPolygonItem, QApplication, \
    QFrame, QSizePolicy

    points_list = [[60.1, 19.6, 0.0], [60.1, 6.5, 0.0], [60.1, -6.5, 0.0], [60.1, -19.6, 0.0], [60.1, -19.6, 0.0],
    [20.0, -19.6, 0.0], [-20, -19.6, 0.0], [-60.1, -19.6, 0.0], [-60.1, -19.6, 0.0], [-60.1, -6.5, 0.0],
    [-60.1, 6.5, 0.0], [-60.1, 19.6, 0.0], [-60.1, 19.6, 0.0], [-20.0, 19.6, 0.0], [20.0, 19.6, 0.0],
    [60.1, 19.6, 0.0]]


    class MainWindow(QDialog):
    def __init__(self, parent=None):
    QDialog.__init__(self, parent=parent)
    self.create()

    def create(self, **kwargs):
    main_layout = QVBoxLayout()
    graphics = MainGraphicsWidget()
    main_layout.addWidget(graphics)
    self.setLayout(main_layout)

    class MainGraphicsWidget(QGraphicsView):
    zoom_signal = pyqtSignal(bool)

    def __init__(self, parent=None):
    super(MainGraphicsWidget, self).__init__(parent)
    self._scene = QGraphicsScene(backgroundBrush=Qt.gray)
    self.__zoom = 0
    self.setScene(self._scene)
    self.setTransformationAnchor(QGraphicsView.NoAnchor)
    #self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)
    self.setResizeAnchor(QGraphicsView.AnchorUnderMouse)
    self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
    self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
    self.setBackgroundBrush(QBrush(QColor(30, 30, 30)))
    self.setFrameShape(QFrame.NoFrame)
    self.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding))
    self.sceneRect = self._scene.sceneRect()
    self.testButton = GraphicsButton()
    self._scene.addItem(self.testButton)
    #self.horizontalScrollBar().setValue(199)
    #self.verticalScrollBar().setValue(500)

    def mouseMoveEvent(self, event):
    modifierPressed = QApplication.keyboardModifiers()
    if (modifierPressed & Qt.AltModifier) == Qt.AltModifier and event.buttons() == Qt.LeftButton:
    #self._scene.setSceneRect(event.pos().x(), event.pos().y(), self.sceneRect.width(), self.sceneRect.height())
    pass

    super(MainGraphicsWidget, self).mouseMoveEvent(event)

    def wheelEvent(self, event):
    if event.angleDelta().y() > 0:
    factor = 1.25
    self.__zoom += 1
    else:
    factor = 0.8
    self.__zoom -= 1
    self.scale(factor, factor)
    self.zoom_signal.emit(self.__zoom < 10)


    class GraphicsButton(QGraphicsPolygonItem):
    def __init__(self, parent=None):
    super(GraphicsButton, self).__init__(parent)
    self.myPolygon = QPolygonF([QPointF(v1, v2) for v1, v2, v3 in points_list])
    self.setPen(QPen(QColor(0, 0, 0), 0, Qt.SolidLine, Qt.FlatCap, Qt.MiterJoin))
    self.setPolygon(self.myPolygon)
    self.setBrush(QColor(220, 40, 30))


    if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    window = MainWindow()
    window.setGeometry(500, 100, 500, 900)
    window.show()
    sys.exit(app.exec_())

    Continue reading...

Compartilhe esta Página