Причина
Используя ui->scrollArea->setWidgetResizable(true);
, вы разрешаете области прокрутки автоматически изменять размер виджета:
Если для этого свойства установлено значение true, область прокрутки автоматически изменит размер виджета, чтобы избежать прокрутки, где их можно избежать, или воспользоваться дополнительным пространством.
Кроме того, вы вычисляете новый размер QLabel
неверным образом, то есть вы используете размер pixmap
, который, в свою очередь, остается постоянным.
Решение
Чтобы достичь желаемого эффекта, я бы предложил вам:
Явно установите для свойства widgetResizable
значение false
:
ui->scrollArea->setWidgetResizable(false);
Создайте новый размер QLabel
в зависимости от его старого размера вместо размера pixmap
:
m_imageLabel->resize(m_scaleFactor * m_imageLabel->size());
* +1037 * Пример * +1038 *
Вот минимальный пример, который я подготовил для вас, чтобы продемонстрировать, как может быть реализовано предлагаемое решение:
#include <QApplication>
#include <QWidget>
#include <QBoxLayout>
#include <QPushButton>
#include <QScrollArea>
#include <QLabel>
struct Viewer : public QWidget
{
explicit Viewer(QWidget *parent = nullptr) :
QWidget(parent)
{
auto *l = new QVBoxLayout(this);
auto *scrollArea = new QScrollArea(this);
auto *btnZoomIn = new QPushButton(tr("Zoom In"), this);
auto *btnZoomOut = new QPushButton(tr("Zoom Out"), this);
auto *label = new QLabel();
qreal scaleFactor = 1.25;
label->setPixmap(QPixmap("qt-creator-logo.png"));
label->setScaledContents(true);
scrollArea->setBackgroundRole(QPalette::Dark);
scrollArea->setWidget(label);
scrollArea->setWidgetResizable(false);
l->addWidget(scrollArea);
l->addWidget(btnZoomIn);
l->addWidget(btnZoomOut);
connect(btnZoomIn, &QPushButton::clicked, [label, scaleFactor](){
label->resize(scaleFactor * label->size());
});
connect(btnZoomOut, &QPushButton::clicked, [label, scaleFactor](){
label->resize((2 - scaleFactor) * label->size());
});
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Viewer w;
w.show();
return a.exec();
}
Примечание: Этот код требует, чтобы тестовое изображение qt-creator-logo.png
находилось в папке сборки во время выполнения.
Результат
Как написано, этот код дает следующий результат:
![Window with a non-scaled image and two buttons](https://i.stack.imgur.com/q78Bo.png)
![Window with a zoomed-in image and two buttons](https://i.stack.imgur.com/d1pP3.png)
![Window with a zoomed-out image and two buttons](https://i.stack.imgur.com/WIYhM.png)