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. Update scene
QtWS25 Last Chance

Update scene

Scheduled Pinned Locked Moved Solved General and Desktop
updatesceneqgraphicsview
34 Posts 3 Posters 12.1k Views
  • 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.
  • mrjjM mrjj

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

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

    mandruk1331M Offline
    mandruk1331M Offline
    mandruk1331
    wrote on last edited by
    #5

    @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
    0
    • mrjjM Offline
      mrjjM Offline
      mrjj
      Lifetime Qt Champion
      wrote on last edited by
      #6

      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

      mandruk1331M 1 Reply Last reply
      0
      • mrjjM mrjj

        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

        mandruk1331M Offline
        mandruk1331M Offline
        mandruk1331
        wrote on last edited by
        #7

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

        Mandruk1331

        mrjjM 1 Reply Last reply
        0
        • mandruk1331M mandruk1331

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

          mrjjM Offline
          mrjjM Offline
          mrjj
          Lifetime Qt Champion
          wrote on last edited by mrjj
          #8

          @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);

          mandruk1331M 1 Reply Last reply
          0
          • mrjjM 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);

            mandruk1331M Offline
            mandruk1331M Offline
            mandruk1331
            wrote on last edited by
            #9

            @mrjj No luck, it does not change the position

            Mandruk1331

            mrjjM 1 Reply Last reply
            0
            • mandruk1331M mandruk1331

              @mrjj No luck, it does not change the position

              mrjjM Offline
              mrjjM Offline
              mrjj
              Lifetime Qt Champion
              wrote on last edited by
              #10

              @mandruk1331

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

              Does it move then?

              mandruk1331M 1 Reply Last reply
              0
              • mrjjM mrjj

                @mandruk1331

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

                Does it move then?

                mandruk1331M Offline
                mandruk1331M Offline
                mandruk1331
                wrote on last edited by
                #11

                @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
                0
                • mrjjM Offline
                  mrjjM Offline
                  mrjj
                  Lifetime Qt Champion
                  wrote on last edited by
                  #12

                  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;

                  mandruk1331M 1 Reply Last reply
                  0
                  • mrjjM mrjj

                    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;

                    mandruk1331M Offline
                    mandruk1331M Offline
                    mandruk1331
                    wrote on last edited by
                    #13

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

                    Mandruk1331

                    mrjjM 1 Reply Last reply
                    0
                    • mandruk1331M mandruk1331

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

                      mrjjM Offline
                      mrjjM Offline
                      mrjj
                      Lifetime Qt Champion
                      wrote on last edited by
                      #14

                      @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)

                      mandruk1331M 1 Reply Last reply
                      0
                      • mrjjM mrjj

                        @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)

                        mandruk1331M Offline
                        mandruk1331M Offline
                        mandruk1331
                        wrote on last edited by
                        #15

                        @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
                        0
                        • mrjjM Offline
                          mrjjM Offline
                          mrjj
                          Lifetime Qt Champion
                          wrote on last edited by
                          #16

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

                          mandruk1331M 1 Reply Last reply
                          0
                          • mrjjM mrjj

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

                            mandruk1331M Offline
                            mandruk1331M Offline
                            mandruk1331
                            wrote on last edited by
                            #17

                            @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
                            0
                            • mrjjM Offline
                              mrjjM Offline
                              mrjj
                              Lifetime Qt Champion
                              wrote on last edited by
                              #18

                              @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?

                              mandruk1331M 1 Reply Last reply
                              0
                              • mrjjM mrjj

                                @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?

                                mandruk1331M Offline
                                mandruk1331M Offline
                                mandruk1331
                                wrote on last edited by mandruk1331
                                #19

                                @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
                                0
                                • mrjjM Offline
                                  mrjjM Offline
                                  mrjj
                                  Lifetime Qt Champion
                                  wrote on last edited by
                                  #20

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

                                  mandruk1331M 1 Reply Last reply
                                  0
                                  • mrjjM mrjj

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

                                    mandruk1331M Offline
                                    mandruk1331M Offline
                                    mandruk1331
                                    wrote on last edited by
                                    #21

                                    @mrjj Pos2 = rectan.at(6)->scenePos(); - this one return (0,0), why? I tried pos() too

                                    Mandruk1331

                                    1 Reply Last reply
                                    0
                                    • mrjjM Offline
                                      mrjjM Offline
                                      mrjj
                                      Lifetime Qt Champion
                                      wrote on last edited by
                                      #22

                                      if pos() returns 0,0 , it must mean the items is actually at 0,0.

                                      mandruk1331M 1 Reply Last reply
                                      0
                                      • mrjjM mrjj

                                        if pos() returns 0,0 , it must mean the items is actually at 0,0.

                                        mandruk1331M Offline
                                        mandruk1331M Offline
                                        mandruk1331
                                        wrote on last edited by
                                        #23

                                        @mrjj and the other ones return 0,0. The object are unique they are all parents and have no child, I want to get the positions of each object so I could move them

                                        Mandruk1331

                                        mrjjM 1 Reply Last reply
                                        0
                                        • mandruk1331M mandruk1331

                                          @mrjj and the other ones return 0,0. The object are unique they are all parents and have no child, I want to get the positions of each object so I could move them

                                          mrjjM Offline
                                          mrjjM Offline
                                          mrjj
                                          Lifetime Qt Champion
                                          wrote on last edited by
                                          #24

                                          @mandruk1331
                                          Something is not right.
                                          Unless they are all really drawn at 0,0 then pos() should return the
                                          actual position.
                                          Did you new a QGraphicsRectItem and inserted directly in the list?

                                          mandruk1331M 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