LINUX.ORG.RU

Qt, QLabel with QPixmap, как сделать autoscaling?

 autoscalling, qlabel, ,


1

1

Положил на главную форму QGridLayout (сделал CentralWidget-ом), внутрь - QLabel, пихаю в нее QPixel так:

ui->lbl_firstImage->setPixmap(this->firstImage);

Хочется, чтобы при растяжении (сужении) формы растягивалось (и сжималось) само изображение.

вот так не подходит:

ui->lbl_firstImage->setScaledContents(true);
ui->lbl_firstImage->setPixmap(this->firstImage);

т.к. при таком написании изображение с самого начала делается максимально большим (в полный размер) и форма более не сжимается.

Как сделать адекватный autoscalling?

UPD: нашел, как выставить scalled содержимое - помог пример. Теперь задача усложнилась. У меня на самом деле не одна QLabel, а три. И вот такой код:

void MainWindow::resizeEvent(QResizeEvent *ev)
{
    if (!this->firstImage.isNull())
        ui->lbl_firstImage->setPixmap(this->firstImage.scaled(ui->lbl_firstImage->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
    if (!this->secondImage.isNull())
        ui->lbl_secondImage->setPixmap(this->secondImage.scaled(ui->lbl_secondImage->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
    if (!this->splittedImage.isNull())
        ui->lbl_splittedImage->setPixmap(this->splittedImage.scaled(ui->lbl_splittedImage->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));

}

Т.е. все повешено на событие ресайза главного окна. Но вот незадача: когда я выбираю первое изображение - все норм. А вот при выборе второго изображения форма сама увеличивает себя в размерах, и.... за счет самопроизвольного вызова события ресайза происходит лавинообразный бесконтрольный рост формы и ее scalled-содержимого :).. Как победить?

★★★★★

Последнее исправление: bvn13 (всего исправлений: 1)

Ответ на: комментарий от bvn13

Чего непонятного в трёх строчках-то? Вместо стандартного QLabel написан класс, который сам отрисовывает картинку в paintEvent'е, масштабируя и сохраняя пропорции. Вот хедер от класса http://code.google.com/p/hedgewars/source/browse/QTfrontend/ui/widget/SquareL...

unC0Rr ★★★★★
()
Ответ на: комментарий от unC0Rr

да не совсем понятно, как это сможет решить проблему.

ЗЫ. я решил путем булевной заглушки, выставляемой в конце каждого ресайз-эвента и проверяемой в начале каждого ресайз-эвента. Старомодно и не Ъ, но работает пока.

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от bvn13

Проблема просто не возникает. В событии ресайза не нужно будет ничего трогать вообще. Как лэйаут разместил виджет, такого размера он и будет, подкорректирует только свой вид.

unC0Rr ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.