如何在QScrollArea中使用pixmap调整QLabel的大小?

时间:2018-11-07 15:52:12

标签: qt 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 个答案:

答案 0 :(得分:0)

原因

通过使用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();
}

注意:此代码要求test image 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