Python PySide/PyQt:在缩放QGraphicsView时保持元素大小不变

Python PySide/PyQt:在缩放QGraphicsView时保持元素大小不变,python,pyqt,scale,pyside,qgraphicsview,Python,Pyqt,Scale,Pyside,Qgraphicsview,我正在尝试创建一个小型GUI应用程序,用户可以在其中绘制点和曲线。我实现了scale选项 我只想缩放路径,而不是点的图形表示(RBNode类)。除了RBNode类之外,有没有办法缩放QGraphicsView 我目前的方法是将RBGraphicsView类(继承自QGraphicsView)中wheelEvent方法中创建的factor属性传递到RBNode的实例中,并使用它重新绘制RBNode #!/usr/bin/python # -*- coding: utf-8 -*- import

我正在尝试创建一个小型GUI应用程序,用户可以在其中绘制点和曲线。我实现了scale选项

我只想缩放路径,而不是点的图形表示(RBNode类)。除了RBNode类之外,有没有办法缩放QGraphicsView

我目前的方法是将RBGraphicsView类(继承自QGraphicsView)中wheelEvent方法中创建的factor属性传递到RBNode的实例中,并使用它重新绘制RBNode

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import math
from PySide.QtGui import *
from PySide.QtCore import *


class RBNode(QGraphicsItem):
    def __init__(self, factorView = 1):
        super(RBNode, self).__init__()
        self.factor = factorView
        self.pressed = False
        self.x = self.pos().x()
        self.y = self.pos().y()
        self.setFlag(QGraphicsItem.ItemIsMovable)

    def boundingRect(self):
        self.update()
        return QRectF(-5*self.factor,-5*self.factor,10*self.factor,10*self.factor)


    def paint(self, painter, option, widget):
        self.update()
        rect = QRectF(-5*self.factor,-5*self.factor,10*self.factor,10*self.factor)

        if self.pressed:
            painter.setBrush(Qt.red)
        else:
            painter.setBrush(Qt.darkGray)

        painter.drawEllipse(rect)

    def mousePressEvent(self, event):
        self.pressed = True
        self.update()
        QGraphicsItem.mousePressEvent(self,event)

    def mouseReleaseEvent(self, event):
        self.pressed = False
        self.update()
        QGraphicsItem.mouseReleaseEvent(self,event)


class RBGraphicView(QGraphicsView):
    def __init__(self):
        super(RBGraphicView, self).__init__()
        self.factorView = 1
        self.initScene()
        self.initGui()



    def initGui(self):
        self.setWindowTitle("A Simple Animation")
        self.show()

    def initScene(self):
        self.rbScene = QGraphicsScene(self)
        self.rbAddItem(self.rbScene)
        self.setScene(self.rbScene)

    def wheelEvent(self, event):
        factor = math.pow(2.0, -event.delta() / 240.0)
        self.scaleView(factor)

    def scaleView(self, scaleFactor):
        factor = self.matrix().scale(scaleFactor, scaleFactor).mapRect(QRectF(0,0,1,1)).width()
        if factor < 0.001 or factor > 1000:
            return
        self.scale(scaleFactor, scaleFactor)
        self.factorView = factor


    def rbAddItem(self, scene):

        rbNode1 = RBNode(self.factorView)
        rbNode1.setPos(100,100)

        rbNode2 = RBNode()
        rbNode2.setPos(100,100)

        rbP2 = QPointF(20.0, 10.0)
        rbP3 = QPointF(80.0, 30.0)
        rbP4 = QPointF(90.0, 70.0)
        bezierPath = QPainterPath()
        bezierPath.moveTo(rbNode1.x, rbNode1.y)
        bezierPath.cubicTo(rbP2.x(),rbP2.y(),rbP3.x(),rbP3.y(),rbP4.x(),rbP4.y())
        myItem = QGraphicsPathItem(bezierPath)

        scene.addItem(rbNode1)
        scene.addItem(rbNode2)
        scene.addItem(myItem)

if __name__ == '__main__':
    try:
        myApp = QApplication(sys.argv)
        myView = RBGraphicView()
        myApp.exec_()
        sys.exit(0)

    except NameError:
        print("Name Error:", sys.exc_info()[1])

    except SystemExit:
        print("Closing Window...")

    except Exception:
        print(sys.exc_info()[1])
#/usr/bin/python
#-*-编码:utf-8-*-
导入系统
输入数学
从PySide.QtGui导入*
从PySide.QtCore导入*
类RBNode(QGraphicsItem):
def uuu init uuuu(self,factorView=1):
超级(RBNode,self)。\uuuuu init\uuuuuuu()
self.factor=factorView
self.pressed=False
self.x=self.pos().x()
self.y=self.pos().y()
self.setFlag(QGraphicsItem.ItemIsMovable)
def boundingRect(自):
self.update()
返回QRectF(-5*self.factor,-5*self.factor,10*self.factor,10*self.factor)
def绘制(自绘制、绘制、选项、小部件):
self.update()
rect=QRectF(-5*self.factor,-5*self.factor,10*self.factor,10*self.factor)
如果按self.press:
油漆工退刀(Qt.红色)
其他:
画家。挫折(Qt.darkGray)
画家。抽屉(矩形)
def鼠标压力事件(自身、事件):
self.pressed=True
self.update()
QGraphicsItem.mousePressEvent(self,event)
def mouseReleaseEvent(自身,事件):
self.pressed=False
self.update()
QGraphicsItem.mouseReleaseEvent(自,事件)
类RBGraphicsView(QGraphicsView):
定义初始化(自):
超级(RBGraphicView,self)。\uu初始化
self.factorView=1
self.initScene()
self.initGui()
def initGui(self):
self.setWindowTitle(“一个简单的动画”)
self.show()
def初始场景(自身):
self.rbScene=qgraphicscene(self)
self.rbAddItem(self.rbScene)
self.setScene(self.rbScene)
def wheelEvent(自我,事件):
factor=math.pow(2.0,-event.delta()/240.0)
自缩放视图(因子)
def scaleView(自身、scaleFactor):
factor=self.matrix().scale(scaleFactor,scaleFactor).mapRect(QRectF(0,0,1,1)).width()
如果系数<0.001或系数>1000:
返回
self.scale(scaleFactor,scaleFactor)
self.factorView=因子
def rbAddItem(自身、场景):
rbNode1=RBNode(self.factorView)
rbNode1.setPos(100100)
rbNode2=RBNode()
rbNode2.setPos(100100)
rbP2=QPointF(20.0,10.0)
rbP3=QPointF(80.0,30.0)
rbP4=QPointF(90.0,70.0)
bezierPath=QPainterPath()
bezierPath.moveTo(rbNode1.x,rbNode1.y)
cubicTo(rbP2.x(),rbP2.y(),rbP3.x(),rbP3.y(),rbP4.x(),rbP4.y())
myItem=QGraphicsPathItem(bezierPath)
场景.附加项(rbNode1)
场景.附加项(rbNode2)
场景.附加项(myItem)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
尝试:
myApp=QApplication(sys.argv)
myView=RBGraphicView()
myApp.exec()
系统出口(0)
除名称错误外:
打印(“名称错误:”,sys.exc_info()[1])
除系统退出外:
打印(“关闭窗口…”)
除例外情况外:
打印(sys.exc_info()[1])
另请参见:另请参见: