Неверное поведение полос прокрутки при увеличении изображения в qt - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь реализовать функцию масштабирования для моего приложения, похожего на средство просмотра изображений. Я загружаю изображение так:

void MeasuresWidget::on_actionOpen_triggered()
{
    QString fileName = QFileDialog::getOpenFileName(this,
                                         tr("Open File"), QDir::currentPath());
    if (!fileName.isEmpty())
    {
    QImage image(fileName);
    if (image.isNull()) {
        QMessageBox::information(this, tr("Image Viewer"),
                                   tr("Cannot load %1.").arg(fileName));
        return;
    }

    ui->imageLabel->setPixmap(QPixmap::fromImage(image));
    }

    scaleFactor = 1.0;
//    ui->imageLabel->adjustSize();

}

И увеличить / уменьшить масштаб так:

void MeasuresWidget::on_actionZoom_in_triggered()
{
    scaleImage(1.25);
}

void MeasuresWidget::on_actionZoom_out_triggered()
{
    scaleImage(0.8);
}

void MeasuresWidget::scaleImage(double factor)
{
    Q_ASSERT(ui->imageLabel->pixmap());
    scaleFactor *= factor;
    ui->imageLabel->resize(scaleFactor * ui->imageLabel->pixmap()->size());

    adjustScrollBar(ui->scrollArea->horizontalScrollBar(), factor);
    adjustScrollBar(ui->scrollArea->verticalScrollBar(), factor);
}

void MeasuresWidget::adjustScrollBar(QScrollBar *scrollBar, double factor)
{
    scrollBar->setValue(int(factor * scrollBar->value()
                            + ((factor - 1) * scrollBar->pageStep()/2)));
}

Проблема в том, что при увеличении / уменьшении полосы прокрутки не меняют свой размер, т. Е. Размер области прокрутки всегда равен размеру загруженного изображения, независимо от того, увеличиваю я его или уменьшаю. Картинки иллюстрируют мою проблему (1 - без увеличения, 2 - с уменьшением масштаба) enter image description hereenter image description here Есть идеи о возможном решении?

1 Ответ

0 голосов
/ 24 мая 2019

Я пришел к решению и до сих пор не знаю, почему это работает сейчас, но создание области прокрутки и метки в коде, а затем использование метода setWidget решило мою проблему.Объявление в файле .h:

QLabel *imageLabel;
QScrollArea *scrollArea;

И конструктор в файле .cpp:

imageLabel = new QLabel;
imageLabel->setBackgroundRole(QPalette::Base);
imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
imageLabel->setScaledContents(true);


scrollArea = new QScrollArea;
ui->verticalLayout_4->addWidget(scrollArea);
scrollArea->setWidget(imageLabel);
...