In the Qt help files for QPixmap::transformed, it states: -
The transformation transform is internally adjusted to compensate for
unwanted translation; i.e. the pixmap produced is the smallest pixmap
that contains all the transformed points of the original pixmap. Use
the trueMatrix() function to retrieve the actual matrix used for
transforming the pixmap.
I assume that the width and height of your image are not equal. Therefore, as you've observed, each rotation will reduce the size, to ensure the full image is maintained.
Change the original image to have equal width and height by adding a border, or scale the image before or after the rotation, but image quality will suffer.
Alternatively, if you're always rotating 90 degrees, you could rotate the images in an external art program, load all 4 images and just set which one you want, rather than rotating them via Qt.
============== EDITED ======================
In response to the comments of having varying rotations, you need to ensure that you have a source image that is never rotated, then for each iteration, create an image from the source image that you need to prevent both reduction in image size and image quality.
In pseudo code it would be something like this: -
Image srcImage(":/myimage");
void MyWidget::rotateLabel()
{
Image img(srcImage);
img.rotate(rotation);
label->setPixmap(img);
}