我使用派生自QGraphicsItem
的自定義類(Configuration
),並將其對象添加到QGraphicsScene
,然後將其顯示在QGraphicsView
中。通常的東西。我正在做的是在多個步驟中繪製一棵樹,每步一步,每個節點都是我自定義的QGraphicsItem
。QGraphicsScene :: clear()清除場景,但不是視圖
下面的屏幕截圖。在簡單情況下,樹正好是順序的。
我首先繪製根節點。在用戶輸入字符串後觸發的信號將被觸發。
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()
,以保證它是空的。然後這些變化反映在視圖上(第一次繪圖始終有效)。
所以,我不知道從這些症狀中推斷出什麼。它按照預期的方式與斷點或新鮮的對象一起工作。它不使用時只使用c_scene->clear()
。一個couldsay我只是搞砸了父母對象/子對象的關係,但clear()
沒有從視圖中刪除項目...我試圖在c_scene->addItem()
後調用它。
這是什麼魔芋?一個讓我相信我並不傻的人?
編輯:請告訴我有意思,可能是一個暗示,真正的問題是,當c_scene->clear()
叫,樹的邊緣,這是正常的QGraphicsLineItem
S,的確在所有情況下刪除(斷點或沒有) 。與他們做什麼不是 beeing custom?
有點事與願違 – Mikhail