I have a custom QGraphicsScene (my class is called MainScene) in my Qt Application. This scene contains some quantity of Rect items, that are placed as if in a grid
see picture №1
Also, I can change size of this grid of Rects dynamically
picture №2
Moreover, I want this grid to be fitted to size, so every time I press on Resize button (picture №2), scene should be fitted to size like in the picture №1. I implement it using following code:
void MainWindow::on_resizeButton_clicked()
{
int h = ui->heightSpinBox->value(); //height of the grid
int w = ui->widthSpinBox->value(); //width of the grid
scene->resize(h, w); //adding required amount of rects
ui->graphicsView->fitInView(scene->itemsBoundingRect(), Qt::KeepAspectRatio);
ui->graphicsView->centerOn(0, 0);
}
The problem is: when I choose heigth and width, where new height is bigger than current heigth and new width is bigger than current width (e.g. current grid is 20x20 and I resize it to 30x30) it works properly, but when I choose height and width that are smaller than current size (e.g. current grid is 30x30 and I resize it to 20x20) it doesn't work as I want
picture №3
Can you tell me, why is this happening? Are there any ways to fix it?
UPD: This is how I create a grid:
void MainScene::resize(int rows, int cols)
{
clearScene(rows, cols);
populateScene(rows, cols);
}
void MainScene::clearScene(int rows, int cols)
{
if(rows < roomHeight)
{
for(int i = rows; i < roomHeight; ++i)
{
for(int j = 0; j < roomWidth; ++j)
{
removeItem(room[i][j]);
delete room[i][j];
}
}
room.resize(rows);
roomHeight = rows;
}
if(cols < roomWidth)
{
for(int i = 0; i < roomHeight; ++i)
{
for(int j = cols; j < roomWidth; ++j)
{
removeItem(room[i][j]);
delete room[i][j];
}
room[i].resize(cols);
}
roomWidth = cols;
}
}
void MainScene::populateScene(int rows, int cols)
{
if(rows > roomHeight)
{
room.resize(rows);
for(int i = roomHeight; i < rows; ++i)
{
room[i].resize(roomWidth);
for(int j = 0; j < roomWidth; ++j)
{
room[i][j] = new GraphicsCell();
room[i][j]->setPos(j * 30, i * 30);
addItem(room[i][j]);
}
}
roomHeight = rows;
}
if(cols > roomWidth)
{
for(int i = 0; i < roomHeight; ++i)
{
room[i].resize(cols);
for(int j = roomWidth; j < cols; ++j)
{
room[i][j] = new GraphicsCell();
room[i][j]->setPos(j * 30, i * 30);
addItem(room[i][j]);
}
}
roomWidth = cols;
}
}
GraphicsCell is my custom class, that is derived from QObject
and QGraphicsItem
. room
is a vector of GraphicsCell objects.