Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 平滑更新QGraphicscene_Qt_Python 2.7_Qt4_Pyqt4_Qgraphicsscene - Fatal编程技术网

Qt 平滑更新QGraphicscene

Qt 平滑更新QGraphicscene,qt,python-2.7,qt4,pyqt4,qgraphicsscene,Qt,Python 2.7,Qt4,Pyqt4,Qgraphicsscene,您好,我已经成功地使用下面的代码向QGraphicscene添加了许多QGraphicsSitem 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

您好,我已经成功地使用下面的代码向QGraphicscene添加了许多QGraphicsSitem

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,整个应用程序会冻结几秒钟。 此外,每当我在GraphicsSitems中执行循环之类的操作时,比如查找具有特定属性的节点时,主线程在我循环时再次冻结

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

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

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

通过这种方式设计,您只需向场景中添加一项节点图即可快速添加和删除节点,并且还可以看到渲染场景时的性能改进,因为所有节点都在一次绘制调用中绘制

当然,如果需要通过单击并拖动节点来移动节点,则必须添加额外的代码来检测项目中正在选择的节点并自行移动


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

多线程。。。在另一个线程中创建节点,然后在主线程中将它们添加到UI中。。这是必需的,因为只有主线程可以更新场景。。从不同线程执行此操作将导致错误感谢Merlin069,我需要通过单击移动节点,甚至为默认的_nodeobject创建上下文菜单。在编写代码来检测/管理每个节点时,我甚至不知道从哪里开始。唉,游戏引擎/和粒子模拟人生是如何做到的?我能看到任何好的代码来说明如何解决这些问题吗?游戏引擎和粒子系统的工作方式与我描述的相同。也许这个问题的答案可以帮助您: