【问题标题】:PyQt/Qt: How to stretch an image in Qlabel widget?PyQt/Qt:如何在 Qlabel 小部件中拉伸图像?
【发布时间】:2012-06-10 12:40:04
【问题描述】:

我想在我的应用中显示一张图片。我使用 QtDesigner 设计 UI,然后使用 pyqt 进行编码。问题是将显示的图像大于 UI 上的小部件大小。我参考官方demo: QT - Widget Image Viewer Demo

添加imagelabel和scrollArea,代码如下:

---- UI init ----
self.label = QtGui.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(40, 140, 361, 511))
self.label.setSizePolicy(QtGui.QSizePolicy.Preferred,QtGui.QSizePolicy.Preferred)
self.label.setObjectName(_fromUtf8("label"))
self.scrollArea = QtGui.QScrollArea(self.centralwidget)
self.scrollArea.setGeometry(QtCore.QRect(40, 140, 361, 511))
self.scrollArea.setWidget(self.label)
self.scrollArea.setObjectName(_fromUtf8("scrollArea"))

---- function ----
filename = "./Penguins.jpg"
image = QtGui.QImage(filename)
pp = QtGui.QPixmap.fromImage(image)
lbl = QtGui.QLabel(self.label)
lbl.setPixmap(pp)
self.scrollArea.setWidgetResizable(True)
lbl.show()

但它不会拉伸图像,甚至没有出现滚动条!

【问题讨论】:

    标签: qt pyqt


    【解决方案1】:

    QLabel::setScaledContents 的默认实现对我不起作用,因为当图像大于标签时,它不允许我保持纵横比 最大尺寸。

    如果需要,这个小助手会缩小图像以适应标签的最大尺寸(但不是放大),始终保持纵横比:

    /**
     * Fill a QLabel widget with an image file, respecting the widget's maximum sizes,
     * while scaling the image down if needed (but not up), and keeping the aspect ratio
     * Returns false if image loading failed
     ****************************************************************************/
    static bool SetLabelImage(QLabel *label, QString imageFileName)
    {
        QPixmap pixmap(imageFileName);
        if (pixmap.isNull()) return false;
    
        int w = std::min(pixmap.width(),  label->maximumWidth());
        int h = std::min(pixmap.height(), label->maximumHeight());
        pixmap = pixmap.scaled(QSize(w, h), Qt::KeepAspectRatio, Qt::SmoothTransformation);
        label->setPixmap(pixmap);
        return true;
    }
    

    【讨论】:

    • 你知道我如何在 Python 中实现这个吗?
    • @Vitto @Petrucio 提供的代码可以很容易地用 Python 重写。您只需查看 PyQt 文档,以免错过某些包名称等。std::minstd::max 也可以替换为具有相同功能的 Python 内置函数。
    【解决方案2】:

    您需要致电self.label.setScaledContents(true);。这样QLabel 会将自身调整为像素图/图像的大小,并且滚动条将变得可见。看到这个documentation

    【讨论】:

    • 我在我的代码中添加了“self.label.setScaledContents(true)”,但它仍然不起作用!您可以在上面看到我的代码,我将滚动区域的大小设置为与标签的大小相同。是不是有问题?
    • 我解决了!通过调试,我发现'lbl = QtGui.QLabel(self.label)' 出错了。
    【解决方案3】:

    我不使用 PyQt,但 QtPixmap 控件具有 scaled() 函数。您可以在放入标签之前调整图像大小:

    • 缩放()
    • scaledToHeight()
    • scaledToWidth()

    这是我在 C++ 中用于将图像大小调整为 QLabel 大小的示例代码:

    imatge.load("sprite.png");
    QPixmap imatge2 = imatge.scaled(ui->label->width(),ui->label->height());
    

    【讨论】:

    • 如何设置标签的大小和滚动区域的大小?您可以在上面看到我的代码,我将滚动区域的大小设置为与标签的大小相同。是不是有问题?
    • 我解决了!通过调试,我发现'lbl = QtGui.QLabel(self.label)' 出错了。
    猜你喜欢
    • 2012-02-22
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 2017-08-11
    • 2020-09-27
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多