Image 以Qt显示图像以适应标签大小
我已经尝试了几种在表单上显示图像的方法,但没有一种方法能够按照我的意愿工作 我读过很多地方,最简单的方法是创建一个标签,并使用它来显示图像。我有一个标签,它的大小由布局指定,但是如果我用pixmap将图像加载到标签中,标签的大小将调整为图像的大小。如果我使用img标记作为文本或css背景属性,它将不会显示整个图像。我想做的是加载图像并放入标签中,而不是更改标签的大小,但是当我调整窗口大小时,通过调整标签的大小,图像也应该调整大小,以便始终能够放入其中 如果唯一的方法是获取标签的大小,调整pixmap的大小使其适合,并处理调整大小事件(信号),那么如何调整pixmap的大小?我希望我不需要每次都将整个东西保存到一个QImage中并从中创建一个pixmap 还有,我如何将其居中?如果它不能同时适应宽度和高度,我希望较小的尺寸居中Image 以Qt显示图像以适应标签大小,image,qt,autoresize,Image,Qt,Autoresize,我已经尝试了几种在表单上显示图像的方法,但没有一种方法能够按照我的意愿工作 我读过很多地方,最简单的方法是创建一个标签,并使用它来显示图像。我有一个标签,它的大小由布局指定,但是如果我用pixmap将图像加载到标签中,标签的大小将调整为图像的大小。如果我使用img标记作为文本或css背景属性,它将不会显示整个图像。我想做的是加载图像并放入标签中,而不是更改标签的大小,但是当我调整窗口大小时,通过调整标签的大小,图像也应该调整大小,以便始终能够放入其中 如果唯一的方法是获取标签的大小,调整pixm
哦,我不想用滑块来处理溢出。有帮助吗?也可能会有一些有用的信息。我也会回答我自己的问题,但不会将其标记为解决方案,因为我要求的是上面给出的一个简单的问题。我最终使用了一个不太简单的解决方案,所以任何需要做类似事情并有时间玩的人,这里是我最后的工作代码。其思想是扩展QLabel并重载setPixmap和drawervent方法 QPictureLabel.hpp(头文件) QPictureLabel.cpp(实施)
实际上,这个问题有一个非常简单的解决方案。有两件事需要修改:
QLabel lblImage;
lblImage->setPixmap( QPixmap( "big_image.jpg" ) );
lblImage->setScaledContents( true );
lblImage->setSizePolicy( QSizePolicy::Ignored, QSizePolicy::Ignored );
如果
lblImage
自动调整大小,图像将拉伸到标签的大小。保留原始pixmap
的副本。然后将调整大小的信号连接到实现以下功能的插槽(或覆盖resizeEvent()
函数):
lblImage->setPixmap(pixmap.scaled(lblImage->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
ui->label->setPixmap(pix.scaled(ui->label->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation))代码>
在我的案例(Qt 5.11)中发挥了巨大的作用pix
是具有原始像素计数的QPixmap
对象(例如,使用QPixmap::fromImage(path)
构造)。在Qt Designer中,必须设置两项:
将pixmap设置为所需的图像
检查缩放内容
如下图所示:
此处,底部的标签已选中,顶部的标签未选中
对于快速解决方案,这是一个节省,但它通过拉伸图像(即:不保持纵横比)给了我一个非常糟糕的结果。无论如何,我会将此标记为解决方案。谢谢。使用PyQt5,此解决方案不起作用setScaledContents
似乎对显示的图像大小没有任何影响。ui->label->setPixmap(pix.scaled(ui->label->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation))代码>对我来说很有魅力pix
是一个具有原始像素计数的QPixmap
对象(例如,使用QPixmap::fromImage(path)
构建)。回答得很好,我只是在我的父部件上有问题,当我更改pixmap并调整屏幕大小时,它会出现bug。这是很久以前的事了(1年对我来说太多了),我甚至都没有安装Qt,但我也许能帮上忙。您得到的错误是什么?在哪一行?你试过调试吗?或者它是如何“臭虫”的?在这里,你能做的最好的事情是在stackoverflow上发布一个后续问题,这样你就有更大的机会从整个用户群中得到答案。对不起,我的主窗口也调整了大小,所以标签的背景出现了问题,不是标签本身内部的图像-您的代码-我修复了使用背景制作标签的问题-label->setAutoFillBackground(true);非常感谢您提供此QLabel扩展!节省了我的工作时间。我想没有简单的解决方案来保持图像的宽度/高度比?忽略的问题是标签不能用于“扩展”布局。使用PyQt5,这也不起作用QSizePolicy.Ignored
似乎对是否调整图像大小没有影响。pixmap.scaled-创建缩放副本,因此将使用额外内存。是的,您需要将缩放版本作为副本。如果你只是调整了相同图像的大小,那么缩小后再放大会导致质量下降。与@Team MB的答案相同,除了Qt::IgnoreAspectRatio,我认为这与问题不符,我实际上找到了另一个更好的解决方案,那就是ui->yourlab->setPixmap(QIcon(“xx.png”).pixmap(16,16))代码>
img_Result = new QPictureLabel(ui.parent);
layout = new QVBoxLayout(ui.parent);
layout->setContentsMargins(11, 11, 11, 11);
ui.parent->setLayout(layout);
layout->addWidget(img_Result);
//{...}
QPixmap qpImage(qsImagePath);
img_Result->setPixmap(qpImage);
QLabel lblImage;
lblImage->setPixmap( QPixmap( "big_image.jpg" ) );
lblImage->setScaledContents( true );
lblImage->setSizePolicy( QSizePolicy::Ignored, QSizePolicy::Ignored );
lblImage->setPixmap(pixmap.scaled(lblImage->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
QPixmap pic = QPixmap(":/resource/xxx.png").scaled(16,16,Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
ui->yourLable->setPixmap(pic);