Qt图片自适应窗口控件大小(使用setScaledContents)

最近在用Qt设计一个小程序,
想让一幅图片自适应窗口大小,由于本人比较笨,一直找不到好方法。
找到了很多方法但都会出一些小问题,

刚刚摸索出解决办法了,在些记录。

思想:

1 显示图像是用QLabel
2 在QWidget或其他窗口部件上显示(也可直接显示在窗口上,后面会说明为什么不)

现在问题就明朗了,主要就是调整QLabel大小随窗口大小自动变化。

使用方法:

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

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

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

ui->label->setScaledContents(true);

4 编辑界面重绘函数,加入如下代码:

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大小,所以
可以实现与窗口同样大小,显示位置也是布局管理器设置的位置。

http://blog.csdn.net/yh_1988/article/details/6752733

时间: 2024-08-17 00:52:27

Qt图片自适应窗口控件大小(使用setScaledContents)的相关文章

Qt 图片随控件大小适应

一开始总是找不到 用什么方法可以让 图片随着控件大小自适应, 所以不同尺寸的控件使用不同的图片,很麻烦,搜索了一些资料,加上网友的指导, 原来是设置 border-image  而不是  image或者 background-image 比如下面这一段代码是我设置 QSpinBox的qss脚本: 1 QSpinBox::up-button { 2 subcontrol-origin: margin; 3 subcontrol-position: top right; 4 border-image

qt 窗口控件自动调整大小

/******************************************************************** * qt 窗口控件自动调整大小 * * 在写gui的时候,希望窗口能够自动调整大小,这样就不许要手动调整. * qt creator中就集成了这种方法,在qt中设置即可. * 本文参考链接: * http://www.cnblogs.com/emouse/archive/2013/05/19/3087708.html * * Tony, 2016-5-21,

winform 控件大小随着窗体自适应

3个方法: #region 改变控件大小 //获取控件原始信息 protected void GetAllInitInfo(Control ctrlContainer) { //int tempWidth = Screen.PrimaryScreen.Bounds.Width / 5 * 4; //int tempHeight = Screen.PrimaryScreen.Bounds.Height / 5 * 4; if (ctrlContainer.Parent == this)//获取窗体

VC++ 跟随父窗口调整控件大小

VC++之根据对话框大小调整控件大小 1.在对话框类中加入成员变量CRect m_rect;用于保存对话框大小变化前的大小: 2.在对话框的OnInitDialog()函数中获取对话框创建时的大小:GetClientRect(&m_rect); 3.在WM_SIZE的响应函数OnSize()中加入以下代码: 1:private: CRect m_rect; 2:GetClientRect(&m_rect); 3: void CButtonDlg::modify(CWnd* pWnd,int

子窗口控件的使用

在对话框中使用控件(control),首先应该熟悉控件的两种定义方式,虽然有时候用不到自己去编写资源脚本,但是控件在定义的时候有许多参数需要根据实际情况附加,我在编写资源脚本的时候,用ResEdit软件编写的时候,当我定义好一些类型属性,去预览代码的时候,好多属性参数和用其他工具编写的属性参数有的是不一样的,当你把在ResEdit上编写的资源脚本代码粘贴到RadASM里面的工程中的资源文件里的时候,总会出现一些错误,这两个软件的有些内容好像有些许的差距,在用ResEdit编写的时候有一些参数在R

《Windows程序设计》读书笔九 子窗口控件

第九章 子窗口控件 子窗口可以作为控制屏幕图形显示,响应用户输入,以及在有重要输入事件的时候通知另一窗口. 标准子窗口控件,按钮,复选框,编辑框,列表框,组合框,文本字符串和滚动条. 可以使用CreateWindow来创建子窗口控件,或者在程序的资源脚本里编辑好各种属性. 使用预定义控件不需要再注册相应的子窗口类,这些类已经存在于windows中并且已经有了预定义的名称. 在调用CreateWindow时,只需要使用该名称作为窗口类的参数即可. 在窗口表明直接创建子窗口,所涉及的任务比使用对话框

MFC如何使控件大小随着对话框大小自动调整

对话框的大小变化后,假若对话框上的控件大小不变化,看起来会比较难看.下面就介绍怎么让对话框上的控件随着对话框的大小的变化自动调整. 首先明确的是Windows有一个WM_SIZE消息响应函数,这个函数在对话框大小发生变化的时候调用,所以我们可以记录下原来对话框的大小,还有当前对话框的大小(这个不用自己算,系统已给出),然后根据控件做出相应比例的调整. 比如原来对话框大小为a,现在为b,原来控件大小为c,那么现在的控件大小应该为c*b/a;(注意a不能为0). 看实例:(黑体字为添加的代码!!)

简介子窗口控件(api)

子窗口控件 壹佰软件开发小组  整理编译   回忆第七章的CHECKER程序.这些程序显示了矩形网格.当您在一个矩形中按下鼠标按键时,该程序就画一个x:如果您再按一次鼠标按键,那么x就消失.虽然这个程序的CHECKER1和CHECKER2版本只使用一个主窗口,但CHECKER3版本却为每个矩形使用一个子窗口.这些矩形由一个叫做ChildProc的独立窗口消息处理程序维护. 如果有必要,无论矩形是否被选中,都可以给ChildProc增加一种向其父窗口消息处理程序(WndProc)发送消息的手段.通

翻翻git之---基于universalimageloader实现的图片加载控件BlurImageView

转载请注明出处:王亟亟的大牛之路 昨天做了个梦,梦醒后觉得还是要更努力的学习,所以不多说废话,直接上货. BlurImageView 效果图: 流程: 实现原理,加载2张图片一张为很小的缩略图,一张为原图,缩略图加载完后做放大模糊处理,然后展开进度条加载原图,原图加载成功后替换缩略图. How to use? Grade: dependencies { compile 'com.wingjay:blurimageviewlib:1.1.0' } Eclipse: lib目录下面的3各类Copy进