在 qt 中缩放图像时滚动条的不正确行为
Incorrect behaviour of scroll bars upon zooming an image in qt
我正在尝试为我的 image-viewer-like 应用程序实现缩放功能。
我正在上传这样的图片:
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();
}
然后像这样缩放 in/out:
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)));
}
问题是当我缩放in/out时,滚动条不会改变它们的大小,即滚动区域的大小总是等于上传图片的大小,无论我放大还是缩小.图片说明了我的问题(1 - 没有缩放,2 - 缩小了一次)对可能的解决方案有什么想法吗?
我找到了解决方案,但我仍然不知道为什么现在可以使用,但是通过代码创建滚动区域和标签,然后使用 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);
我正在尝试为我的 image-viewer-like 应用程序实现缩放功能。 我正在上传这样的图片:
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();
}
然后像这样缩放 in/out:
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)));
}
问题是当我缩放in/out时,滚动条不会改变它们的大小,即滚动区域的大小总是等于上传图片的大小,无论我放大还是缩小.图片说明了我的问题(1 - 没有缩放,2 - 缩小了一次)
我找到了解决方案,但我仍然不知道为什么现在可以使用,但是通过代码创建滚动区域和标签,然后使用 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);