QGraphicsScene :: clear()清除场景但不是视图

时间:2012-09-15 16:24:38

标签: qt debugging qgraphicsview qgraphicsitem qgraphicsscene

我使用从Configuration派生的自定义类(QGraphicsItem)并将其对象添加到QGraphicsScene,然后显示在QGraphicsView中。通常的东西。我正在做的是绘制一个树,分多步,一步一步,每个节点都是我的自定义QGraphicsItem

enter image description here

这是截图。在简单的情况下,树恰好是顺序的。

我首先绘制根节点。触发该信号的信号在用户输入字符串后触发。

void MainWindow::drawRootSlot(ConfigTreeBuilder & builder)//this is a slot
{
    c_scene->clear();  //the clear cause headache. i'll expain

    Configuration* conf = new Configuration(builder.getNodesX(), builder.getNodesY(),builder.getNodesConfig());
//code
    c_scene->addItem(conf);
//code
}

每个后续Configuration都在另一个插槽中绘制。

void MainWindow::configTreeSlot(ConfigTreeBuilder & builder)    //SLOT!!!
{
    while(builder.chooseNextNode()) {

        Configuration* conf = new Configuration(builder.getNodesX(), builder.getNodesY(), builder.getNodesConfig());

       //code, while loop    
            QGraphicsLineItem *edge = c_scene->addLine(QLineF(*(parentsPoint), conf->getLeftOrigin()));
            edge->setZValue(-1); //below the Configuration item


        c_scene->addItem(conf);
    }

}

第一次完成时一切正常。当我输入一个新字符串,重置树时,就会发生黑暗魔法。我期望它做的是:调用drawRootSlot(),删除整个树(c_scene->clear()),绘制一个新的根节点。而且,如果我在drawRootSlot()中放置一个调试器断点,这正是发生的事情!但是当我运行它(没有断点)时,我得到的是:

enter image description here

上一棵树被破坏了,但没有被删除。场景确实被清除了它的项目(打印出来)但是视图没有反映出来。但是,当我在视图drawRootSlot()内放置断点并且场景同步时。

我尝试删除场景对象,并设置新的场景对象而不是调用c_scene->clear(),以保证它为空。然后更改将反映在视图上(第一次绘制始终有效)。

所以,我不知道从这些症状中推断出什么。它可以按预期使用断点或freshh QGraphicsScene对象。仅使用c_scene->clear()时不会。我可能只是搞砸了父对象/子对象关系,但是clear() 从视图中移除了项目...我尝试在c_scene->addItem()之后立即调用它。

这个什么是灵魂?一个让我相信我实际上并不愚蠢的东西?

编辑:有趣并且可能暗示真正的问题,是当调用c_scene->clear()时,树的边缘是正常QGraphicsLineItem s确实在所有情况下都被删除(断点与否)。与他们有关的事情不是自定义?

3 个答案:

答案 0 :(得分:4)

好的,在QGraphicsView::viewport().update()解决我的问题后调用QGraphicsScene::clear()

但有没有人对上述行为有解释?

编辑:在做了其他事情后,我偶然发现了问题的实际核心:我搞砸了我的GraphicItems的boundingRect(),所以它低于隐藏项目,只触及它的下边缘(已删除,如截图所示)。所以现在不需要调用任何update()方法。

答案 1 :(得分:0)

我认为当您为图形视图调用此fitInView()时,它会清除前一场景中保留的任何工件的视图。

答案 2 :(得分:-1)

您可以清除场景和图形视图

scene->clear();
ui->graphicsView->items().clear();

graphicsView =图形视图的名称

此代码将删除场景和图形视图