Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 以Qt显示图像以适应标签大小_Image_Qt_Autoresize - Fatal编程技术网

Image 以Qt显示图像以适应标签大小

Image 以Qt显示图像以适应标签大小,image,qt,autoresize,Image,Qt,Autoresize,我已经尝试了几种在表单上显示图像的方法,但没有一种方法能够按照我的意愿工作 我读过很多地方,最简单的方法是创建一个标签,并使用它来显示图像。我有一个标签,它的大小由布局指定,但是如果我用pixmap将图像加载到标签中,标签的大小将调整为图像的大小。如果我使用img标记作为文本或css背景属性,它将不会显示整个图像。我想做的是加载图像并放入标签中,而不是更改标签的大小,但是当我调整窗口大小时,通过调整标签的大小,图像也应该调整大小,以便始终能够放入其中 如果唯一的方法是获取标签的大小,调整pixm

我已经尝试了几种在表单上显示图像的方法,但没有一种方法能够按照我的意愿工作

我读过很多地方,最简单的方法是创建一个标签,并使用它来显示图像。我有一个标签,它的大小由布局指定,但是如果我用pixmap将图像加载到标签中,标签的大小将调整为图像的大小。如果我使用img标记作为文本或css背景属性,它将不会显示整个图像。我想做的是加载图像并放入标签中,而不是更改标签的大小,但是当我调整窗口大小时,通过调整标签的大小,图像也应该调整大小,以便始终能够放入其中

如果唯一的方法是获取标签的大小,调整pixmap的大小使其适合,并处理调整大小事件(信号),那么如何调整pixmap的大小?我希望我不需要每次都将整个东西保存到一个QImage中并从中创建一个pixmap

还有,我如何将其居中?如果它不能同时适应宽度和高度,我希望较小的尺寸居中


哦,我不想用滑块来处理溢出。

有帮助吗?也可能会有一些有用的信息。

我也会回答我自己的问题,但不会将其标记为解决方案,因为我要求的是上面给出的一个简单的问题。我最终使用了一个不太简单的解决方案,所以任何需要做类似事情并有时间玩的人,这里是我最后的工作代码。其思想是扩展QLabel并重载setPixmap和drawervent方法

QPictureLabel.hpp(头文件)

QPictureLabel.cpp(实施)


实际上,这个问题有一个非常简单的解决方案。有两件事需要修改:

  • 将缩放内容设置为true(如上所述)
  • 将标签的大小策略设置为“忽略”

    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);