5

我想在我的应用程序中显示图像。我使用 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()

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

4

3 回答 3

16

你需要打电话self.label.setScaledContents(true);。因此,它QLabel会将自身调整为像素图/图像的大小,并且滚动条将变得可见。请参阅本文档

于 2012-06-06T13:36:44.837 回答
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;
}
于 2012-08-03T21:07:58.057 回答
0

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

  • 缩放()
  • 缩放到高度()
  • 缩放到宽度()

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

imatge.load("sprite.png");
QPixmap imatge2 = imatge.scaled(ui->label->width(),ui->label->height());
于 2012-06-06T13:44:25.293 回答