平滑更新 QGraphicsscene

Posted

技术标签:

【中文标题】平滑更新 QGraphicsscene【英文标题】:Smoothly Updating QGraphicsscene 【发布时间】:2014-11-11 22:00:24 【问题描述】:

您好,我已经设法使用下面的代码将一些 qgraphicsitems 添加到 qgraphicsscene 中

def generate_graph_and_update_scene(self):

try:
    local_params=locals() #for error log  get local paramters
    this_function_name=sys._getframe().f_code.co_name #for error log  get function name


    self.vertex_dict.clear()
    self.clear() #clear graphicsscene

    self.graph_pos.clear() #clear graph position holder object

    #function that generates the node data
    root_nodes=my_database_query.get_nodes_information()
    for node in root_nodes:
        # add nodes to nx.graph object
        self.nx_graph.add_node(node['column1'])


    # create networkx graph
    self.graph_pos = nx.spring_layout(self.nx_graph, iterations=25,scale=10)

    for node in self.nx_graph.nodes(): # Add nodes to qgraphicsscene

        v=default_nodeobject.my_ellipse(node,self.graph_pos)               
        self.addItem(v) # Add ellipse to qgraphics scene

    for edge in self.nx_graph.edges():
        self.addItem(defaultedgeview.edgeview(edge[0], edge[1],self.graph_pos))#add edges to qgraphicscene

except:
    #Exception handler
    message=str(sys.exc_info())
    message=message + str(local_params)+" "+ str(this_function_name)
    print message

这允许我向我的 qgraphics 场景添加 600 个“节点”,但是当我清除场景并添加另一个说 1500 个节点时,添加项目会阻塞 UI 并且我的整个应用程序会冻结几秒钟。 此外,每当我在执行诸如循环图形项之类的操作时说寻找具有特定属性的节点时,主线程在我循环时再次冻结,

在对场景中的 grpahicsscene/项目进行处理时,任何人都可以提出一种保持 UI 响应的好方法。 理想情况下,即使我有几千个项目显示,也希望对场景进行流畅、无阻塞的更新。

【问题讨论】:

多线程 ... 在另一个线程中创建节点并在主线程中将它们添加到 UI .. 这是必要的,因为只有主线程可以更新场景 .. 从不同的线程这样做会导致错误 【参考方案1】:

这里的问题是将每个节点作为一个图形项进行管理。添加和删​​除场景,以及渲染每个项目都需要时间。有了这么多项目,我建议您设计不同的方式。

将节点图视为单个自定义图形项,它存储一组节点并将它们作为一个单元进行管理,而不是 600 多个单独的项。

以这种方式设计,您只需将一个项目添加到场景(节点图),这允许快速添加和删除节点,您还将看到渲染场景的性能改进,因为所有节点都在一次调用中绘制油漆()。

当然,如果您需要通过单击和拖动来移动节点,则必须添加额外的代码来处理检测项目中选择了哪个节点并自行移动它。

但是,这是处理场景中如此大量项目的最佳方式。

【讨论】:

感谢 Merlin069,我需要通过单击来移动节点,甚至还有 default_nodeobject 的上下文菜单。在编写代码以检测/管理每个节点时,我什至不知道如何开始。唉,游戏引擎/和粒子模拟游戏是如何做到的?有什么好的代码可以说明如何解决这些问题? 游戏引擎和粒子系统按照我描述的方式工作。也许这个问题的答案可能会对您有所帮助:***.com/questions/18397603/…

以上是关于平滑更新 QGraphicsscene的主要内容,如果未能解决你的问题,请参考以下文章

Swarm平滑升级回滚

nginx通过shell脚本平滑升级版本

如何在不能连接互联网的实验室中为多台ubuntu服务器平滑升级版本和随时安装最新更新包?

youcans 的 OpenCV 例程200篇142. 基于灰度形态学的图像平滑

Nginx平滑升级版本!

nginx的平滑升级