PyQt/Qt:如何在Qlabel小部件中拉伸图像?

6
我想在我的应用程序中显示一张图片。我使用QtDesigner设计用户界面,然后使用pyqt进行编程。问题是将要显示的图像比UI上的小部件尺寸大。我参考了官方演示:QT - Widget Image Viewer Demo
添加图像标签和滚动区域,代码如下:
---- 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()

但是它并不拉伸图像,甚至没有出现滚动条!
3个回答

17
你需要调用 self.label.setScaledContents(true);。这样,QLabel 将会自适应图像的大小,并且滚动条将会出现。详见文档

我在代码中添加了"self.label.setScaledContents(true)",但它仍然不起作用!你可以看到我的代码上面,我将scrollArea的大小设置为与标签的大小相同。这是问题吗? - whuiscool
我解决了!通过调试,我发现 'lbl = QtGui.QLabel(self.label)' 出错了。 - whuiscool

4

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中实现这个吗? - leb
1
@Vitto,@Petrucio提供的代码可以很容易地用Python重写。您只需要查看PyQt文档,以便不会错过某些包名称等。std::minstd::max也可以替换为Python的内置函数,它们执行相同的操作。 - rbaleksandar

0

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

  • scaled()
  • scaledToHeight()
  • scaledToWidth()

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

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

你如何设置标签和滚动区域的大小?你可以看到我的代码,我将滚动区域的大小设置为与标签的大小相同。这是问题吗? - whuiscool
我解决了!通过调试,我发现'lbl = QtGui.QLabel(self.label)'有问题。 - whuiscool

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接