当我们用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. 如何使用dos命令查看MySQL当前使用的数据库?

    1.dos命令安装mysqld --stall.启动net start mysql.进入MySQL数据库mysql -uroot -p后,输入select database(); 如图:

  2. 安装并使用PHPunit

    安装并使用PHPunit Linux 下安装PHPunit PHP 档案包 (PHAR)  要获取 PHPUnit,最简单的方法是下载 PHPUnit 的 PHP 档案包 (PHAR),它将 PHPU ...

  3. web.xml中load-on-startup的作用

    如下一段配置,熟悉DWR的再熟悉不过了:<servlet>   <servlet-name>dwr-invoker</servlet-name>   <ser ...

  4. 希尔排序(java)

    时间复杂度为O( n^(3/2) )不是一个稳定的排序算法 如何看一个算法是否稳定:{("scala",12),("python",34),("c++ ...

  5. [异常特工]android常见bug跟踪

    前言 对app的线上bug的收集(友盟.云捕等)有时会得到这样的异常堆栈信息:没有一行代码是有关自身程序代码的.这使得对bug的解决无从下手,根据经验,内存不足OOM,Dialog关闭,ListVie ...

  6. Entity Framework 6 Recipes 2nd Edition(13-2)译 -> 用实体键获取一个单独的实体

    问题 不管你用DBFirst,ModelFirst或是CodeFirst的方式,你想用实体键获取一个单独的实体.在本例中,我们用CodeFirst的方式. 解决方案 假设你有一个模型表示一个Paint ...

  7. Atitit 图像处理的摩西五经attilax总结

    Atitit 图像处理的摩西五经attilax总结 1. 数字图像处理(第三版)1 2. 图像处理基础(第2版)(世界著名计算机教材精选)1 3. 计算机视觉特征提取与图像处理(第三版)2 4. Op ...

  8. SVN:Previous operation has not finished; run 'cleanup' if it was interrupted

    异常处理汇总-开发工具  http://www.cnblogs.com/dunitian/p/4522988.html cleanup failed to process the following ...

  9. Python正则表达式中的re.S

    title: Python正则表达式中的re.S date: 2014-12-21 09:55:54 categories: [Python] tags: [正则表达式,python] --- 在Py ...

  10. .NET Core采用的全新配置系统[4]: “Options模式”下各种类型的Options对象是如何绑定的?

    旨在生成Options对象的配置绑定实现在IConfiguration接口的扩展方法Bind上.配置绑定的目标类型可以是一个简单的基元类型,也可以是一个自定义数据类型,还可以是一个数组.集合或者字典类 ...