Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. qgraphicsscene remove item but sometime still in view
Forum Updated to NodeBB v4.3 + New Features

qgraphicsscene remove item but sometime still in view

Scheduled Pinned Locked Moved Unsolved General and Desktop
14 Posts 6 Posters 2.3k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • C Offline
    C Offline
    choujayylyxm
    wrote on last edited by choujayylyxm
    #5

    Ok,I understood.Sorry for that.
    Here is a simple example:

       //click a button to switch line and run below code
      //  a QGraphicsView scene()->addItem(m_chart);
      //replace a new line
      QLineSeries * tmp = static_cast<QLineSeries *>(m_chart->series()[0]);
      QList<QPointF> dataPointList;
      //set new axis range
      m_chart->axisX()->setRange(0,dataVec[dataVec.size()-1].x());
      m_chart->axisY()->setRange(-qAbs(yMax)*1.2f, qAbs(yMax)*1.2f);
      tmp->replace(dataPointList);
      
      
      //delete last line a flag(circle)item in the qchart ,m_calloutsList is keep flags list
      for(auto& item : m_calloutsList[nDataIndex])
      {
          //item.prepareGeomtryChange //try it not work
          scene()->removeItem(item);
      }
      //add current line flag item
      for(auto& item2 : m_calloutsList[nDataIndex])
      {
      //item2.prepareGeomtryChange //try it not work
          scene()->addItem(item2);
      }
    

    1.png

    1 Reply Last reply
    0
    • SGaistS Offline
      SGaistS Offline
      SGaist
      Lifetime Qt Champion
      wrote on last edited by
      #6

      Please provide a minimal compilable example that shows the behavior.

      Interested in AI ? www.idiap.ch
      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

      C 1 Reply Last reply
      0
      • C Offline
        C Offline
        choujayylyxm
        wrote on last edited by choujayylyxm
        #7

        @SGaist OK,I upload a minimal compilable example for github
        github link

        Is it okay? It base on qt example callout

        1 Reply Last reply
        0
        • SGaistS SGaist

          Please provide a minimal compilable example that shows the behavior.

          C Offline
          C Offline
          choujayylyxm
          wrote on last edited by
          #8

          @SGaist Fine,I keep working on it.

          1 Reply Last reply
          0
          • SGaistS Offline
            SGaistS Offline
            SGaist
            Lifetime Qt Champion
            wrote on last edited by
            #9

            Did you try to call hide on your items before removing them from the scene ?

            One thing: there's no need to make the QGraphicsItemObject. A simple QGraphicsRectItem is enough for your purpose.

            Interested in AI ? www.idiap.ch
            Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

            S 1 Reply Last reply
            0
            • Ketan__Patel__0011K Offline
              Ketan__Patel__0011K Offline
              Ketan__Patel__0011
              wrote on last edited by
              #10

              try to After

              remove the item from your qgraphicsscene

                      scene()->removeItem(YOURITEM_OBJECT);
                      ui->graphicsview->viewport()->update();
                      ui->graphicsview->update();
                      ui->graphicsview->show();
              
              1 Reply Last reply
              0
              • SGaistS SGaist

                Did you try to call hide on your items before removing them from the scene ?

                One thing: there's no need to make the QGraphicsItemObject. A simple QGraphicsRectItem is enough for your purpose.

                S Offline
                S Offline
                StudentScripter
                wrote on last edited by StudentScripter
                #11

                @SGaist Having a question regarding calling hide cause i encounter similar problems.
                In my scene i want to add some items when another item is clicked, but when i unselect the other items the items added shall be removed aswell.

                NOW as i figured when just calling remove onto the other items the programm crashes cause there is still the flag "isVisible" given back on remove.

                Is it in this case fine to just case setVisible(false) and than scene()->removeItem(), because than it don't crashes. But im not sure if thats proper way to do it or is it just a whacky fix.

                Here is my code that draws the items when the Owner item is clicked:

                void ITMHandleDraw::drawHandlesIfNecessary()
                {
                    //qDebug() << "DrawHandles" << ShouldDrawHandles << ownerItem->isSelected();
                    if(!ownerItem){
                        qWarning() << "ITMHandleDraw : No ownerItem set. Not drawing any\
                                      handle. Please call setOwnerItem on your ITMHandleDraw subclass";
                                      return;
                    }
                
                    if(ownerItem->isSelected()){
                        drawHandles();
                
                    }else if(!ownerItem->isSelected()){
                        handlesAddedToScene = false;
                
                        // Ensure handles are removed from the scene before deletion
                        //Remove the handles
                        foreach (ITMHandleLogic * ITMHandleLogic, handleList) {
                           // ITMHandleLogic->setVisible(false);
                
                            ITMHandleLogic->scene()->removeItem(ITMHandleLogic);
                            qDebug() << ITMHandleLogic->isVisible();
                        }
                            qDeleteAll(handleList);
                            handleList.clear();
                
                    }
                
                }
                
                
                jsulmJ JonBJ 2 Replies Last reply
                0
                • S StudentScripter

                  @SGaist Having a question regarding calling hide cause i encounter similar problems.
                  In my scene i want to add some items when another item is clicked, but when i unselect the other items the items added shall be removed aswell.

                  NOW as i figured when just calling remove onto the other items the programm crashes cause there is still the flag "isVisible" given back on remove.

                  Is it in this case fine to just case setVisible(false) and than scene()->removeItem(), because than it don't crashes. But im not sure if thats proper way to do it or is it just a whacky fix.

                  Here is my code that draws the items when the Owner item is clicked:

                  void ITMHandleDraw::drawHandlesIfNecessary()
                  {
                      //qDebug() << "DrawHandles" << ShouldDrawHandles << ownerItem->isSelected();
                      if(!ownerItem){
                          qWarning() << "ITMHandleDraw : No ownerItem set. Not drawing any\
                                        handle. Please call setOwnerItem on your ITMHandleDraw subclass";
                                        return;
                      }
                  
                      if(ownerItem->isSelected()){
                          drawHandles();
                  
                      }else if(!ownerItem->isSelected()){
                          handlesAddedToScene = false;
                  
                          // Ensure handles are removed from the scene before deletion
                          //Remove the handles
                          foreach (ITMHandleLogic * ITMHandleLogic, handleList) {
                             // ITMHandleLogic->setVisible(false);
                  
                              ITMHandleLogic->scene()->removeItem(ITMHandleLogic);
                              qDebug() << ITMHandleLogic->isVisible();
                          }
                              qDeleteAll(handleList);
                              handleList.clear();
                  
                      }
                  
                  }
                  
                  
                  jsulmJ Offline
                  jsulmJ Offline
                  jsulm
                  Lifetime Qt Champion
                  wrote on last edited by
                  #12

                  @StudentScripter said in qgraphicsscene remove item but sometime still in view:

                  foreach (ITMHandleLogic * ITMHandleLogic, handleList) {

                  Is this your real code?! Because it can't even compile.
                  I also don't get what this line is supposed to do:

                  ITMHandleLogic->scene()->removeItem(ITMHandleLogic);
                  

                  https://forum.qt.io/topic/113070/qt-code-of-conduct

                  JonBJ 1 Reply Last reply
                  0
                  • jsulmJ jsulm

                    @StudentScripter said in qgraphicsscene remove item but sometime still in view:

                    foreach (ITMHandleLogic * ITMHandleLogic, handleList) {

                    Is this your real code?! Because it can't even compile.
                    I also don't get what this line is supposed to do:

                    ITMHandleLogic->scene()->removeItem(ITMHandleLogic);
                    
                    JonBJ Offline
                    JonBJ Offline
                    JonB
                    wrote on last edited by
                    #13

                    @jsulm said in qgraphicsscene remove item but sometime still in view:

                    foreach (ITMHandleLogic * ITMHandleLogic, handleList) {

                    Is this your real code?! Because it can't even compile.

                    Don't know if you maybe thought this was a for, but it's a foreach and compiles fine? As does e.g.

                    QList<QString *> QStringList;
                    foreach (QString * QString, QStringList) {
                    

                    Unfortunately the OP has a predilection for naming variables identically to their types, which is not helpful but (at least in this case) works fine.

                    I also don't get what this line is supposed to do:

                    ITMHandleLogic->scene()->removeItem(ITMHandleLogic);

                    Given ITMHandleLogic which is a pointer to a QGraphicsItem this gets to the QGraphicsScene from it via QGraphicsItem::scene() to call QGraphicsItem::removeItem(ITMHandleLogic). Alternatively the OP could just have called delete ITMHandleLogic to delete and remove (per Qt internal code for QGraphicsItem destructor which removes from scene).

                    1 Reply Last reply
                    1
                    • S StudentScripter

                      @SGaist Having a question regarding calling hide cause i encounter similar problems.
                      In my scene i want to add some items when another item is clicked, but when i unselect the other items the items added shall be removed aswell.

                      NOW as i figured when just calling remove onto the other items the programm crashes cause there is still the flag "isVisible" given back on remove.

                      Is it in this case fine to just case setVisible(false) and than scene()->removeItem(), because than it don't crashes. But im not sure if thats proper way to do it or is it just a whacky fix.

                      Here is my code that draws the items when the Owner item is clicked:

                      void ITMHandleDraw::drawHandlesIfNecessary()
                      {
                          //qDebug() << "DrawHandles" << ShouldDrawHandles << ownerItem->isSelected();
                          if(!ownerItem){
                              qWarning() << "ITMHandleDraw : No ownerItem set. Not drawing any\
                                            handle. Please call setOwnerItem on your ITMHandleDraw subclass";
                                            return;
                          }
                      
                          if(ownerItem->isSelected()){
                              drawHandles();
                      
                          }else if(!ownerItem->isSelected()){
                              handlesAddedToScene = false;
                      
                              // Ensure handles are removed from the scene before deletion
                              //Remove the handles
                              foreach (ITMHandleLogic * ITMHandleLogic, handleList) {
                                 // ITMHandleLogic->setVisible(false);
                      
                                  ITMHandleLogic->scene()->removeItem(ITMHandleLogic);
                                  qDebug() << ITMHandleLogic->isVisible();
                              }
                                  qDeleteAll(handleList);
                                  handleList.clear();
                      
                          }
                      
                      }
                      
                      
                      JonBJ Offline
                      JonBJ Offline
                      JonB
                      wrote on last edited by
                      #14

                      @StudentScripter said in qgraphicsscene remove item but sometime still in view:

                      calling remove onto the other items the programm crashes cause there is still the flag "isVisible" given back on remove.

                      Is it in this case fine to just case setVisible(false) and than scene()->removeItem(), because than it don't crashes.

                      First, why do you care about isVisible() or setVisible() at all in your situation? Once you removeItem() the QGraphicsItem will no longer be shown on the scene/view so it's not relevant.

                      But given that you want to use it. After removeItem() the item no longer belongs to the scene in any way. I would guess that QGraphicsItem::visible() needs to access the scene from the item in order to do whatever calculations are required for "visibility". But for a removed item the scene is probably "undefined" (or maybe nullptr) and hence it "crashes". Do not call any methods on a QGraphicsItem once it has been removed from the scene. If you really want to set/test visibility do so before removeItem().

                      1 Reply Last reply
                      0

                      • Login

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt Extensions
                      • Unsolved