当我们用Qt Designer设计界面时,有时会面临这样一个问题:需要在窗口指定位置放置组件,并且当窗口位置大小改变时,该组件相对其父对象的位置是不变的,如下面两幅图所示

,首先看上面这幅图,注意button的位置,我们想让button一直停留在该位置,我们刚开始做的可能是在designer中将button直接拖到该位置,编译运行后正是我们想要的结果,但是当我们拖动窗口,使窗口尺寸变化后,发现button位置改变了,如下面那副图所示。发生这种情况的原因很简单,直接拖放button到界面中,不加任何布局情况下,button的位置是相对于整个桌面不变的,而当窗口背景图变化时,两者自然而然的就不匹配了。

  解决这种问题的方法是将button加入到布局当中,我们知道布局共有3种方式:水平布局、垂直布局、棋盘布局;这三种布局方式都能够使组件在一定程度上保持其相对于父窗口的位置不变,但对于水平和垂直相对位置都要固定的问题来说,用棋盘布局无疑是相对方便的,棋盘布局即为QGridLayout,添加组件的代码大致如下:

    QGridLayout *layout=new QGridLayout;
    layout->addWidget(button1,0,0,5,10);//这里的参数是随意填写
   其中addwidget函数为void QGridLayout::addWidget (QWidget * widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = 0 )
QGridLayout网上有许多资料,这里就不多介绍了。只说一下
addwidget函数的参数,fromRow为组件起始行,fromColumn为组件起始列,rowSpan为组件的所占行数,columnSpan为组件所占列数,alignment则为组件的对齐方式。
可通过调整addwidget中组件起始行列、所占行列来控制组件在整个窗口中所占的相对大小以及位置,并且能够实现组件的相互重叠。但是这种方式和我们想要的还不是完全相同,因为这样也不能
完全保证组件和背景图的某个位置完全对应,并且窗口布局中某个只存在一个组件时,该组件会占满窗口,这时就要用到按比例设定布局的方法,在designer中,通过改变布局对象中的layoutRowStretch和LayoutColumnStretch属性来设置,其中layoutRowStretch中“0”的个数对应共有几行组件,layoutColumnStretch中“0”的个数对应共有几列组件,“0”为最初的初始值,通过更改该值(百分比),控制不同位置的组件在整个窗口中的大小与位置。
  在本文中,为了将button控制在指定位置,我们需要在button周边放置4个spacer,水平、垂直方向各两个,这样就可以将窗口分为3行3列,然后通过之前所说的layoutRowStretch和
layoutCColumnStretch中对应值的大小,改变button的位置和大小。
  这种方法如果用代码实现,示例:
        gridLayout->setRowStretch(0, 49);
        gridLayout->setRowStretch(1, 4);
        gridLayout->setRowStretch(2, 32);
        gridLayout->setColumnStretch(0, 38);
        gridLayout->setColumnStretch(1, 21);
        gridLayout->setColumnStretch(2, 8);
        gridLayout->setColumnStretch(3, 32);
setRowStretch()与setColumnStretch的使用就不多说了,manual中一看就会了。

Qt——组件位置随窗口变化的更多相关文章

  1. Qt组件中的双缓冲无闪烁绘图

      双缓冲绘图在Qt4中,所有的窗口部件默认都使用双缓冲进行绘图.使用双缓冲,可以减轻绘制的闪烁感.在有些情况下,用户要关闭双缓冲,自己管理绘图.下面的语句设置了窗口部件的Qt::WA_PaintOn ...

  2. Android窗口管理服务WindowManagerService显示Activity组件的启动窗口(Starting Window)的过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8577789 在Android系统中,Activ ...

  3. QT笔记之自定义窗口拖拽移动

    1.QT自定义标题栏,拖拽标题栏移动窗口(只能拖拽标题,其他位置无法拖拽) 方法一: 转载:http://blog.sina.com.cn/s/blog_4ba5b45e0102e83h.html . ...

  4. 窗口变化相关消息 OnSize、OnSizing和OnGetMinMaxInfo

    最近用到窗口变化的一些东西,遇到几个相关的消息函数,简要分析,作为备忘. 3个消息分别是:WM_SIZE.WM_SIZING.WM_GETMINMAXINFO:分别对应相应的处理函数:OnSize.O ...

  5. Qt控制台和带窗口的区别_mickelfeng_新浪博客

    Qt控制台和带窗口的区别_mickelfeng_新浪博客     t控制台和带窗口的区别    (2012-04-30 10:50:53)    标签:    杂谈        分类: C/C    ...

  6. Qt中的主窗口之菜单栏

    1.Qt中的主窗口 主窗口为建立应用程序用户界面提供了一个框架 Qt开发平台中直接支持主窗口的概念 QMainWindow是Qt中主窗口的基类 QMainWindow继承于QWidget是一种容器类型 ...

  7. 【Qt开发】设置中心窗口 setCentralWidget

    http://blog.csdn.net/qter_wd007/article/details/7028920 Qt程序中的主窗口通常具有一个中心窗口部件.从理论上来讲,任何继承自QWidget的类的 ...

  8. vue项目如何监听窗口变化,达到页面自适应?

    [自适应]向来是前端工程师需要解决的一大问题--即便作为当今非常火热的vue框架,也无法摆脱--虽然elementui.iview等开源UI组件库层出不穷,但官方库毕竟不可能满足全部需求,因此我们可以 ...

  9. [Qt] 组件

    组成一个Qt应用的基本元素 窗口(window):一个部件没有嵌入其他部件中,就把这个部件叫做窗口或顶层窗口,顶层窗口没有父窗口 控件(widget):一个窗口嵌入到其他窗口中,这些窗口就叫做控件或子 ...

随机推荐

  1. x01.os.23: 制作 linux LiveCD

    1.首先运行如下命令  sudo apt-get install wget bc build-essential gawk genisoimage 2.下载如下资源,make all 即可 http: ...

  2. hibernate5.2需要的最少jar文件

    hibernate5.2需要的最少jar文件: required文件夹中的所有jar文件 + mysql-connector-java-bin.jar.

  3. MyBatis2:config.xml文件

    前言 前一篇文章,讲了MyBatis入门,讲到了MyBatis有两个基本的配置文件,一个用来配置环境信息,一个用来写SQL语句.前者我把它命名为config.xml,config.xml的内容是: & ...

  4. 网站的SEO以及它和站长工具的之间秘密

    博客迁移没有注意 URL 地址的变化,导致百度和 google 这两只爬虫引擎短时间内找不到路.近段时间研究了下国内最大搜索引擎百度和国际最大搜索引擎google的站长工具,说下感受. 百度的站长工具 ...

  5. [NodeJS] Hello World 起步教程

    概述: 做数据,免不了需要展示数据,数据可视化是必须经历的步骤. 本文将提供一个NodeJS的起步教程,是笔者这两天探索的小结. 正文:  1. 为什么使用NodeJS 究竟是以B/S还是C/S的架构 ...

  6. ABP文档 - Web Api 控制器

    文档目录 本节内容: 简介 AbpApiController 基类 本地化 其它 过滤 审计日志 授权 防伪造过滤 工作单元 结果包装和异常处理 结果缓存 验证 模块绑定器 简介 通过Abp.Web. ...

  7. Linux Nano命令

    Nano命令指南 今天在输命令时,无意中输入了nano,对这个命令不太熟悉,结果不知道如何才能退出,保存,赶快查了一下资料,原来是这样的啊. 打开文件与新建文件 使用nano打开或新建文件,只需键入: ...

  8. ELK 安装笔记

    logstash -noverify -javaagent:E:\svn\other\nn\jrebel6.0.0+crack\jrebel6.0.0-crack\jrebel.jar -Drebel ...

  9. AngularJS_01之基础概述、设计原则及MVC设计模式

    1.AngularJS: 开源的JS框架,用来开发单一页面应用,以及数据操作频繁的场景:2.设计原则: ①YAGNI原则:You Aren't Gonna Need It! 不要写不需要的代码! ②K ...

  10. Unicode和UTF-8的关系

    Unicode和UTF-8都是表示编码,这个我一直都知道,但是这两个实际上是干什么用的,到底是怎么编码的,为什么有了Unicode还要UTF-8,它们之间有什么联系又有什么区别呢?这个问题一直困扰着我 ...