深度探索Qt窗口系统——布局篇

虽然界面管理器可以完成窗口布局,但是对于动态布局的情况下,这种做法就无能为力了,现实中界面经常要支持国际化,对于同一内容用不同语言翻译可能长度不一,这就需要窗口动态布局,如果采用界面管器布局窗口的话,则每一种语言可能都要设计一种界面,这给设计带来很大的不便,可以说,好的窗口布局能让界面设计变的更容易,更简单。在几何篇介绍了可以通过setGeometry、move、resize等方法来调整窗口的位置和大小,但这些做法都需要手工计算窗口的大小和位置,如果通过这些办法来设计GUI,无疑设计效率是低下的。幸运的是,QT给我们提供了4种布局:水平、垂直、网格、栈布局。虽没有java布局管理器那么多样化,然这4种布局已够用了。

1. Qt布局类架构

如上图,QHBoxLayout,按水平方向组织管理QT窗口部件;QVBoxLayout,按垂直方向组织管理QT窗口部件;QGridLayout,按二维网格的方式管理QT窗口布局;QStackedLayout,按一种类似于栈的方式组织管理Qt窗口部件,在某一时刻,只有一种窗口部件是可见的。

2. 布局管理器管理窗口的策略

  1. 一个布局既可以管理多个子窗口(最多管理多少个子窗口,这个我没有测试,应该应用中不会有超过它的上限),同时又可以管理多个布局。
  2. 默认情况下,布局管理器布局窗口的策略是,尽可能向水平和垂直方向延伸到它本身的尺寸的上限,如果布局里有子窗口和布局的话,子窗口和布局平均分配它们的父亲布局的尺寸。

3. 怎么使用布局管理器布局窗口?

1. 水平布局

实现代码:

#include <qwidget.h>

#include <qdebug.h>

#include <qlabel.h>

#include <qlineedit.h>

#include <QtGui/QApplication>

class CHLayoutTest : public QWidget

{

public:

CHLayoutTest(QWidget *parent = NULL) : QWidget(parent)

{

QPushButton *ppbButton1 = new QPushButton("button1", this);

QPushButton *ppbButton2 = new QPushButton("button2", this);

QPushButton *ppbButton3 = new QPushButton("button3", this);

QHBoxLayout *phLayout = new QHBoxLayout;

phLayout->addWidget(ppbButton1);

phLayout->addWidget(ppbButton2);

phLayout->addWidget(ppbButton3);

setLayout(phLayout);

}

};

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

CHLayoutTest widget;

widget.show();

return a.exec();

}

布局管理器安装到窗口控件的方法:

(1).通过setLayout方法,如上第18行;

(2).通过布局管理器的构造函数的方法,如将上面第14行的QHBoxLayout *phLayout = new QHBoxLayout(this);

(3).窗口的布局一旦安装,就不能再安装其他布局了,要想安装其他布局,办法只有一个先删除之前安装的布局,怎么删除呢?

通过窗口的layout()方法,返回布局指针,然后删掉它,如下:

QLayout *pLayout = layout();

delete pLayout;

这样你就可以通过(1),(2)的方式再次安装布局了。

2.重直布局

实现代码:

QPushButton *ppbButton1 = new QPushButton("button1", this);

QPushButton *ppbButton2 = new QPushButton("button2", this);

QPushButton *ppbButton3 = new QPushButton("button3", this);

QVBoxLayout *pvLayout = new QVBoxLayout;

pvLayout->addWidget(ppbButton1);

pvLayout->addWidget(ppbButton2);

pvLayout->addWidget(ppbButton3);

setLayout(pvLayout);

3.网格布局

实现代码:

QPushButton *ppbButton1 = new QPushButton("button1", this);

QPushButton *ppbButton2 = new QPushButton("button2", this);

QPushButton *ppbButton3 = new QPushButton("button3", this);

QGridLayout *pgLayout = new QGridLayout;

pgLayout->addWidget(ppbButton1, 0, 0);

pgLayout->addWidget(ppbButton2, 0, 1);

pgLayout->addWidget(ppbButton3, 1, 1);

setLayout(pgLayout);

4.栈布局

实现代码:

QPushButton *ppbButton1 = new QPushButton("button1", this);

QPushButton *ppbButton2 = new QPushButton("button2", this);

QPushButton *ppbButton3 = new QPushButton("button3", this);

QStackedLayout *psLayout = new QStackedLayout;

psLayout->addWidget(ppbButton1);

psLayout->addWidget(ppbButton2);

psLayout->addWidget(ppbButton3);

//psLayout->setCurrentIndex(1);

setLayout(psLayout);

可以看到,栈布局每次只能显示1个控件,通过setCurrentIndex可以显示其他的控件。另外值得一提的是,QStackedWidget也可以实现像QStackedLayout一样的功能。

深度探索Qt窗口系统——布局篇相关推荐

  1. 深度探索QT窗口系统——几何篇

    深度探索QT窗口系统--几何篇 窗口作为界面编程中最重要的部分,没有窗口就没有界面,是窗口让我们摆脱了DOS时代,按钮是一个窗口,文本框是一个窗口,标签页是一个窗口.一个窗口可以由多个窗口组成,每天我 ...

  2. 将OSG嵌入QT窗口系统中,实现拖拽界面

    将OSG嵌入QT窗口系统中,实现拖拽界面 一.原理 OSG底层使用的是OpenGL图形系统,QT也增加了对OpenGL的支持,因此,可以通过QT的OpenGL模块,实现将OSG窗口嵌入到QT中,这样可 ...

  3. 【Qt】Qt窗口几何布局

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 窗口几何布局 04. 程序示例 05. 窗口部件设置 06. 附录 01. 概述 QT中的坐标系统以左上角为原点,水平为x ...

  4. nubia基于android深度定制的ui,系统硬件篇:走心的Nubia UI

    系统篇:走心的Nubia UI 系统方面,努比亚M2搭载了基于Android深度定制的Nubia UI 4.0系统,同时针对努比亚M2的定位和风格,对系统的界面和图标进行了重新的绘制,这款换上全新风格 ...

  5. 《Android深度探索(卷2):系统应用源代码分析与ROM定制》——第6章,第6.4节分析第一个Android系统应用:计算器...

    本节书摘来自异步社区<Android深度探索(卷2):系统应用源代码分析与ROM定制>一书中的第6章,第6.4节分析第一个Android系统应用:计算器,作者 李宁,更多章节内容可以访问云 ...

  6. Qt开源库-顶级浮动窗口系统-Advanced-Docking-System【01】

    一.序言 顶级浮动窗口是大型软件中的常备组件,例如Visual Studio Code软件界面: 在上图中,将软件界面划分为不同的功能区,每个功能区负责显示软件的一部分功能.在上图中有项目工程管理窗口 ...

  7. 深度探索C++ 对象模型(7)-Data member的布局(虚继承)

    虚拟继承 namespace ObjectMultiDerived {class Point2d {public:// has virtual functionsvirtual void print( ...

  8. [Qt教程] 第47篇 进阶(七) 定制Qt帮助系统

    [Qt教程] 第47篇 进阶(七) 定制Qt帮助系统 楼主  发表于 2013-10-7 09:32:39 | 查看: 93| 回复: 0 定制Qt帮助系统 版权声明 该文章原创于Qter开源社区(w ...

  9. Qt编程入门(2) : 窗口和布局(2)

    窗口和布局是Qt主要的组成部分,Qt为此封装了至少几百个Class,要全部掌握这些Class是不现实的,也是不明智的.本章重点介绍几个常用的窗口和布局管理器的基本用法,只帮助起到一个引领入门的作用.对 ...

最新文章

  1. 离散信号与系统分析(上)
  2. QComboBox样式
  3. css 字体字体图标_CSS基础知识:了解字体
  4. 基因组浏览器使用 (EPGG)
  5. JavaScript执行bat文件清理浏览器缓存
  6. 语言常用c100单词,英语口语练习_夏普新款PW-C100-G电子词典测评_沪江英语
  7. Spring : Spring @Transactional-嵌套事物回滚
  8. Leetcode744.Find Smallest Letter Greater Than Target寻找比目标字母大的最小字母
  9. Windows监听进程的两个函数
  10. Hibernate--Criteria Query and DetachedCriteria
  11. word 软换行与硬换行
  12. NATS--NATS Streaming持久化
  13. excel常用函数及功能操作
  14. asp.net打印错误日志
  15. Java期末考试试题及参考答案(01)
  16. abc237 D(想了一个小时结果跟模拟双向链表的插入一毛一样,老废物了,思路不清晰,建议remake)
  17. eclipse输出中文变成乱码问题
  18. Jdbc系列八:批量处理
  19. 联想禁止 win10 更新 v2.11 免费版
  20. 英语语法---状语详解

热门文章

  1. 华为 2017 秋季校招笔试题(C++ 后台)
  2. spring boot的gradle整合日志
  3. 2017-2018-1 20155321 20155330 《信息安全系统设计基础》实验四——外设驱动程序设计...
  4. 第四届蓝桥杯c/c++B组8
  5. Xcode8 报 ”xx“is missing from working copy 的问题解决方法
  6. 真机调试 —— An unknown error occurred.
  7. BZOJ 2431 DP
  8. NodeJS学习笔记之express
  9. 任意手机虚拟按键增加方法
  10. Spring Bean垃圾回收