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));}//获取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实现自适应图片大小(可鼠标右击全屏)相关推荐
- 自适应图片大小的弹出窗口(3 中方法)
方法一 在最近的项目中,遇到一个问题,要实现这样的效果: 点pic_small.Aspx页面的缩略图后弹出pic_all.aspx页面,pic_all.aspx页面的大小要根据图片大小自动 ...
- JavaScript自适应图片大小的弹出窗口
很多时候我们需要提供这样的功能给访问者:当访问者点击页面中的缩略图时,其对应的全尺寸图片将显示在一个新的弹出窗口中供访问者查看. 实现此功能的最简单作法是用以下HTML代码创建一个图像链接: < ...
- picturebox显示服务器图片大小,WinForm中实现picturebox自适应图片大小的方法
本文实例讲述了winform中实现picturebox自适应图片大小的方法.分享给大家供大家参考,具体如下: picturebox控件共有两种载入图片方式,分别为: picturebox1.backg ...
- python给指定目录所有图片添加水印logo,批量生成替换文件,自适应图片大小添加到图片正中间
首先需要安装PIL,pip install 2.x的版本安装 pip insall PIL 3.x的python版本安装 pip install pillow 实现功能步骤: 1.读取指定目录jpg或 ...
- 如何将已有图片做成透明水印_如何批量给图片添加属于自己的全屏透明水印?其实方法很简单...
原标题:如何批量给图片添加属于自己的全屏透明水印?其实方法很简单 今天我们来分享一个给图片批量添加全屏透明水印的小技巧,为什么要给图片添加全屏透明水印呢?就好比如说,我是做美食的,配图时候,做出来的劳 ...
- python自适应图片大小_pixmap和label设置图片自适应大小
在label中添加pixmap来显示图片时,当图片过大时图片显示不全. 1.这时可以使用pixmap的scared()方法,来设置图片缩放. QPixmap QPixmap.scaled (self, ...
- python opencv显示图片 窗口调节_opencv python全屏显示、置窗口大小和位置
opencv python全屏显示.设置窗口大小和位置 文章目录: 一.全屏显示图片或视频 二.设置窗口的大小和位置 1.设置窗口的大小 2.设置窗口的位置 一.全屏显示图片或视频 有时我们需要显示图 ...
- css样式里把背景设置为图片,利用css如何设置全屏背景图片
利用css如何设置全屏背景图片 如果你有一张比较绚烂的图片想做背景,可以这样设置,就跟随百分网小编一起去了解下吧,想了解更多相关信息请持续关注我们应届毕业生考试网! 代码如下: body{ backg ...
- 全屏图片php模板,CSS_css 设置全屏背景图片,如果你有一张比较绚烂的图片 - phpStudy...
如果你有一张比较绚烂的图片想做背景,可以这样设置: 复制代码代码如下: body{ background:url(img.jpg); background-position:center; backg ...
最新文章
- ResNet超强变体:京东AI新开源的计算机视觉模块
- 【David Silver强化学习公开课】-7:Policy Gradient
- matlab正弦光栅,科学网—光栅-正弦,矩形 - 宗兆玉的博文
- 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1079:计算分数加减表达式的值
- Hive分析窗口函数(一) SUM,AVG,MIN,MAX
- E 做任务三(区间)
- 2、异步HTTP编程
- linux服务器遭攻击,记一次linux服务器被攻击与防护
- asp.net免费网站三剑客:WebMatrix + MojoPortal + SQLCE
- linux 运行java工程师_java工程师linux命令,这篇文章就够了
- 容器 java 时区_docker容器修改时区(java应用log信息与标准容器时间有八个小时时间差)...
- 用爬虫模拟登陆urp教务处系统
- Win10截屏的几种方法介绍
- Kingbase数据库
- ZigBee网络数据传递流程_蓝牙、WIFI、Zigbee谁更适合物联网,各有哪些优缺点?...
- Vim 自定义补全利器 Snippet
- Market1501数据集下载
- c语言pop3,《ADOBE PHOTOSHOP CC标准培训教材》—第3章3.5节调整边缘
- java GUI实现用户管理系统
- Telegram陌生信息怎么防?教你 3 个方法拒绝骚扰信息