当我们用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. 计算Div标签内Checkbox个数或已被disabled的个数

    先看下面的html: 计算div内的checkbox个数:$('#divmod input[type="checkbox"]').length 计算div内checkbox被dis ...

  2. BPM配置故事之案例9-根据表单数据调整审批线路2

    老李:好久不见啊,小明. 小明:-- 老李:不少部门有物资着急使用,现在的审批流程太慢了,申请时增加一个是否加急的选项吧.如果选加急,金额1000以下的直接到我这里,我审批完就通过,超过1000的直接 ...

  3. CentOS7 + mono +Jexus 环境的搭建

    CentOS7的安装和配置 1,从http://www.centos.org/下载CentOS7的镜像,并在VMWare中创建该镜像的虚拟机,为方便操作,把虚拟机的网络连接设置为桥接模式:在安装过程中 ...

  4. 一种简单的CQRS架构设计及其实现

    一.为什么要实践领域驱动? 近一年时间我一直在思考一个问题:"如何设计一个松耦合.高伸缩性.易于维护的架构?".之所以有这样的想法是因为我接触的不少项目都是以数据库脚本来实现业务逻 ...

  5. Ubuntu部署python3.5的开发和运行环境

    Ubuntu部署python3.5的开发和运行环境 1 概述 由于最近项目全部由python2.x转向 python3.x(使用目前最新的 python3.5.1) ,之前的云主机的的默认python ...

  6. linux NFS 配置步骤

    转载 http://woxihuanpes.blog.163.com/blog/static/12423219820097139145238/ NFS server可以看作是一个FILE SERVER ...

  7. hibernate一对一外键单向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  8. Objective-C 生成器模式 -- 简单实用和说明

    1.生成器模式的定义 将一个复杂的对象的构件与它的表示分离,使得同样的构建过程可以创建不同的表示 2.生成器模式的UML Builder :生成器接口,定义创建一个Product各个部件的操作 Con ...

  9. MVC中的AOP

    一. AOP是什么? AOP(Aspect-Oriented Programming),面向切面编程,看着是跟OOP(面向对象编程)挺相近的,但实际上又有什么区别呢?OOP具有封装,继承,多态等东西来 ...

  10. WCF学习之旅—WCF4.0中的简化配置功能(十五)

    六 WCF4.0中的简化配置功能 WCF4.0为了简化服务配置,提供了默认的终结点.绑定和服务行为.也就是说,在开发WCF服务程序的时候,即使我们不提供显示的 服务终结点,WCF框架也能为我们的服务提 ...