简述

手动布局,可以实现和水平布局、垂直布局、网格布局等相同的效果,也可实现属于自己的自定义布局,当窗体缩放时,控件可以随之变化。

其对于坐标系的建立有严格要求,纯代码思维,使用复杂,不易维护,所以一般不建议使用。

下面我们以简单的例子来讲解如何使用。

事件

Qt之布局管理器一节中,我们介绍了对于手动布局的实现思路。

通过QWidget::resizeEvent()来计算所需要分配的大小,并且给每个子控件调用setGeometry()。

垂直布局

简略图

我们先简单看一个简略图,是一个一个垂直布局的界面,包含各个部位的组成以及大小限制。

其中Left Margin、Top Margin、Right Margin、Bottom Margin分别指各个控件距离窗体的左、上、右、下外边距,Spacing指控件之间的间距。

效果

源码

void MainWindow::resizeEvent(QResizeEvent *event)
{
QWidget::resizeEvent(event); int nSpacing = 10;
int nLeft = 10;
int nTop = 10;
int nRight = 10;
int nBottom = 10; // 标签位置、大小
m_pLabel->setGeometry(nLeft, nTop, width() - nLeft - nRight, 20); // 按钮大小
m_pButton->setFixedSize(75, 25); // 设置按钮位置
m_pButton->move(width() - m_pButton->width() - nRight, height() - nBottom - m_pButton->height()); // 中央窗体位置、大小
m_pCentralWidget->setGeometry(nLeft, nTop + nSpacing + m_pLabel->height(),
width() - nLeft - nRight, height() - nTop - 2 *nSpacing - m_pLabel->height() - m_pButton->height() - nBottom);
}

标签和中央窗体的宽度均为:width() - nLeft - nRight,即:窗体宽度 - 左边距 - 右边距。

标签的坐标为QPoint(nLeft, nTop),即:x为左边距,y为上边距。

中央窗体的坐标为:QPoint(nLeft, nTop + nSpacing + m_pLabel->height()),即:x:左边距,y:上边距 + 间距 + 标签高度。

中央窗体的高度为:height() - nTop - 2 nSpacing - m_pLabel->height() - m_pButton->height() - nBottom。即:窗体高度 - 上边距 - 标签高度 - 按钮高度 - 下边距 - 2 间距。

按钮大小为:QSize(75, 25),即:width:75,height:25。

按钮位置:QPoint(width() - m_pButton->width() - nRight, height() - nBottom - m_pButton->height())。即:x:窗体宽度 - 按钮宽度 - 右边距,y:窗体高度 - 按钮高度 - 下边距。

水平布局

实现思路不再过多讲解,参考垂直布局。

效果

源码

void MainWindow::resizeEvent(QResizeEvent *event)
{
QWidget::resizeEvent(event); int nSpacing = 10;
int nLeft = 10;
int nTop = 10;
int nRight = 10;
int nBottom = 10; m_pLeftButton->setFixedSize(75, 25);
m_pCentralButton->setFixedSize(75, 25);
m_pRightButton->setFixedSize(75, 25); // 居左
//m_pLeftButton->move(nLeft, nTop);
//m_pCentralButton->move(nLeft + m_pLeftButton->width() + nSpacing, nTop);
//m_pRightButton->move(nLeft + m_pLeftButton->width() + m_pCentralButton->width() + 2 * nSpacing, nTop); // 居右
m_pRightButton->move(width() - m_pRightButton->width() - nRight, nTop);
m_pCentralButton->move(width() - m_pCentralButton->width() - m_pRightButton->width() - nSpacing - nRight, nTop);
m_pLeftButton->move(width() - m_pLeftButton->width() - m_pCentralButton->width() - m_pRightButton->width() - 2 * nSpacing - nRight, nTop);
}

总结

好了,关于网格布局或其他复杂布局就不再一一介绍了,主要计算好各个控件的相对坐标即可。

有人肯定会有疑惑,为什么不使用setGeometry(10, 10, 100, 75),而必须通过resizeEvent()来计算坐标呢?

主要区别:

  • setGeometry(10, 10, 100, 75)采用绝对坐标和位置,适用于窗体大小固定的情况。一旦大小发生变化,则无计可施。

  • resizeEvent()计算坐标属于相对位置,无论窗体如何变化,都可以适应其在窗体中的布局。

最新文章

  1. C语言辗转相除法求2个数的最小公约数
  2. jquery1.7.2的源码分析(四)$.Deferred(2)
  3. JavaScript 中string方法
  4. SQL SERVER 2012 只能识别20个CPU的问题
  5. [水煮 ASP.NET Web API2 方法论](3-8)怎样给指定路由配置处理器
  6. 我爱记单词(iWords)之NABC by张恿
  7. 创建线程方式-NSThread
  8. ICMP
  9. 怎么通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端?
  10. Myeclipse 10.x 安装Aptana3.2 插件
  11. Android开发之自定义组合控件
  12. FreeModbus for stm32(Keil工程)——精简Modbus slave协议【worlsing笔记】
  13. 查看mysql数据库表大小和最后修改时间
  14. 如何判断js是否加载完全
  15. Quartz源码——QuartzSchedulerThread.run() 源码分析(三)
  16. Idea快捷键和使用技巧【未完】
  17. spring data jpa、Hibernate开启全球唯一UUID设置
  18. MAKEWORD 宏(macro)
  19. 【JVM.4】调优案例分析与实战
  20. Java-Runoob-高级教程-实例-方法:03. Java 实例 – 汉诺塔算法-un

热门文章

  1. zabbix_get 获取agnet端mysql数据失败
  2. 2019-03-28 Python SQL 的注释
  3. linux上重启jboss服务器
  4. 关于一些运算(&(与运算)、|(或运算)、^(异或运算)........)的本质理解【转】
  5. JavaScript push(),join() 函数
  6. Python——异常基础
  7. RT-Thread开篇
  8. windowsclient崩溃分析和调试
  9. poj_3468线段树成段更新求区间和
  10. 简述Sql Server中常用的数据库对象(面试题)