精华内容
下载资源
问答
  • QLabel实现自适应图片大小(可鼠标右击全屏) 引言:首先说下走的弯路,按照固定思维QLabel外面套个QWidget,然后点击布局,让QLabel随着QWidget一起变化,理论上没啥问题,但是实践后,QLabel加载图片进行放大后,...

    QLabel实现自适应图片大小(可鼠标右击全屏)

    引言:首先说下走的弯路,按照固定思维QLabel外面套个QWidget,然后点击布局,让QLabel随着QWidget一起变化,理论上没啥问题,但是实践后,QLabel加载图片进行放大后,QLabel会填充整个widget,无法缩小。所以:

     QLabel不要使用布局管理器!!!!
    

    一、修改构造函数

    Widget::Widget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Widget)
    {
        ui->setupUi(this);
        ui->VideoShowLabel->setScaledContents(true); //图片自适应label大小
    }
    

    setScaledContents是让图片自适应label大小

    二、重写resizeEvent函数

    当调整窗口使其变化时,paintEvent 函数自动被调用执行,所以重绘label大小(这看起来是不是和 setScaledContents重复了,后续再进行解释)

    void Widget::resizeEvent(QResizeEvent *event)
    {
        ui->VideoShowLabel->resize(ui->widget->size());
    }
    

    三、显示图片

    我这里是结合opencv获取图片,qt获取图片使用QImage和QPixmap即可

    void Widget::OnUpdateFrame()
    {
        int frameSize_, width, height;
        char *image_ = pHdev->getLatestFrame(m_camID,frameSize_,width,height);
    
        cv::Mat image;
        if (image_ != NULL)
        {
          	 cudaMemcpy(m_pImagedate, image_, frameSize_, cudaMemcpyDeviceToHost);
           	cv::Mat srcImg(height, width, CV_8UC4, m_pImagedate, cv::Mat::AUTO_STEP);
           	cv::cvtColor(srcImg, image, cv::COLOR_BGRA2BGR);
    
            cv::line(image,cv::Point(0,image.rows/2),cv::Point(image.cols,image.rows/2),cv::Scalar(255,0,0),1);
            cv::line(image,cv::Point(image.cols/2,0),cv::Point(image.cols/2,image.rows),cv::Scalar(255,0,0),1);
        }
        
        if(ui->VideoShowLabel->isFullScreen())
        {
            cv::resize(image, image,cv::Size(ui->VideoShowLabel->width(), ui->VideoShowLabel->height()));
        }
        else
        {
            cv::resize(image,image,cv::Size(1280,960));
        }
    
        //获取img
        QImage img = QImage((const uchar *)image.data, image.cols, image.rows,
        image.cols * image.channels(), QImage::Format_RGB888);
        QPixmap pixImage = QPixmap::fromImage(img.rgbSwapped());
    
        //显示图像
        ui->VideoShowLabel->setPixmap(pixImage);
        ui->VideoShowLabel->resize(QSize(pixImage.width(), pixImage.height()));
        this->update();
    }
    

    四、实现鼠标右击全屏和恢复(实现eventFilter即可)

    bool Widget::eventFilter(QObject *watched, QEvent *event)
    {
        if(watched == ui->VideoShowLabel)
        {
           if(event->type() == QEvent::MouseButtonPress)
            {
                QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
                if(mouseEvent->button() == Qt::RightButton)
                {
                    ui->VideoShowLabel->setWindowFlags(Qt::Window);
                    ui->VideoShowLabel->showFullScreen();
                }
                else if(mouseEvent->button() == Qt::LeftButton)
                {
                    ui->VideoShowLabel->setWindowFlags(Qt::SubWindow);
                    ui->VideoShowLabel->showNormal();
                }
            }
            return QObject::eventFilter(watched,event);
        }
    }
    
    总结:核心思想就是添加QWiget并进行布局,QWidget控件添加QLabel不使用布局!

    问题:(链接:https://blog.csdn.net/emdfans/article/details/52936637

    为什么不直接在窗口上显示QLabel而多加一个QWidget?
    假如我们直接在窗口上显示QLabel,那么有两种情况:
    一、使直接对QLabel使用布局管理器,二、不使用布局管理器。

    不使用布局的情况很明显会使窗口布局错乱适应能力着,或者很难获得窗口真实的大小(我用QDockWidget的大小设定时,当窗口锚接入主窗口时种是遮盖图像的一部分)。

    第一种情况:直接对QLabel使用布局管理器:那么情况是,打开界面QLabel自动调节为窗口大小,通过拖动使窗口变大后,窗口内有多余的空间后,布局管理器将QLabel自动放大到窗口大小;看似实现了自动适应窗口大小,但当我们想使窗口变小时问题就出来了,窗口无法缩小,原因是布局管理器内的QLabel大小是整个窗口,窗口没已经是最小了。

    当使用QWidget做中间介质后,由于QWidget内没有布局管理器,所以当缩小主窗口时其大小可以改变,而QLabel为从QWidget的(0,0)开始绘制,大小为QWidget大小,所以可以实现与窗口同样大小,显示位置也是布局管理器设置的位置。

    展开全文
  • QLabel添加图片自适应大小

    千次阅读 2020-09-16 15:49:16
    方法一: 方法二: ui->label->setPixmap(QPixmap(":/C:/Users/Pic.png")); ui->label->setScaledContents(true); QImage Image; Image.load("d:/123.jpg"); QPixmap pixmap = QPixmap::...

    方法一:

    方法二:

    ui->label->setPixmap(QPixmap(":/C:/Users/Pic.png"));
    ui->label->setScaledContents(true);

    方法三

        QImage Image;
        Image.load("d:/123.jpg");
        QPixmap pixmap = QPixmap::fromImage(Image);
        int with = ui->label->width();
        int height = ui->label->height();
        QPixmap fitpixmap = pixmap.scaled(with, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);  // 饱满填充
        //QPixmap fitpixmap = pixmap.scaled(with, height, Qt::KeepAspectRatio, Qt::SmoothTransformation);  // 按比例缩放
        ui->label->setPixmap(fitpixmap);

     

    展开全文
  • [转]QLabel显示图片自适应窗口控件大小

    万次阅读 多人点赞 2016-10-26 17:42:19
    最近因为项目的需要,需要在QLabel标签上显示图片。那么问题就来:1.图片如何自适应窗口控件的大小;2.图片如何随着窗口大小的改变而改变呢?这就是两个比较基本也最常见的问题了。 解决问题一:图片如何自适应窗口...

    转自:http://blog.csdn.net/wusiyuan163/article/details/51107574

    最近因为项目的需要,需要在QLabel标签上显示图片。那么问题就来:1.图片如何自适应窗口控件的大小;2.图片如何随着窗口大小的改变而改变呢?这就是两个比较基本也最常见的问题了。

    解决问题一:图片如何自适应窗口控件的大小?

    相对于第一个问题,最初的想法的就是QLabel用布局进行管理,这样岂不就是固定了QLabel的大小,如何图片岂不也就是固定在QLabel里面,可是后来尝试了这种方法之后就呵呵(实践永远是真理)。虽然QLabel用布局管理了,但是当QLabel加载了图片以后,由于图片的大小问题,QLabel会压缩其他控件的位置,使得整个布局都变得凌乱了。比如下面的代码:

    1. QLabel *image1Label = new QLabel();  
    2. QLabel *image2Label = new QLabel();   
    3. image1Label->setPixmap(QPixmap::fromImage(img1));  
    4. imgae2Label->setPixmap(QPixmap::fromImage(img2));  

    实践证明这种简单粗暴的方法是解决不了图片自适应窗口控件大小的问题的。那么既然是由于图片大小问题导致的原因,那在向QLabel加载图片的时候,将图片的大小缩变为QLabel的大小那么解决问题了。这样想是正确,图片缩放到QLabel的大小,那再加载到QLabel中的时候,就不会出现QLabe挤压其他空间的现象了。直接上代码看看:

    1. QPixmap *img1 = new QPixmap("1.jpg");  
    2. QPixmap *img2 = new QPixmap("2.jpg");  
    3.   
    4. img1->scaled(image1Label->size(), Qt::KeepAspectRatio);  
    5. img2->scaled(imgae2Label->size(), Qt::KeepAspectRatio);  
    6.   
    7. image1Label->setPixmap(img1);  
    8. imgae2Label->setPixmap(img2);  
    通过编码实现,好像第一个问题解决了呢。恩,差不多就这样,第一个问题解决了,那么就该解决第二个问题了。第二个问题是什么呢,不用翻回去看问题了,我来告诉你(哈哈):图片如何随着窗口大小改变而改变呢?

    解决问题二:如何使得图片的大小随着窗口大小改变而改变呢?

    貌似这个问题好像不存在,因为有人会说:你的QLabel不是在布局管理中吗,那么QLabel的大小就可以调整嘛。对的,是这样的,布局中的QLabel是可以随着窗口大小变化而做出相应的变化的。由于我们采用了上面所说的改变图片尺寸的方法来解决问题一的,那么现在就有个新问题了:当QLabel的大小发生变化的时候,我也得重新改变图片的大小,使其适应新的QLabel的大小。是的,思路就是这样的,没啥偏差,那就编码实现看看效果呗。为了能够实现重绘图片的大小,那就得重新实现窗口的resizeEvent虚函数了。这个虚函数是基类QWidget的虚函数,主要是对窗口尺寸变化事件的一个处理。我们需要对这个函数进行重新实现。在相应的头文件中添加下面的代码:

    1. // rewrite virtual function  
    2. virtual void resizeEvent(QResizeEvent *event);  
    然后在相应的cpp文件中实现这个虚函数,代码是:

    1. void CMViewer::resizeEvent(QResizeEvent *event)  
    2. {  
    3.     QWidget::resizeEvent(event);  
    4.   
    5.     QPixmap *img1 = new QPixmap("1.jpg");  
    6.     QPixmap *img2 = new QPixmap("2.jpg");         
    7.   
    8.     if (image1Widget->height()>100)  
    9.     {  
    10.         img1->scaled(image1Label->size(), Qt::KeepAspectRatio);     
    11.         image1Label->setPixmap(img1);  
    12.     }  
    13.     if (image2Widget->height()>100)  
    14.     {  
    15.         img2->scaled(imgae2Label->size(), Qt::KeepAspectRatio);  
    16.         imgae2Label->setPixmap(img2);  
    17.     }  
    18. }  
    这样下来这个问题貌似得到了解决,可是总觉得怪怪的,不停的要加载图片,改变图片的尺寸大小,虽然在效率上不能看出什么差别,但是不是最好的,所以继续疯狂的在Google上搜索了,后来找到了一个比较好的方法( 这是原文链接),下面也分享给大家。


    --------------------------------------------------------华丽的分割线--------------------------------------------------------------

    思想:

    1.部署一个QWidget控件,并用布局管理器进行设计;

    2.在QWidget控件上放置一个QLabel,不要使用任何布局。

    具体操作过程:

    1.在要显示的窗口放置一个QWidget,并使用用布局管理器(以便窗口可以规范布局);

    2 在QWidget内放置QLabel ,位置为左上角,不使用任何布局管理器;

    3 在构造函数内添加如下代码:

    1. ui->label->setScaledContents(true)  
    4 编辑界面重绘函数,加入如下代码:

    1. ui->label->resize(ui->widget->size());  
    原理解释:

    当我们调整窗口使其变化时,paintEvent 函数自动被调用执行,执行 ui->label->resize(ui->widget->size());语句为:设置label大小为widget大小。

    而ui->label->setScaledContents(true);为设置QLabel自动缩放,既:显示图像大小自动调整为Qlabel大小。

    解释问题:
    1 为什么不直接在窗口上显示QLabel而多加一个QWidget?
    假如我们直接在窗口上显示QLabel,那么有两种情况:
    一、使直接对QLabel使用布局管理器,二、不使用布局管理器。

    不使用布局的情况很明显会使窗口布局错乱适应能力着,或者很难获得窗口真实的大小(我用QDockWidget的大小设定时,当窗口锚接入主窗口时种是遮盖图像的一部分)。

    第一种情况:直接对QLabel使用布局管理器:那么情况是,打开界面QLabel自动调节为窗口大小,通过拖动使窗口变大后,窗口内有多余的空间后,布局管理器将QLabel自动放大到窗口大小;看似实现了自动适应窗口大小,但当我们想使窗口变小时问题就出来了,窗口无法缩小,原因是布局管理器内的QLabel大小是整个窗口,窗口没已经是最小了。

    当使用QWidget做中间介质后,由于QWidget内没有布局管理器,所以当缩小主窗口时其大小可以改变,而QLabel为从QWidget的(0,0)开始绘制,大小为QWidget大小,所以可以实现与窗口同样大小,显示位置也是布局管理器设置的位置。


    展开全文
  • QLabel自适应显示图片

    2020-03-05 22:19:55
    在Qt开发时,如果不知道怎么实现功能,可以先看看相关类的代码,例如,要实现QLabel显示图片,如果没做过肯定不知道怎么写,看看QLabel的代码: public Q_SLOTS: void setText(const QString &); //设置文本 ...

            在Qt开发时,如果不知道怎么实现功能,可以先看看相关类的代码,例如,要实现QLabel显示图片,如果没做过肯定不知道怎么写,看看QLabel的代码:

    public Q_SLOTS:
        void setText(const QString &);  //设置文本
        void setPixmap(const QPixmap &);  //设置pixmap
    #ifndef QT_NO_PICTURE
        void setPicture(const QPicture &);
    #endif
    #if QT_CONFIG(movie)
        void setMovie(QMovie *movie);
    #endif
        void setNum(int);    //设置整数
        void setNum(double);
        void clear();

             查看Qt文档可知,用setPixmap可以显示图片,解释如下:

             This property holds the label's pixmap,If no pixmap has been set this will return nullptr.  Setting the pixmap clears any previous content. The buddy shortcut, if any, is disabled.

             写段代码试试看

    QString path = QString("D:\\TestFiles\\123.jpg");
    QImage img;
    img.load(path);
    QPixmap px
    展开全文
  • 一、 用QLabel 显示png图片, 由于主窗口的变化导致图片显示完全,所以需要图片自适应大小? 二、代码如下 1 ui.label_Thinner->setPixmap(QPixmap(":/res/thinner.png")); 2 ui.label_Washer->setPixmap...
  • 图片大小为600x600 效果图: ui->label->setScaledContents(true); pix = pix.scaled(QSize(481,481),Qt::KeepAspectRatio); 结果显而易见,Q...
  • 我用QLabel来显示jpg图像,图像可以正常显示出来了,但由于QLabel的大小不足,导致图像部分无法显示,请问怎么让要显示的图像大小自适应QLabel的大小? Method 1 qLable->setScaleContents(true); ...
  • 今天小编就为大家分享一篇pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • pyqt Qlabel显示opencv 自适应大小

    千次阅读 2017-12-12 15:40:39
    pyqt Qlabel显示opencv 自适应大小
  • 图片自适应QLabel的主要代码: lbl.setScaledContents (True) # 让图片自适应label大小 为了方便对比效果,不妨按一下最大化按钮,效果如下: 可见确实实现了图片自适应label大小的功能。那么如何移除label上得...
  • 图片自适应QLabel大小

    2021-02-05 17:29:59
    from PyQt5.QtWidgets import (QWidget, QHBoxLayout, QLabel, QApplication) from PyQt5.QtGui import QPixmap class Example (QWidget): def __init__(self): super ().__init__() self.initUI () def ...
  • QLabel 显示图片大小的自适应

    千次阅读 2018-03-23 16:04:14
    QLabel 显示图片大小自适应
  • 参考链接:... 图片自适应QLabel大小 # coding=utf-8 import sys from PyQt5.QtWidgets import (QWidget, QHBoxLayout, QLabel, QApplication) from PyQt5.QtGui import Q...
  • 2、图片随窗口/控件的大小调整自适应调整大小(保持比例)。 【实现】 1、显示图片: QImage image(pic_file); this->pixmap = QPixmap::fromImage(image); ui->lb_pic->setPixmap(pixmap.scaled(ui...
  • ui.label->setPixmap(map) 在Ui中,QLabel做好布局后,在软件里,如果使用 ...让图片自适应QLabel 只需要四句话: ui.labelShow->setMinimumSize(ui.labelShow->size()); pixmap.scaled(u...
  • 给label 设置了一个背景图,发现label跟随窗口大小变化的时候,图片没有跟随变化,还是初始的大小 查看帮助文档:设置scaledContents属性 此属性保存标签是否将缩放其内容以填充所有可用空间。 启用后,标签会显示...
  • 无自适应,直接显示 //将图片格式转换成QImage格式,否则不能再lable上显示 ... // a 这表示直接将图片裁剪成label大小,无法实现图片自适应显示 ui->picture->width(), ui->picture-&g
  • Qt之图片自适应QLabel的大小

    万次阅读 多人点赞 2017-08-04 14:27:25
    首先说明一点:在Qt中使用label显示图片使用label显示图片时总是会遇到一个问题:图片不能适应label的大小,因此显示的图片很难看,这里提供一种方法,先看下面的代码:QPixmap *pixmap = new QPixmap(":/images/...
  • 有两种方法: ...//label_carema是要显示图片的label的名称 QImage image1=image.scaled(laSize,Qt::IgnoreAspectRatio);//重新调整图像大小以适应窗口 ui->label_carema->setPixmap(QPixma
  • 实现QT控件中的QLabel显示图片,并自适应显示。 二、代码 QImage Image; Image.load(":/image/image/logo.jpg"); QPixmap pixmap = QPixmap::fromImage(Image); int with = ui->label_logo->width(); int ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 472
精华内容 188
关键字:

qlabel图片自适应