很多QGraphicsItem

时间:2013-04-16 11:32:35

标签: c++ qt

我正在尝试使用Qt Graphics Framework绘制具有大量节点(2000+)的图形。使用QGraphicsViewQGraphicsScene我可以使用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

2 个答案:

答案 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试图为您提供非常通用的,它是处理图形对象的非常好的方式。他们有非常好的转换矩阵概念,基于的坐标,常见的样式方法,但价格是他们缺少图形视图的所有最常见的优化原则。