QLabel not sized from dimensions in designer during runtime
-
I have a QLabel used to display a QImage. In design mode the label geometry is (9,65), 1384 x 616 as listed in the Property Editor. At runtime when the MainWindow containing the label constructs (i.e. ui->setupUi(this)), the label always appears to be 100x30 at startup which leads to images displaying only a really small portion.
Why do I have to set it to a fixed size to be anything but 100x30?
Source for the UI exceeds posting rules or I would have included it here
-
QLabel's scaledContents doesn't help?
-
[quote author="NicuPopescu" date="1382713466"]QLabel's scaledContents doesn't help?[/quote]
No. For my purposes I need pixels to be 1:1. The property scaledContents distorts the image.
-
Hi,
If you want one by one, you can set the fixed size of your label to your image size or put the label in a QScrollArea
Hope it helps
-
[quote author="SGaist" date="1382728235"]Hi,
If you want one by one, you can set the fixed size of your label to your image size or put the label in a QScrollArea
Hope it helps[/quote]
Not really.
The size of the image is too big to do that - images could be approx 1GB. I create an aperture in the form of a QPixmap from a QImage contained in a QLabel which traverses the area of the original image size via scroll bars. The scrollArea is usefull but doesn't address the original item asked. I need to have the QLabel containing the image and displayed at the full width and height dimensions as reported in the designer. -
Then use my first proposition, use setFixedSize
-
Since the QLAbel is in a layout and I want it scale with resizing the client area, what criteria would you use for a fixed size? The QLabel which is a child of the MainWindow is of indeterminate size before an image is loaded; especially on any given platform and/or monitor.
-
It's getting less clear now.
You have an image of a given size, you want to put it in a QLabel which should have the same size as the image ?
Or should your label only show a portion of the original image. The label size being based on the current size of this widget ?
-
[quote author="SGaist" date="1382999058"]
Or should your label only show a portion of the original image.[/quote]
Calling setPixmap with the image dimensions of the label causes a portion of the image to be shown in the label
for example:
@
origImage = new QImage(MappedBuffer, ui->lblImage->width(), ui->lblImage->height(), BITMAP_FORMAT);
ui->lblImage->setPixmap(QPixmap::fromImage(*origImage, Qt::AutoColor));
@The label could be 640 x 480 whereas the image could be multiples of that.
-
What I understood from the above discussion I came up with the following result :---
If you want to render an image on QLabel on run time without distortion.
You can simply do the following snippet of the code -----
QImage img(":/img/index.jpg");
ui->label->setGeometry(X,Y,img.width(),img.height());
ui->label->setPixmap(QPixmap::fromImage(img)); -
bq. Since the QLAbel is in a layout and I want it scale with resizing the client area, what criteria would you use for a fixed size? The QLabel which is a child of the MainWindow is of indeterminate size before an image is loaded; especially on any given platform and/or monitor.
I only can guess what is your purpose:
- you need a layout for other widgets to resize them automatically, when main window is resized
-inside layout you need a QLable initially at fixed size, exactly as defined in designer, and not affected by layout; then QLabel should scale while main window resizes
then I think you should set in designer the size policy to Maximum, and set in designer both minimum and maximum sizes to the same values
hope it helps ...
Cheers!
- you need a layout for other widgets to resize them automatically, when main window is resized
-
[quote author="NicuPopescu" date="1383050803"]
I only can guess what is your purpose:- you need a layout for other widgets to resize them automatically, when main window is resized
[/quote]
Pretty good guess - I thought that was clear.
[quote]
-inside layout you need a QLable initially at fixed size, exactly as defined in designer, and not affected by layout; then QLabel should scan while main window resizesthen I think you should set in designer the size policy to Maximum, and set in designer both minimum and maximum sizes to the same values
[/quote]This serves to fix the size of the QLabel in its layout by setting Minimum and Maximum to the same value. When the main window re-sizes, the label remains a static size.
- you need a layout for other widgets to resize them automatically, when main window is resized
-
brr ... I said scan instead of scale :)
anyway, if you need that label's size to scale with new main window size, I think you should do it by code adjusting the minimum and maximum sizes by a factor=new_main_window_size/start_main_window_size
-
What I came up with to get a proper size QLabel after construction:
@
void MainWindow::showEvent(QShowEvent* e)
{
if(isInitialized)
return;QMainWindow::showEvent(e); if(e->spontaneous()) return; widgetSize = ui->lblImage->size(); MappedBuffer = new quint8[ui->lblImage->width() * ui->lblImage->height() * BITMAP_FORMAT]; origImage = new QImage(MappedBuffer, ui->lblImage->width(), ui->lblImage->height(), BITMAP_FORMAT); LoadTestImage(); isInitialized = true;
}
@I hope this helps someone
-
imho with what I suggested so far combined with scaledContents=true you get the same result without extra work: MappedBuffer must have app life time and destroy them explicitly; have you mentioned you need to store your original image? what about label's scaling?
:)
-
The label is going to be the result of the buffer contents. That is, I am not going to scale QImage or QPixmap. These aren't JPG or BMP images. These are high resolution 16 bit grey scale images. I need 1:1 pixel representation and scaling pixmaps is not going to cut it.