顺利更新QGraphicsscene

时间:2014-11-11 22:00:25

标签: qt python-2.7 qt4 pyqt4 qgraphicsscene

您好我已经设法使用下面的代码为qgraphicsscene添加了许多qgraphicsitems

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

这允许我添加说600节点'到我的qgraphics场景,但是当我清除场景并添加另一个说1500个节点时,添加项目会阻止UI,我的整个应用程序会冻结几秒钟。 此外,每当我做像循环图形项目这样的事情说找到具有特定属性的节点时,主循环在我循环时冻结,

当有人对场景中的grpahicsscene / items进行操作时,是否有人可以建议一种保持UI响应的好方法。 理想情况下,即使我显示了几千个项目,也希望对场景进行平滑,无阻塞的更新。

1 个答案:

答案 0 :(得分:0)

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

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

以这种方式设计,您只需向场景中添加一个项目(节点图),这样就可以快速添加和删除节点,并且您还可以看到渲染场景时的性能提升,因为所有节点都是在一次调用中绘制的漆()。

当然,如果您需要通过单击并拖动它们来移动节点,您必须添加其他代码来处理检测项目中正在选择哪个节点并自行移动它。

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