2012-09-15 20 views
3

我使用派生自QGraphicsItem的自定義類(Configuration),並將其對象添加到QGraphicsScene,然後將其顯示在QGraphicsView中。通常的東西。我正在做的是在多個步驟中繪製一棵樹,每步一步,每個節點都是我自定義的QGraphicsItemQGraphicsScene :: clear()清除場景,但不是視圖

enter image description here

下面的屏幕截圖。在簡單情況下,樹正好是順序的。

我首先繪製根節點。在用戶輸入字符串後觸發的信號將被觸發。

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()內部放置調試器斷點,這正是發生的情況!但是,當我運行它(無斷點),我所得到的是這樣的:

enter image description here

前面的樹了錯位,但不會被刪除。場景確實清除了其中的項目(打印出來),但視圖並未反映這一點。但是,再次,當我在drawRootSlot()內放置斷點時,視圖和場景同步。

我試圖刪除場景對象,並激活一個新的而不是調用c_scene->clear(),以保證它是空的。然後這些變化反映在視圖上(第一次繪圖始終有效)。

所以,我不知道從這些症狀中推斷出什麼。它按照預期的方式與斷點或新鮮的對象一起工作。它不使用時只使用c_scene->clear()。一個couldsay我只是搞砸了父母對象/子對象的關係,但clear()沒有從視圖中刪除項目...我試圖在c_scene->addItem()後調用它。

這是什麼魔芋?一個讓我相信我並不傻的人?

編輯:請告訴我有意思,可能是一個暗示,真正的問題是,當c_scene->clear()叫,樹的邊緣,這是正常的QGraphicsLineItem S,的確在所有情況下刪除(斷點或沒有) 。與他們做什麼不是 beeing custom?

回答

4

好的,撥打QGraphicsView::viewport().update()QGraphicsScene::clear()解決了我的問題。

但是,有沒有人有解釋上述行爲?

編輯:一旦這樣做別的東西,我偶然發現了問題的真正核心:我搞砸了我的GraphicItems的boundingRect(),所以它是visble項目下,僅接觸其下緣(其中刪除了,如截圖所示)。所以現在沒有任何電話update()方法是必要的。

0

我認爲當你爲圖形視圖調用fitInView()時,它會清除來自前一場景的任何工件的視圖。

-1

可以清除這兩個場景和圖形視圖

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

graphicsView =圖形的名稱查看

此代碼將同時刪除場景和圖形瀏覽

+0

有點事與願違 – Mikhail

相關問題