Pyqt5 QGraphicsSimpleTextItem()慢速zommig和pannig交互的设置旋转方法

Pyqt5 QGraphicsSimpleTextItem()慢速zommig和pannig交互的设置旋转方法,pyqt5,qgraphicsview,Pyqt5,Qgraphicsview,我有一个GUI,可以显示与每行对齐的行和文本,我使用QGraphicsSimpleTextItem()表示文本 问题: 如果在QGraphicsSimpleTextItem()上没有使用旋转方法,缩放和平移(子类QGraphcisView)交互将快速运行,但如果将旋转指定给这些项目,文本缩放和平移交互将变得非常缓慢 问题: 我使用Line Profiler来查找在课堂上花费更多时间的行,但没有什么真正突出的,如下所示。这有什么原因吗?我该如何改进这一点 设置文本旋转(ang) 注释文本旋转线(

我有一个GUI,可以显示与每行对齐的行和文本,我使用QGraphicsSimpleTextItem()表示文本

问题:

如果在QGraphicsSimpleTextItem()上没有使用旋转方法,缩放和平移(子类QGraphcisView)交互将快速运行,但如果将旋转指定给这些项目,文本缩放和平移交互将变得非常缓慢

问题:

我使用Line Profiler来查找在课堂上花费更多时间的行,但没有什么真正突出的,如下所示。这有什么原因吗?我该如何改进这一点

设置文本旋转(ang)

注释文本旋转线(ang)

每次点击时间并没有明显增加或减少,但用户在评论行#dict_Text[str(i)]。setRotation(ang[i])时的缩放和平移交互体验却大不相同

复制问题:

下面的代码再现了我遇到的问题,首先按原样运行代码,因为缩放和平移交互非常慢,然后注释掉dict_Text[str(I)]行。setRotation(ang[I])和缩放和平移交互将非常快

代码:

从PyQt5导入QtWidgets、QtCore、QtGui
将numpy作为np导入
导入系统
打印(QtCore.PYQT_VERSION_STR)
类GraphicsView(QtWidgets.QGraphicsView):
@侧面图
定义初始化(自身、场景、父对象):
超级(图形视图,自我)。\uuuu初始化\uuuu(场景,父级)
#鼠标跟踪
self.setMouseTracking(True)
#变焦锚
self.setTransformationAnchor(QtWidgets.QGraphicsView.AnchorUnderMouse)
self.setResizeAnchor(QtWidgets.QGraphicsView.AnchorUnderMouse)
#抗锯齿和索引
self.setRenderInts(QtGui.qPaint.Antialiasing | QtGui.qPaint.HighQualityAntialiasing | QtGui.qPaint.TextAntialiasing)
self.setCacheMode(qtwidts.QGraphicsView.CacheBackground)
self.resetCachedContent()
scene.setItemIndexMethod(qtwidts.qgraphicscene.NoIndex)
#泛变量
self.pos_init_class=None
@侧面图
def鼠标压力事件(自身、事件):
pos=self.maptosene(event.pos())
#鼠标盘
如果event.button()==QtCore.Qt.MiddleButton:
self.pos\u init\u class=pos
超级(GraphicsView,self).mousePressEvent(事件)
@侧面图
def mouseReleaseEvent(自身,事件):
如果self.pos_init_类和event.button()==QtCore.Qt.MiddleButton:
#鼠标盘
self.pos_init_class=None
超级(GraphicsView,self).mouseReleaseEvent(事件)
@侧面图
def mouseMoveEvent(自身、事件):
如果self.pos_init_类:
#鼠标盘
delta=self.pos_init_类-self.maptosene(event.pos())
r=self.maptosene(self.viewport().rect()).boundingRect()
自安装(右平移(增量))
超级(GraphicsView,self).mouseMoveEvent(事件)
@侧面图
def wheelEvent(自我,事件):
#鼠标缩放
如果event.angleDelta().y()大于0:
自评量表(1.5,1.5)
其他:
自刻度(1/1.5,1/1.5)
类Ui_主窗口(对象):
定义初始化(自):
超级(Ui\u主窗口,自我)。\u初始化
def plt_图(自):
#创建数据集
尺寸=200
x=np.random.randint(0,high=1000,size=size,dtype=int)
y=np.random.randint(0,high=1000,size=size,dtype=int)
ang=np.random.randint(1,high=360,size=size,dtype=int)
#在Dict中存储文本
dict_Text={}
对于范围内的i(len(x)):
#创建文本项
dict_Text[str(i)]=QtWidgets.QGraphicsSimpleTextItem()
#设置文本
dict_Text[str(i)].setText('nn-mm\nL:50.6m\nD:1500 mm'))
#设置位置
dict_Text[str(i)].setPos(x[i],y[i])
#设置旋转角度
听写文本[str(i)]。设置旋转(ang[i])
#添加到场景中
self.graphicsView.scene().addItem(dict_Text[str(i)])
def设置UI(自我,主窗口):
#中央部件
self.centralwidget=qtwidts.QWidget(主窗口)
MainWindow.setCentralWidget(self.centralwidget)
主宽度,主高度=1200,800
主窗口。调整大小(主窗口宽度、主窗口高度)
#创建图形视图和场景
self.scene=qtwidts.qgraphicscene()
self.graphicsView=graphicsView(scene=self.scene,parent=self.centralwidget)
#设置几何图形
self.graphicsView.setGeometry(QtCore.QRect(0,0,主宽度,主高度))
#绘图虚拟数据集
self.plt_plot()
如果名称=“\uuuuu main\uuuuuuuu”:
app=qtwidts.QApplication(sys.argv)
MainWindow=QtWidgets.QMainWindow()
ui=ui\u主窗口()
ui.setupUi(主窗口)
MainWindow.show()
sys.exit(app.exec_())

虽然QGraphicsView框架文档说明它非常快,但这并不意味着它总是很快

渲染速度取决于许多因素,单个项转换可能会大大降低整体性能

考虑到所有项的绘制都是作为单个光栅绘制完成的(后端几乎都是Qt自己的渲染:其优化虽然通常很好,但并不完美)。
对于每个具有单独变换的项目,画家需要基于该变换进行绘制。
如果你有200个项目,每个项目都有自己的转换,这意味着大量的计算

注:变换是一种可以变换绘画的方法(意味着一切都需要特殊和额外的计算)。
Qt转换非常标准:

  • 翻译
  • 鳞片
  • [预测]
  • 旋转(通过结合剪切和缩放完成,h