Если все правильно понять, QGraphicsView должен эффективно обрабатывать миллионы элементов.
В моем приложении всего несколько тысяч, а производительность уже очень плохая.Когда представление отображает всю сцену, масштабирование, hoverEnvents и любые другие вещи становятся невозможными.
Я пытался создать отношения родитель-потомок между элементами и разными флагами оптимизации, но результат все тот же.Я действительно надеюсь, что совершаю какую-то глупую ошибку, но после нескольких дней поиска пути решения проблемы я не нашел никакого решения.
Я был бы очень признателен за любую помощь!
Это воспроизводит мою проблему:
import sys
import random
from PyQt4.QtGui import *
NO_INDEX = False
OPTIMIZE = False
ITEM_COORD_CACHE = False
ITEM_DEVICE_CACHE = False
NESTED_ITEMS = False
class TestItem(QGraphicsEllipseItem):
def paint(self, painter, option, index):
return QGraphicsEllipseItem.paint(self, painter, option, index)
def hoverEnterEvent (self, e):
self.setBrush(QBrush(QColor("orange")))
def hoverLeaveEvent(self,e):
self.setBrush(QBrush(None))
if __name__ == '__main__':
n = int(sys.argv[1]) # Number of items. With 5000 I already
# have performance problems
app = QApplication(sys.argv)
scene = QGraphicsScene()
# Populates scene
prev = None
for i in xrange(n):
# Random geometry and position
r1 = random.randint(10, 100)
r2 = random.randint(10, 100)
x = random.randint(0, 500)
y = random.randint(0, 500)
item = TestItem(x, y, r1*2, r2*2)
item.setAcceptsHoverEvents(True)
if NESTED_ITEMS:
# Creates a parent child structure among items
if not prev:
scene.addItem(item)
else:
item.setParentItem(prev)
prev = item
else:
scene.addItem(item)
if ITEM_COORD_CACHE:
item.setCacheMode(QGraphicsItem.ItemCoordinateCache)
elif ITEM_DEVICE_CACHE:
item.setCacheMode(QGraphicsItem.DeviceCoordinateCache)
# Creates View
view = QGraphicsView(scene)
# Sets basic Flags for nice rendering
view.setRenderHints(QPainter.Antialiasing or QPainter.SmoothPixmapTransform)
if NO_INDEX:
view.setItemIndexMethod(QGraphicsScene.NoIndex);
if OPTIMIZE:
view.setOptimizationFlags(QGraphicsView.DontAdjustForAntialiasing
or QGraphicsView.DontClipPainter
or QGraphicsView.DontSavePainterState)
view.show()
sys.exit(app.exec_())
- Процессор Intel (R) Xeon (R) E5410 @ 2,33 ГГц
- Корпорация nVidia G84 [Quadro FX 1700]
- Ubuntu 9.04 64 бита
- qt4 4.5.3
- python-qt4 4.6