【发布时间】:2020-10-25 12:12:28
【问题描述】:
我有一个图形用户界面,显示与每一行对齐的行和文本,我使用 QGraphicsSimpleTextItem() 处理文本。
问题:
如果没有在 QGraphicsSimpleTextItem() 上使用 Rotation 方法,则缩放和平移(QGraphcisView 子类)交互运行很快,但是如果为这些项目分配了 Rotation,则文本缩放和平移交互变得非常慢。
问题:
我有 Line Profiler 来查找在课堂上花费更多时间的行,但没有什么特别突出的,如下所示。有什么理由会发生这种情况吗?我该如何改进?
每次点击时间并没有显示出很大的增加或减少,但是评论行 # dict_Text[str(i)].setRotation(ang[i]) 时有关缩放和平移交互的用户体验非常不同。
重现问题:
下面是重现我遇到的问题的代码,首先按原样运行代码,您将有一个非常缓慢的缩放和平移交互,然后注释掉 dict_Text[str(i)].setRotation(ang[ i]) 并且缩放和平移交互会非常快。
代码:
from PyQt5 import QtWidgets, QtCore, QtGui
import numpy as np
import sys
print(QtCore.PYQT_VERSION_STR)
class GraphicsView(QtWidgets.QGraphicsView):
@profile
def __init__(self, scene, parent):
super(GraphicsView, self).__init__(scene, parent)
#Mouse Tracking
self.setMouseTracking(True)
#Zoom Anchor
self.setTransformationAnchor(QtWidgets.QGraphicsView.AnchorUnderMouse)
self.setResizeAnchor(QtWidgets.QGraphicsView.AnchorUnderMouse)
#Antialiasing and indexing
self.setRenderHints(QtGui.QPainter.Antialiasing | QtGui.QPainter.HighQualityAntialiasing | QtGui.QPainter.TextAntialiasing)
self.setCacheMode(QtWidgets.QGraphicsView.CacheBackground)
self.resetCachedContent()
scene.setItemIndexMethod(QtWidgets.QGraphicsScene.NoIndex)
#Pan variable
self.pos_init_class = None
@profile
def mousePressEvent(self, event):
pos = self.mapToScene(event.pos())
#Mouse Pan
if event.button() == QtCore.Qt.MiddleButton:
self.pos_init_class = pos
super(GraphicsView, self).mousePressEvent(event)
@profile
def mouseReleaseEvent(self, event):
if self.pos_init_class and event.button() == QtCore.Qt.MiddleButton:
#Mouse Pan
self.pos_init_class = None
super(GraphicsView, self).mouseReleaseEvent(event)
@profile
def mouseMoveEvent(self, event):
if self.pos_init_class:
#Mouse Pan
delta = self.pos_init_class - self.mapToScene(event.pos())
r = self.mapToScene(self.viewport().rect()).boundingRect()
self.setSceneRect(r.translated(delta))
super(GraphicsView, self).mouseMoveEvent(event)
@profile
def wheelEvent(self, event):
#Mouse Zoom
if event.angleDelta().y() > 0:
self.scale(1.5, 1.5)
else:
self.scale(1 / 1.5, 1 / 1.5)
class Ui_MainWindow(object):
def __init__(self):
super(Ui_MainWindow, self).__init__()
def plt_plot(self):
#Create data set
size = 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)
#Store Text in Dict
dict_Text = {}
for i in range(len(x)):
#Create Text Item
dict_Text[str(i)] = QtWidgets.QGraphicsSimpleTextItem()
#Set text
dict_Text[str(i)].setText('nn-mm \nL: 50.6 m \nD: 1500 mm')
#Set Pos
dict_Text[str(i)].setPos(x[i], y[i])
#Set rotation angle
dict_Text[str(i)].setRotation(ang[i])
#Add to Scene
self.graphicsView.scene().addItem(dict_Text[str(i)])
def setupUi(self, MainWindow):
#Central Widget
self.centralwidget = QtWidgets.QWidget(MainWindow)
MainWindow.setCentralWidget(self.centralwidget)
main_width, main_heigth = 1200, 800
MainWindow.resize(main_width, main_heigth)
#Create GraphicsView and Scene
self.scene = QtWidgets.QGraphicsScene()
self.graphicsView = GraphicsView(scene=self.scene, parent=self.centralwidget)
#Set Geometry
self.graphicsView.setGeometry(QtCore.QRect(0, 0, main_width, main_heigth))
#plot dummy data set
self.plt_plot()
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
【问题讨论】:
-
使用提供的代码无法重现您的问题,请提供minimal, reproducible example。此外,cmets 应使用适当的
#字符,并且 in 也应为英文。 -
musicamante,我已经用足够的代码和参考来编辑我的问题来重现问题。感谢您的宝贵时间。
标签: pyqt5 qgraphicsview