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
Qt 6.11 is out! See what's new in the release blog

Error using foreach

Scheduled Pinned Locked Moved Unsolved General and Desktop
16 Posts 4 Posters 1.8k 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
    #1

    I'm having a problem using the foreach an I don't know why I am wrong

    If i do something like this, it works just fine

    foreach(QGraphicsItem *item,scene->items()){
    

    But if I do something like this(Remembering that QGrphicsItem is parent of Diagram Item):

    foreach(DiagramItem *itempos,scene->items()){
    

    it gives me the following error

    mainwindow.cpp:166:40: error: cannot initialize a variable of type 'DiagramItem *' with an lvalue of type 'QGraphicsItem *const'
    qglobal.h:1029:21: note: expanded from macro 'foreach'
    qglobal.h:1021:10: note: expanded from macro 'Q_FOREACH'

    how can i fix it?

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

      Hi,

      Is DiagramItem a subclass of QGraphicsItem ?
      If so, then just cast the pointer to it in the loop.

      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
      2
      • F Offline
        F Offline
        frnklu20
        wrote on last edited by
        #3

        Hi,

        yes it is!

        Now i think what is the problem

        foreach(QGraphicsItem *item,scene->items()){
        

        i defined scene as DiagramScene *scene, and when i do scene->items it returns a QGraphicsItem :( i don't know if i can fix it

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

          is there someway to tell to the computer that the object is member of a subclass too?
          like scene->item is for sure a QGraphicsItem, but is also a DiagramItem that is a subclass of DiagramItem

          i don't know if i was clear

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

            As already suggested, just cast it in the loop. Otherwise you have to add your own method to your class that returns that list of your subclass.

            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
            2
            • 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