Как изменить размер QLabel с растровым изображением внутри QScrollArea?

У меня есть дизайнерская форма (Диалог без шаблона кнопок), содержащая QScrollArea и 2 QPushButton объекты внутри вертикальной планировки. Я хочу установить QLabel с растровым изображением внутри QScrollArea,

Вот мой код:

В конструктореViewer

m_imageLabel = new QLabel;
m_imageLabel->setPixmap(image);
m_imageLabel->setScaledContents(true);

ui->scrollArea->setBackgroundRole(QPalette::Dark);
ui->scrollArea->setWidget(m_imageLabel);
ui->scrollArea->setWidgetResizable(true);

слот

void Viewer::on_zoomInButton_clicked()
{
    m_imageLabel->resize(m_scaleFactor * m_imageLabel->pixmap()->size());
    ...
}

Проблема в том, что когда zoomInButton нажата, ничего не происходит.

Как этого добиться?

1 ответ

Решение

причина

Используя ui->scrollArea->setWidgetResizable(true); Вы разрешаете области прокрутки изменять размеры виджета автоматически:

Если для этого свойства установлено значение true, область прокрутки автоматически изменит размер виджета, чтобы избежать прокрутки, где их можно избежать, или воспользоваться дополнительным пространством.

Кроме того, вы рассчитываете новый размер QLabel неправильно, то есть вы используете размер его pixmap что, в свою очередь, остается постоянным.

Решение

Для достижения желаемого эффекта я бы предложил вам:

  1. Явно установите widgetResizable собственность на false:

    ui->scrollArea->setWidgetResizable(false);
    
  2. Сделайте новый размер QLabel зависит от его старого размера, а не от размера его pixmap:

    m_imageLabel->resize(m_scaleFactor * m_imageLabel->size());
    

пример

Вот минимальный пример, который я подготовил для вас, чтобы продемонстрировать, как предлагаемое решение может быть реализовано:

#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 находиться в папке сборки во время выполнения.

Результат

Как написано, этот код дает следующий результат:

  • немашстабированная

Окно с немасштабированным изображением и двумя кнопками

  • увеличенной в

Окно с увеличенным изображением и двумя кнопками

  • Увеличенный выход

Окно с уменьшенным изображением и двумя кнопками

Другие вопросы по тегам