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. Error using foreach
Forum Updated to NodeBB v4.3 + New Features

Error using foreach

Scheduled Pinned Locked Moved Unsolved General and Desktop
16 Posts 4 Posters 1.5k 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.
  • F Offline
    F Offline
    frnklu20
    wrote on last edited by
    #6

    how can i do this?

    sorry, i don't what it is

    aha_1980A 1 Reply Last reply
    0
    • F frnklu20

      how can i do this?

      sorry, i don't what it is

      aha_1980A Offline
      aha_1980A Offline
      aha_1980
      Lifetime Qt Champion
      wrote on last edited by
      #7

      @frnklu20

      Could be something like this:

      foreach(QGraphicsItem *item,scene->items()){
          DiagramItem *itempos = (DiagramItem *)item;
          ...
      }
      

      Regards

      Qt has to stay free or it will die.

      1 Reply Last reply
      3
      • F Offline
        F Offline
        frnklu20
        wrote on last edited by
        #8

        oh thanks :))

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

          You also have qgraphicsitem_cast. Take a look at the documentation. There's on additional thing you have to do before using it.

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

          1 Reply Last reply
          3
          • F Offline
            F Offline
            frnklu20
            wrote on last edited by frnklu20
            #10
                                      if(item->type()==DiagramItem::Type && itempos->type()==DiagramItem::Type
                                              && itempos!=item){
                                      DiagramItem *itempos = (DiagramItem *)item;
                                      DiagramItem *item = (DiagramItem *)item;
            
                                      DiagramItem *startItem = qgraphicsitem_cast<DiagramItem *>(item);
                                      DiagramItem *endItem = qgraphicsitem_cast<DiagramItem *>(itempos);
                                      Arrow *arrow = new Arrow(startItem, endItem);
                                      arrow->setColor(scene->myLineColor);
                                      item->addArrow(arrow);
                                      itempos->addArrow(arrow);
                                      arrow->setZValue(-1000.0);
                                      scene->addItem(arrow);
                                      }
            

            like this? the program keep crashing when i do this

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

              You're not checking whether these pointers are nullptr.

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

              1 Reply Last reply
              0
              • F Offline
                F Offline
                frnklu20
                wrote on last edited by
                #12
                           if(item->type()==DiagramItem::Type && itempos->type()==DiagramItem::Type
                                 && itempos!=item && item!=nullptr && itempos!=nullptr){
                

                like this? the program still crashes

                but if i remove the lines:

                             item->addArrow(arrow);
                             itempos->addArrow(arrow);
                

                it doesn't crashes but it doesn't draw a line between the objects neither

                1 Reply Last reply
                0
                • F frnklu20
                                            if(item->type()==DiagramItem::Type && itempos->type()==DiagramItem::Type
                                                    && itempos!=item){
                                            DiagramItem *itempos = (DiagramItem *)item;
                                            DiagramItem *item = (DiagramItem *)item;
                  
                                            DiagramItem *startItem = qgraphicsitem_cast<DiagramItem *>(item);
                                            DiagramItem *endItem = qgraphicsitem_cast<DiagramItem *>(itempos);
                                            Arrow *arrow = new Arrow(startItem, endItem);
                                            arrow->setColor(scene->myLineColor);
                                            item->addArrow(arrow);
                                            itempos->addArrow(arrow);
                                            arrow->setZValue(-1000.0);
                                            scene->addItem(arrow);
                                            }
                  

                  like this? the program keep crashing when i do this

                  aha_1980A Offline
                  aha_1980A Offline
                  aha_1980
                  Lifetime Qt Champion
                  wrote on last edited by
                  #13

                  @frnklu20 Where does it crash exactly? Use a debugger and step through to find the faulty line.

                  Qt has to stay free or it will die.

                  1 Reply Last reply
                  0
                  • F Offline
                    F Offline
                    frnklu20
                    wrote on last edited by
                    #14

                    what i'm trying to do is drawing a line that is QGraphicsItem between 2 objects that already exist using the DiagramScene example form Qt

                    diagramscene.cpp

                    void DiagramScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
                    {
                           
                        if (mouseEvent->button() != Qt::LeftButton)
                            return;
                    
                        DiagramItem *item;
                        switch (myMode) {
                               case InsertLine:
                                line = new QGraphicsLineItem(QLineF(mouseEvent->scenePos(),
                                                            mouseEvent->scenePos()));
                                line->setPen(QPen(myLineColor, 2));
                                addItem(line);
                                break;
                    }
                    }
                    
                    void DiagramScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
                    {
                        if (myMode == InsertLine && line != 0) {
                            QLineF newLine(line->line().p1(), mouseEvent->scenePos());
                            line->setLine(newLine);
                        } else if (myMode == MoveItem) {
                            QGraphicsScene::mouseMoveEvent(mouseEvent);
                        }
                    }
                    
                    void DiagramScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent)
                    {
                        if (line != 0 && myMode == InsertLine) {
                            QList<QGraphicsItem *> startItems = items(line->line().p1());
                            if (startItems.count() && startItems.first() == line)
                                startItems.removeFirst();
                            QList<QGraphicsItem *> endItems = items(line->line().p2());
                            if (endItems.count() && endItems.first() == line)
                                endItems.removeFirst();
                    
                            removeItem(line);
                            delete line;
                    
                    
                            if (startItems.count() > 0 && endItems.count() > 0 &&
                                startItems.first()->type() == DiagramItem::Type &&
                                endItems.first()->type() == DiagramItem::Type &&
                                startItems.first() != endItems.first()) {
                                DiagramItem *startItem = qgraphicsitem_cast<DiagramItem *>(startItems.first());
                                DiagramItem *endItem = qgraphicsitem_cast<DiagramItem *>(endItems.first());
                                Arrow *arrow = new Arrow(startItem, endItem);
                                arrow->setColor(myLineColor);
                                startItem->addArrow(arrow);
                                endItem->addArrow(arrow);
                                arrow->setZValue(-1000.0);
                                addItem(arrow);  #and here it draws the line
                                arrow->updatePosition()
                    }
                    }
                    

                    and i what i want to draw a line between 2 objects but not by creating a line with insertline mode

                    mainwindow.cpp

                    void MainWindow::infoItem()
                    {
                        foreach (QGraphicsItem *item, scene->selectedItems()){#the item object is the selected one
                           if (item->type() == DiagramItem::Type){
                    
                    if(item->data(0)=="Carga"){#carga is type of object
                    CargaDialog *carga=new CargaDialog;
                                  carga->setModal(true);
                    #its a dialog that contains a combo box, an the items of this combo box are the items that are in the screen that are not cargas
                    #and after select an item in the combo box, it will draw a line between the carga and the item selected
                    
                    if(carga->getItem()!="Selecione um barramento" && carga->getItem()!=(item->data(1)).toString()){
                                      #getItem() is a function that return the name of item selected in the combo box
                                      item->setData(4,carga->getItem());
                                      foreach(QGraphicsItem *itempos,scene->items()){
                                          if(itempos->data(1)==carga->getItem())
                                         #i use the data(1) slot of the objects to store the name of each object, so now i looking for the QGraphicsItem that have the same name as the item selected
                                          {
                    
                                              if(item->type()==DiagramItem::Type && itempos->type()==DiagramItem::Type
                                                      && itempos!=item && item!=nullptr && itempos!=nullptr){
                                              DiagramItem *itempos = (DiagramItem *)item;
                                              DiagramItem *item = (DiagramItem *)item;
                    
                                              DiagramItem *startItem = qgraphicsitem_cast<DiagramItem *>(item);
                                              DiagramItem *endItem = qgraphicsitem_cast<DiagramItem *>(itempos);
                                              Arrow *arrow = new Arrow(startItem, endItem);
                                              arrow->setColor(scene->myLineColor);
                                              item->addArrow(arrow);#if i remove these two lines, the program doesn't crash but it doesn't draw a line on the screen
                                              itempos->addArrow(arrow);
                                              arrow->setZValue(-1000.0);
                                              scene->addItem(arrow);
                                              arrow->updatePosition();
                                              }
                                          }
                    

                    i don't know why this is going on, because it's exactaly the same this that is done in diagramscene.cpp

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

                      As already suggested, start your application with the debugger and check the stack trace.

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

                      1 Reply Last reply
                      1
                      • fcarneyF Offline
                        fcarneyF Offline
                        fcarney
                        wrote on last edited by
                        #16

                        @frnklu20 said in Error using foreach:

                        (DiagramItem *)item;

                        Should this be done this way?

                        DiagramItem *itempos = dynamic_cast<DiagramItem*>(item);
                        // check if itempos is null
                        

                        This gives us some more type safety no?

                        C++ is a perfectly valid school of magic.

                        1 Reply Last reply
                        2

                        • Login

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