4

我使用Configuration派生自的自定义类 () QGraphicsItem,并将其对象添加到 aQGraphicsScene中,然后将其显示在 a 中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
}

每个后续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()这正是发生的事情!但是当我运行它(没有断点)时,我得到的是:

在此处输入图像描述

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

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

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

这是什么法术?让我相信我实际上并不愚蠢?

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

4

3 回答 3

5

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

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

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

于 2012-09-16T09:52:45.790 回答
0

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

于 2012-09-18T15:49:44.673 回答
-1

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

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

graphicsView = 图形视图的名称

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

于 2015-11-15T16:14:38.737 回答