Как изменить размер QLabel с растровым изображением внутри QScrollArea? - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть дизайнерская форма (шаблон Диалог без кнопок), содержащая 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 Ответ

0 голосов
/ 08 ноября 2018

Причина

Используя 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());
    
* +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

  • наезда в

Window with a zoomed-in image and two buttons

  • наезда из

Window with a zoomed-out image and two buttons

...