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

Tea*_*low 4 debugging qt qgraphicsview qgraphicsitem qgraphicsscene

我使用Configuration派生自的自定义类 ( )QGraphicsItem并将其对象添加到 a 中QGraphicsScene,然后将其显示在QGraphicsView. 平时的东西。我所做的就是画一棵树,分多个步骤,一步一步,每个节点都在我的自定义QGraphicsItem.

在此处输入图片说明

这里有一个截图。在简单的情况下,树恰好是连续的。

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

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
}
Run Code Online (Sandbox Code Playgroud)

每个后续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);
    }

}
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

之前的树被破坏了,但没有被删除。场景确实清除了其项目(打印出来),但视图并未反映这一点。但同样,当我在drawRootSlot()视图中放置断点时,场景是同步的。

我试图删除场景对象,并创建一个新对象而不是调用c_scene->clear(),以保证它是空的。然后更改会反映在视图上(第一次绘图总是有效)。

所以,我不知道从这些症状中推断出什么。它与断点或新鲜QGraphicsScene对象一起按预期工作。仅使用c_scene->clear(). 有人可以说我只是搞砸了父对象/子对象关系,但clear() 确实从视图删除了项目......我尝试在c_scene->addItem().

这是什么法宝?一个让我相信我实际上并不愚蠢的人?

编辑:有趣的是,可能是对真正问题的暗示,当c_scene->clear()被调用时,树的边缘(正常QGraphicsLineItems)确实在所有情况下(断点与否)都被删除。东西与他们做beeing习惯吗?

Tea*_*low 5

好的,解决我的问题QGraphicsView::viewport().update()后打电话QGraphicsScene::clear()

但是有人对上述行为有解释吗?

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