我是Qt(PySide)的新手,我正在尝试绘制一个网格地图'有效率的。然而,我的解决方案使用10k + QGraphicsRectItem减速停止。
目前它的工作原理如下:
class GridMapView(QObject, QGraphicsItemGroup):
def __init__(self, mapWidth, mapHeight, cellSize):
QObject.__init__(self)
QGraphicsItemGroup.__init__(self)
self.mapWidth = mapWidth
self.mapHeight = mapHeight
self.cellSize = cellSize
self.graphicCells = []
#Create cells.
for x in range(self.mapWidth / self.cellSize):
self.graphicCells.append([])
for y in range(self.mapHeight / self.cellSize):
self.graphicCells[x].append(QGraphicsRectItem(x * self.cellSize, y * self.cellSize, self.cellSize, self.cellSize))
self.graphicCells[x][-1].setBrush(QBrush(QColor('grey')))
self.addToGroup(self.graphicCells[x][-1])
self.setPos(-mapWidth/2, -mapHeight/2)
@Slot(Point, int)
def onCellUpdated(self, index, state):
cell = self.graphicCells[index.x][index.y]
if state == CellStates.UNKNOWN:
cell.setBrush(QBrush(QColor('grey')))
cell.setVisible(True)
elif state == CellStates.FREE:
cell.setVisible(False)
elif state == CellStates.OCCUPIED:
cell.setBrush(QBrush(QColor('black')))
cell.setVisible(True)
在创建期间填充初始网格。当触发适当的信号时,将更新特定的单元格。这种更新很少发生,我的假设是Qt只绘制了哪些变化。
整个地图'在我的视口中可见,并且禁用渲染使我的应用程序运行得非常好。
我尝试过设置QGraphicsView.NoViewportUpdate,但它仍然会更新整个视图。我希望它能要求我打电话给.update()'。
这种做法从一开始就有缺陷吗?提前谢谢。