我正在尝试使用Qt Graphics Framework绘制具有大量节点(2000+)的图形。使用QGraphicsView
和QGraphicsScene
我可以使用addEllipse()
方法轻松绘制大量省略号,但使用setBrush()
更改项目的颜色太慢了。我也尝试使用QGraphicsPixmapItem
,然后只需切换像素图来改变颜色,但这也行不通。你能给我任何建议吗?使用OpenGL是我获得更好性能的唯一方法吗?
非常感谢。
编辑:我没有画笔示例。稍后会发布。 代码只是交换了椭圆的画笔,
编辑:Pixmap示例(代码在python中使用PyQt):
def startTest(self):
self.n = 1000
self.c = 1
self.scene = QtGui.QGraphicsScene()
self.scene.setSceneRect(0,0,500,500)
self.graphicsView.setScene(self.scene)
self.redPix = QtGui.QPixmap(5, 5)
self.redPix.fill(QtGui.QColor(255,0,0))
self.blackPix = QtGui.QPixmap(5, 5)
self.blackPix.fill(QtGui.QColor(0,0,0))
for i in range(0,self.n):
temp = QtGui.QGraphicsPixmapItem(self.redPix)
temp.setPos(random.uniform(10, 490),random.uniform(10, 490))
self.scene.addItem(temp)
def updateNodes(self):
if self.c:
for i in self.scene.items():
i.setPixmap(self.blackPix)
self.c = 0
else:
for i in self.scene.items():
i.setPixmap(self.redPix)
self.c = 1
答案 0 :(得分:0)
您是否尝试使用brush
方法的addEllipse()
参数进行指定?
QBrush blueBrush = QBrush(Qt::blue);
QPen noPen;
scene.addEllipse(x, y, w, h, noPen, blueBrush);
答案 1 :(得分:0)
好吧,可能它不是真正流行的答案..但根据我的经验,我不认为QGraphicsScene / View方式适用于1000k +对象的东西。它是一个很棒的框架,它有很多不错的功能,但它的设计方式使它对于大量的对象来说真的很慢。
你必须自己做的一些代码(如果你想用这么多的对象获得不错的性能)/我的意思是剪辑/过滤/可能泛化/如果你自己的任务依赖于比较真是太过分了渲染核心。
我多年来使用Qt并尝试使用View / Scene来处理严肃的图形组件(不同的地图格式视图SDK,2D图形设计视图)以及每次我最终都使用自制渲染引擎。
主要原因是Qt试图为您提供非常通用的,它是处理图形对象的非常好的方式。他们有非常好的转换矩阵概念,基于双的坐标,常见的样式方法,但价格是他们缺少重图形视图的所有最常见的优化原则。