我使用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,在所有情况下(断点与否)都确实被删除了。与他们不习惯有关吗?