1

我正在尝试使用 Qt Graphics Framework 绘制具有大量节点(2000+)的图形。使用QGraphicsViewQGraphicsScene我可以很容易地用这个方法画出大量的椭圆addEllipse(),但是改变项目的颜色setBrush()太慢了。我也尝试过使用QGraphicsPixmapItem然后切换像素图来改变颜色,但这也不起作用。你能给我任何建议如何做到这一点吗?使用 OpenGL 是获得更好性能的唯一方法吗?

非常感谢。

编辑:我没有画笔示例。稍后会发布。代码只是交换椭圆的画笔而已,

编辑:像素图示例(代码在 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
4

2 回答 2

1

好吧,可能它不会是真正受欢迎的答案.. 但根据我的经验,我认为 QGraphicsScene/View 方式不适用于具有 1000k+ 对象的东西。这是一个很棒的框架,它有很多不错的特性,但是它的设计方式使得它对于大量对象来说真的很慢。

你必须自己做的大量代码(如果你想用这么多对象获得不错的性能)/我的意思是剪辑/过滤/可能泛化/如果你自己制作依赖于任务的渲染核心,这真的太多了。

多年来,我经常使用 Qt,并尝试将 View/Scene 用于严肃的图形组件(不同的地图格式视图 SDK、2D 图形设计视图),每次我最终都使用自制的渲染引擎。

主要原因是 Qt 试图为您提供非常通用的,并且它是处理图形对象的非常好的方法。他们有很好的变换矩阵概念,基坐标,常见的样式方法,但代价是他们缺少所有最常见的图形视图优化原则。

于 2013-04-16T15:52:13.883 回答
0

您是否尝试过使用方法的brush参数指定addEllipse()

QBrush blueBrush = QBrush(Qt::blue);
QPen noPen;
scene.addEllipse(x, y, w, h, noPen, blueBrush);
于 2013-04-16T11:51:18.620 回答