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));}//获取imgQImage 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实现自适应图片大小(可鼠标右击全屏)相关推荐

  1. 自适应图片大小的弹出窗口(3 中方法)

    方法一 在最近的项目中,遇到一个问题,要实现这样的效果:       点pic_small.Aspx页面的缩略图后弹出pic_all.aspx页面,pic_all.aspx页面的大小要根据图片大小自动 ...

  2. JavaScript自适应图片大小的弹出窗口

    很多时候我们需要提供这样的功能给访问者:当访问者点击页面中的缩略图时,其对应的全尺寸图片将显示在一个新的弹出窗口中供访问者查看. 实现此功能的最简单作法是用以下HTML代码创建一个图像链接: < ...

  3. picturebox显示服务器图片大小,WinForm中实现picturebox自适应图片大小的方法

    本文实例讲述了winform中实现picturebox自适应图片大小的方法.分享给大家供大家参考,具体如下: picturebox控件共有两种载入图片方式,分别为: picturebox1.backg ...

  4. python给指定目录所有图片添加水印logo,批量生成替换文件,自适应图片大小添加到图片正中间

    首先需要安装PIL,pip install 2.x的版本安装 pip insall PIL 3.x的python版本安装 pip install pillow 实现功能步骤: 1.读取指定目录jpg或 ...

  5. 如何将已有图片做成透明水印_如何批量给图片添加属于自己的全屏透明水印?其实方法很简单...

    原标题:如何批量给图片添加属于自己的全屏透明水印?其实方法很简单 今天我们来分享一个给图片批量添加全屏透明水印的小技巧,为什么要给图片添加全屏透明水印呢?就好比如说,我是做美食的,配图时候,做出来的劳 ...

  6. python自适应图片大小_pixmap和label设置图片自适应大小

    在label中添加pixmap来显示图片时,当图片过大时图片显示不全. 1.这时可以使用pixmap的scared()方法,来设置图片缩放. QPixmap QPixmap.scaled (self, ...

  7. python opencv显示图片 窗口调节_opencv python全屏显示、置窗口大小和位置

    opencv python全屏显示.设置窗口大小和位置 文章目录: 一.全屏显示图片或视频 二.设置窗口的大小和位置 1.设置窗口的大小 2.设置窗口的位置 一.全屏显示图片或视频 有时我们需要显示图 ...

  8. css样式里把背景设置为图片,利用css如何设置全屏背景图片

    利用css如何设置全屏背景图片 如果你有一张比较绚烂的图片想做背景,可以这样设置,就跟随百分网小编一起去了解下吧,想了解更多相关信息请持续关注我们应届毕业生考试网! 代码如下: body{ backg ...

  9. 全屏图片php模板,CSS_css 设置全屏背景图片,如果你有一张比较绚烂的图片 - phpStudy...

    如果你有一张比较绚烂的图片想做背景,可以这样设置: 复制代码代码如下: body{ background:url(img.jpg); background-position:center; backg ...

最新文章

  1. ResNet超强变体:京东AI新开源的计算机视觉模块
  2. 【David Silver强化学习公开课】-7:Policy Gradient
  3. matlab正弦光栅,科学网—光栅-正弦,矩形 - 宗兆玉的博文
  4. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1079:计算分数加减表达式的值
  5. Hive分析窗口函数(一) SUM,AVG,MIN,MAX
  6. E 做任务三(区间)
  7. 2、异步HTTP编程
  8. linux服务器遭攻击,记一次linux服务器被攻击与防护
  9. asp.net免费网站三剑客:WebMatrix + MojoPortal + SQLCE
  10. linux 运行java工程师_java工程师linux命令,这篇文章就够了
  11. 容器 java 时区_docker容器修改时区(java应用log信息与标准容器时间有八个小时时间差)...
  12. 用爬虫模拟登陆urp教务处系统
  13. Win10截屏的几种方法介绍
  14. Kingbase数据库
  15. ZigBee网络数据传递流程_蓝牙、WIFI、Zigbee谁更适合物联网,各有哪些优缺点?...
  16. Vim 自定义补全利器 Snippet
  17. Market1501数据集下载
  18. c语言pop3,《ADOBE PHOTOSHOP CC标准培训教材》—第3章3.5节调整边缘
  19. java GUI实现用户管理系统
  20. Telegram陌生信息怎么防?教你 3 个方法拒绝骚扰信息

热门文章

  1. Csharp零基础:第一天学Csharp要会的基础知识
  2. sublime php 代码校验,Sublime Text下配置SublimeLinter进行PHP代码检查
  3. 机器人导航——路径跟踪
  4. Executors-四种创建线程的手段
  5. Alpine系统的基础操作
  6. ScriptManager脚本管理器
  7. Linux中报错segmentation fault
  8. 多线程启动停止暂停继续
  9. mysql百万数据写入_快速写入百万数据
  10. 周周周报报报(药店管理系统)