Update scene
-
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?
-
Hi
The QGraphicsItems in the scene has a setPos function
you can use to move them around. -
Yes, it should be possible.
How do you make it red in first place?Maybe via
item->setBrush(QBrush(Qt::green)); -
@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);
//}}
-
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
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); -
-
@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));
} -
Hi
at returns const.
This looks strange to me
rectan.at(0) = Pos2;
maybe
rectan[0] = Pos2Also 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; -
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) -
@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
}
} -
well
Normally it works as many times as u set it up but hard to guess at with
only "SingleShot". -
-
@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? -
@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) -
hi
put qDebug() << "in shot:"
in the
MainWindow::Shot()
to make sure its actually called mutiple times.