Qt Forum

    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Unsolved

    Call for Presentations - Qt World Summit

    Solved Update scene

    General and Desktop
    update scene qgraphicsview
    3
    34
    8554
    Loading More Posts
    • 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.
    • mandruk1331
      mandruk1331 last edited by

      Hello. How I can make an Update of the scene? What i mean is... for example I have a scene with drawn rectangles(all red color), and I want them to change color during the execution and compare them if one rectangle(it height number) is lower than the other one I want to swap places. How I can do that?

      Mandruk1331

      1 Reply Last reply Reply Quote 0
      • mrjj
        mrjj Lifetime Qt Champion last edited by

        Hi
        The QGraphicsItems in the scene has a setPos function
        you can use to move them around.

        mandruk1331 1 Reply Last reply Reply Quote 0
        • mandruk1331
          mandruk1331 @mrjj last edited by

          @mrjj and can I change the color of a rectangle during runtime? for example, I have a rectangle which is red and after 5 second it dynamically becomes blue

          Mandruk1331

          1 Reply Last reply Reply Quote 0
          • mrjj
            mrjj Lifetime Qt Champion last edited by mrjj

            Yes, it should be possible.
            How do you make it red in first place?

            Maybe via
            item->setBrush(QBrush(Qt::green));

            mandruk1331 1 Reply Last reply Reply Quote 0
            • mandruk1331
              mandruk1331 @mrjj last edited by

              @mrjj I'm trying to make an animation of the bubble sort algorithm, it starts that the first two rectangles are set as green(start point), and I was wondering how I can change the color of the third rectangle to animate the movement?

              #include <QThread>
              #define RANDOM_MAX 100
              #define QUANTITY_RANDOM_NUM 10
              MainWindow::MainWindow(QWidget *parent) :
              QMainWindow(parent),
              ui(new Ui::MainWindow)
              {
              ui->setupUi(this);
              error = new QErrorMessage(this);
              random_numbers_.clear();
              user_input_numbers_.clear();

              scene = new QGraphicsScene(this);
              ui->graphicsView_animation->setScene(scene);
              for(int i=0;i<QUANTITY_RANDOM_NUM;i++){
              random_numbers_.push_back(rand()%RANDOM_MAX);
              }
              ui->graphicsView_animation->setAlignment(Qt::AlignBottom| Qt::AlignRight);
              QBrush darkMagentaBrush(Qt::darkMagenta);
              QBrush greenBrush(Qt::green);
              QPen Pen(Qt::black);
              Pen.setWidth(2);
              // painter.drawText(temp);
              for(int i=0;i<random_numbers_.size();i++){
              QGraphicsRectItem temp = new QGraphicsRectItem(20+(i30),0-random_numbers_[i],28,random_numbers_[i]);
              temp->setPen(Pen);
              temp->setBrush(darkMagentaBrush);
              rectan.append(temp);
              }
              rectan[0]->setBrush(greenBrush);
              rectan[1]->setBrush(greenBrush);
              for(int i=0;i<random_numbers_.size();i++){
              scene->addItem(rectan.at(i));
              }
              //Bubble implement

              //for(int i=0;i<random_numbers_.size();i++){
              // scene->addRect(20+(i*30),0-random_numbers_[i],28,random_numbers_[i],Pen,darkMagentaBrush);
              //}

              }

              Mandruk1331

              1 Reply Last reply Reply Quote 0
              • mrjj
                mrjj Lifetime Qt Champion last edited by

                Hi
                You must keep a list or use the build in list to get the items.
                http://doc.qt.io/qt-5.5/qgraphicsscene.html#items
                Then you can change color or move them around.

                U seem to have list already ? rectan

                mandruk1331 1 Reply Last reply Reply Quote 0
                • mandruk1331
                  mandruk1331 @mrjj last edited by

                  @mrjj and how I can swap places the rectangle? I found smth like an Update function but I can't implement it

                  Mandruk1331

                  mrjj 1 Reply Last reply Reply Quote 0
                  • mrjj
                    mrjj Lifetime Qt Champion @mandruk1331 last edited by mrjj

                    @mandruk1331
                    But what u want to swap them?
                    Is it not enough to just swap the colors?

                    QPointF Pos1;
                    Pos1=rectan[0]->pos();
                    QPointF Pos2;
                    Pos2=rectan[1]->pos();
                    rectan[0]->setPos(pos2);
                    rectan[1]->setPos(pos1);

                    mandruk1331 1 Reply Last reply Reply Quote 0
                    • mandruk1331
                      mandruk1331 @mrjj last edited by

                      @mrjj No luck, it does not change the position

                      Mandruk1331

                      mrjj 1 Reply Last reply Reply Quote 0
                      • mrjj
                        mrjj Lifetime Qt Champion @mandruk1331 last edited by

                        @mandruk1331

                        Ok.
                        So what happened?
                        if you do
                        rectan[0]->setPos(0,0);

                        Does it move then?

                        mandruk1331 1 Reply Last reply Reply Quote 0
                        • mandruk1331
                          mandruk1331 @mrjj last edited by

                          @mrjj No, at the moment I'm trying to make smth like an Update func

                          void MainWindow::Shot(){

                          QGraphicsRectItem *Pos1;
                          

                          Pos1=rectan[0];
                          QGraphicsRectItem *Pos2;
                          Pos2=rectan[1];
                          scene->removeItem(rectan.at(0));
                          scene->removeItem(rectan.at(1));

                          rectan.at(0) = Pos2;
                          rectan.at(1) = Pos1;
                          scene->addItem(rectan.at(0));
                          scene->addItem(rectan.at(1));
                          }

                          Mandruk1331

                          1 Reply Last reply Reply Quote 0
                          • mrjj
                            mrjj Lifetime Qt Champion last edited by

                            Hi
                            at returns const.
                            This looks strange to me
                            rectan.at(0) = Pos2;
                            maybe
                            rectan[0] = Pos2

                            Also this will just swap the position in your list.
                            It will NOT change on screen.

                            You need to use pos() and SetPos
                            Not just swap in you array. You swap pointers.
                            You should swap QPointF using pos and setPos;

                            mandruk1331 1 Reply Last reply Reply Quote 0
                            • mandruk1331
                              mandruk1331 @mrjj last edited by

                              @mrjj I thought it will repaint the rects, because first I delete them and then I want to repaint them with new options

                              Mandruk1331

                              mrjj 1 Reply Last reply Reply Quote 0
                              • mrjj
                                mrjj Lifetime Qt Champion @mandruk1331 last edited by

                                @mandruk1331

                                Yes I guess it will repaint them on scene.
                                But it matters not for scene if you swap your own array.
                                The items still have same location as before as you do not setPos
                                (from code shown)

                                mandruk1331 1 Reply Last reply Reply Quote 0
                                • mandruk1331
                                  mandruk1331 @mrjj last edited by

                                  @mrjj and another one, I have a loop inside of a loop and when the second one finishes its iteration it won't singleshot on another iteration of the first loop

                                  for (int =0;i<10;i++){
                                  //and when i is 1 the second loop won't singleshot again
                                  for(int j=0;j<9;j++){
                                  SingleShot
                                  }
                                  }

                                  Mandruk1331

                                  1 Reply Last reply Reply Quote 0
                                  • mrjj
                                    mrjj Lifetime Qt Champion last edited by

                                    well
                                    Normally it works as many times as u set it up but hard to guess at with
                                    only "SingleShot".

                                    mandruk1331 1 Reply Last reply Reply Quote 0
                                    • mandruk1331
                                      mandruk1331 @mrjj last edited by

                                      @mrjj Why this code does not add the item, I don't understand, I remove it and then I want to re-add it with new options
                                      void MainWindow::Shot(){
                                      QGraphicsRectItem *t = new QGraphicsRectItem(rectan.at(0));

                                      scene->removeItem(rectan.at(1));

                                      rectan[1] = t;
                                      scene->addItem(rectan[1]);
                                      }

                                      Mandruk1331

                                      1 Reply Last reply Reply Quote 0
                                      • mrjj
                                        mrjj Lifetime Qt Champion last edited by

                                        @mandruk1331 said:

                                        Why do yo u give rectan.at(0) to constructor ?
                                        new QGraphicsRectItem(rectan.at(0));

                                        Try
                                        scene->addItem( new QGraphicsRectItem );
                                        and tell if that not add a new item?

                                        mandruk1331 1 Reply Last reply Reply Quote 0
                                        • mandruk1331
                                          mandruk1331 @mrjj last edited by mandruk1331

                                          @mrjj Ok, I managed to swap positions of the rectangles, but they swap not always, at first execution they swap on the other they don't, what could be the problem??

                                          void MainWindow::Shot(){
                                          QPointF Pos1;
                                          QPointF Pos2;
                                          Pos1 = rectan.at(5)->pos();
                                          Pos2 = rectan.at(6)->pos();

                                          rectan.at(6)->setBrush(Qt::blue);
                                          rectan.at(5)->setBrush(Qt::green);
                                          // rectan.at(5)->setBrush(Qt::blue);
                                          rectan.at(6)->setPos(Pos1.rx()-30,Pos1.ry());
                                          rectan.at(5)->setPos(Pos2.rx()+30,Pos2.ry());

                                          }
                                          Solved it)

                                          Mandruk1331

                                          1 Reply Last reply Reply Quote 0
                                          • mrjj
                                            mrjj Lifetime Qt Champion last edited by

                                            hi
                                            put qDebug() << "in shot:"
                                            in the
                                            MainWindow::Shot()
                                            to make sure its actually called mutiple times.

                                            mandruk1331 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post