我使用从Configuration
派生的自定义类(QGraphicsItem
)并将其对象添加到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
}
每个后续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()
,以保证它为空。然后更改将反映在视图上(第一次绘制始终有效)。
所以,我不知道从这些症状中推断出什么。它可以按预期使用断点或freshh QGraphicsScene
对象。仅使用c_scene->clear()
时不会。我可能只是搞砸了父对象/子对象关系,但是clear()
从视图中移除了项目...我尝试在c_scene->addItem()
之后立即调用它。
这个什么是灵魂?一个让我相信我实际上并不愚蠢的东西?
编辑:有趣并且可能暗示真正的问题,是当调用c_scene->clear()
时,树的边缘是正常QGraphicsLineItem
s确实在所有情况下都被删除(断点与否)。与他们有关的事情不是自定义?
答案 0 :(得分:4)
好的,在QGraphicsView::viewport().update()
解决我的问题后调用QGraphicsScene::clear()
。
但有没有人对上述行为有解释?
编辑:在做了其他事情后,我偶然发现了问题的实际核心:我搞砸了我的GraphicItems的boundingRect()
,所以它低于隐藏项目,只触及它的下边缘(已删除,如截图所示)。所以现在不需要调用任何update()
方法。
答案 1 :(得分:0)
我认为当您为图形视图调用此fitInView()时,它会清除前一场景中保留的任何工件的视图。
答案 2 :(得分:-1)
您可以清除场景和图形视图
scene->clear();
ui->graphicsView->items().clear();
graphicsView =图形视图的名称
此代码将删除场景和图形视图