Qt 窗体布局 good
布局相关对象及简介
窗体上的所有的控件必须有一个合适的尺寸和位置。Qt提供了一些类负责排列窗体上的控件,主要有:QHBoxLayout,QVBoxLayout,QGridLayout,QStackLayout。(布局管理类)这些类简单易用,无论在代码中还是用Qt Designer开发程序都能用到。

1) 布局类简介
QHBoxLayout:水平布局
QVBoxLayout:垂直布局
QGridLayout: 表格布局
QGridLayout::addWidget()语法
layout->addWidget(widget, row, column, rowSpan, columnSpan);
参数widget:为插入到这个布局的子控件;
参数(row,column)为控件占据的左上角单元格位置;
参数rowSpan是控件占据的行数,
参数colunmSpan是控件占据的列的个数。
(rowSpan和colunmSpan默认值为1)
Stacked Layouts:分组布局
QStackedLayout类把子控件进行分组或者分页,一次只显示一组或者一页,隐藏其他组或者页上的控件。
使用这些Qt布局管理类的另一个原因是,在程序、系统改变字体,语言或者在不同的平台上运行时,布局管理器能够自动调整窗体里所有控件的大小和尺寸。
其他可进行布局管理的类:这些类的共同特点是提供了更加灵活的布局管理,在一定程度上用户能够控制窗体内控件的大小。
QSplitter,QScrollArea,QMainWindow,QWorkspace(对多文档的支持)
2) 布局管理中结合控件的sizePolicy属性,进行调整
结合控件的SizePolicy属性,来控制布局管理中的控件的尺寸自适应方式。
控件的sizePolicy说明控件在布局管理中的缩放方式。Qt提供的控件都有一个合理的缺省sizePolicy,但是这个缺省值有时不能适合所有的布局,开发人员经常需要改变窗体上的某些控件的sizePolicy。一个QSizePolicy的所有变量对水平方向和垂直方向都适用。下面列举了一些最长用的值:
A. Fixed:控件不能放大或者缩小,控件的大小就是它的sizeHint。
B. Minimum:控件的sizeHint为控件的最小尺寸。控件不能小于这个sizeHint,但是可以
放大。
C. Maximum:控件的sizeHint为控件的最大尺寸,控件不能放大,但是可以缩小到它的最小
的允许尺寸。
D. Preferred:控件的sizeHint是它的sizeHint,但是可以放大或者缩小
E. Expandint:控件可以自行增大或者缩小
注:sizeHint(布局管理中的控件默认尺寸,如果控件不在布局管理中就为无效的值)
1.1.1. 布局管理的三种方式
Qt中有三种方式对窗体上的控件进行布局管理:绝对位置定位(absolute positioning),手工布局(manual layout),布局管理器(layout managers)
1.1.1.1. 绝对位置定位(控件布局是固定位置,没有自适应功能)
例子:
QWidget *pWidget = new QWidget;
QLabel label(pWidget);
label.setText(QObject::tr("姓名:"));
label.setGeometry(10,10,20,20);
QLineEdit namedLineEdit("小明",pWidget);
namedLineEdit.setGeometry(35,10,50,20);
QPushButton *btn = new QPushButton(QObject::tr("关闭"),pWidget);
btn->setGeometry(90,10,40,20);
图例:

1.1.1.1. 手工布局
给出控件的绝对位置,但是他们的尺寸根据窗口的大小确定,可以通过重写窗体控件的resizeEvent()实现对子控件的大小设置。
1.1.1.1. 布局管理器
例子1:运用QHBoxLayout、QVBoxLayout、QGridLayout布局

//leftLayout布局设置(表格布局)
/* QGridLayout: 二维的单元格*/
QGridLayout *leftLayout = new QGridLayout;
leftLayout->addWidget(&namedLabel, 0, 0); //起始(0行,0列),尺寸(1行,1列)
leftLayout->addWidget(&namedLineEdit, 0, 1);
leftLayout->addWidget(&lookInLabel, 1, 0);
leftLayout->addWidget(&lookInLineEdit, 1, 1);
leftLayout->addWidget(&subDirCheckBox, 2, 0, 1, 2);//起始(3行,0列),尺寸(1行,2列)
leftLayout->addWidget(&tableWidget, 3, 0, 1, 2);
leftLayout->addWidget(&messageLabel, 4, 0, 1, 2);
//rightLayout布局设置(垂直布局)
QVBoxLayout *rightLayout = new QVBoxLayout;
rightLayout->addWidget(&findButton);
rightLayout->addWidget(&stopButton);
rightLayout->addWidget(&closeButton);
//布局管理器在指定的位置留出一块空间(Qt Designer中,可以加入一个spacer实现这一功能)
rightLayout->addStretch();
rightLayout->addWidget(&helpButton);
//mainLayout布局设置(水平布局)
QHBoxLayout *mainLayout = new QHBoxLayout;
mainLayout->addLayout(leftLayout);
mainLayout->addLayout(rightLayout);
pWidget->setLayout(mainLayout);//设置Widget窗口控件的布局风格
pWidget->setWindowTitle(QObject::tr("查找文件及文件夹"));
例子1图列:

1.1.1.1.1. 例子2:运用Stacked Layouts:分组布局
例子:
//创建QWidget类的一个对象pWidget
QWidget *pWidget = new QWidget;
//创建一个布局管理器类 layout
QHBoxLayout *manLayout = new QHBoxLayout;
//左边的列表控件
QListWidget *listWidget = new QListWidget(pWidget);
listWidget->addItem(QObject::tr("外观设置"));
listWidget->addItem(QObject::tr("网页浏览"));
...
//右边的分页控件
QWidget *page1 = new QWidget(pWidget);
<…page1上增加控件>
QWidget *page2 = new QWidget(pWidget);
<…page2上增加控件>
<设置布局管理>
QVBoxLayout *leftLayout = new QVBoxLayout;
leftLayout->addWidget(listWidget);
....
//右边分页布局(两页窗口)
QStackedLayout *stackedLayout = new QStackedLayout;
stackedLayout->addWidget(page1);
stackedLayout->addWidget(page2);
//通过调用QWidget::setLayout()函数,将layout布局管理器类添加到窗口部件对象pWidget中
manLayout->addLayout(leftLayout);
manLayout->addLayout(stackedLayout);
pWidget->setLayout(manLayout);
listWidget->setCurrentRow(0);
//关联:列表与分组布局
QObject::connect(listWidget, SIGNAL(currentRowChanged(int)),
stackedLayout, SLOT(setCurrentIndex(int)));
pWidget->show();
图例:


http://www.cnblogs.com/qq78292959/archive/2012/08/13/2637209.html
Qt 窗体布局 good的更多相关文章
- C/C++ -- Gui编程 -- Qt库的使用 -- Qt窗体的类型状态布局
-----工程WindowTest----- 1.-----窗体类型type.cpp----- #include <QtGui> int main(int argc, char * arg ...
- Qt之布局管理--基本布局
Qt提供的布局类以及他们之间的继承关系QLayout-----QGirdLayout | ---QBoxLayout----QHBoxLayout | --QVBoxLayout----------- ...
- Qt窗体内控件自适应调整大小
http://stackoverflow.com/questions/3492739/auto-expanding-layout-with-qt-designer After creating you ...
- Qt窗体关闭时,如何自动销毁窗体类对象
Qt窗体关闭时,如何自动销毁窗体类对象 要对你的窗口设置WA_DeleteOnClose属性,默认的情况下关闭窗口仅仅意味着隐藏它 ImgWindow1->setAttribute(Qt ...
- pyqt5 窗体布局
窗体布局 1使用qtdesigner新建一个对话框,然后拖放几个按钮和文本框,按钮使用水平布局,效果如下: 鼠标选中水平布局再选中文本框,进行垂直布局,如下: 垂直布局后的效果如下: 然后,如何让窗体 ...
- Qt Quick 布局演示
于 Qt Widgets 于,我们经常使用许多布局管理器来管理界面 widgets . 于 Qt Quick 实际上,有两个相关的管理和布局库,所谓集 Item Positioner ,所谓集 Ite ...
- C#入门经典(2-重置窗体布局,界面介绍,错误列表)
- c#学习笔记之使用 TableLayoutPanel 控件设置窗体布局
使用 TableLayoutPanel 控件设置窗体布局 在 Visual Studio IDE 左侧,找到“工具箱”选项卡. 选择“工具箱”选项卡,随即将显示工具箱.(或者,在菜单栏上,依次选择“视 ...
- Qt之布局管理器
简述 Qt的布局系统提供了一个简单的和强有力的方式,来自动排列窗口子控件布局. 所有QWidget子类可以使用布局来管理他们的子控件.QWidget::setLayout()函数可以为一个控件布局.当 ...
随机推荐
- 《Java 并发编程实战》读书笔记之二:图文讲述同步的另一个重要功能:内存可见性
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17288243 加锁(synchronized同步)的功能不仅仅局限于互斥行为,同时还存在另 ...
- 当在类中的 Parcelable 接口使用 ArrayList < customObject > android 系统: nullPointerException
我想使调用音乐使用 parcelable,所以我可以访问两个不同的活动中的音乐的实例的类.我不想使用可序列化的速度的目的.当我尝试将它使用传递时,我总是收到 nullPointerException: ...
- TextView的ems和MaxLength
<EditText android:id="@+id/et_code" android:layout_width="wrap_content" andro ...
- Qt 学习之路 :线程简介
现代的程序中,使用线程的概率应该大于进程.特别是在多核时代,随着 CPU 主频的提升,受制于发热量的限制,CPU 散热问题已经进入瓶颈,另辟蹊径地提高程序运行效率就是使用线程,充分利用多核的优势.有关 ...
- VS项目属性配置实验过程
(原创,转载注明出处:http://www.cnblogs.com/binxindoudou/p/4017975.html ) 一.实验背景 cocos2d-x已经发展的相对完善了,从项目的创建.编译 ...
- 《Android开发艺术探索》读书笔记 (4) 第4章 View的工作原理
本节和<Android群英传>中的第3章Android控件架构与自定义控件详解有关系,建议先阅读该章的总结 第4章 View的工作原理 4.1 初始ViewRoot和DecorView ( ...
- 《Android开发艺术探索》读书笔记 (1) 第1章 Activity的生命周期和启动模式
第1章 Activity的生命周期和启动模式 1.1 Activity生命周期全面分析 1.1.1 典型情况下生命周期分析(1)一般情况下,当当前Activity从不可见重新变为可见状态时,onRes ...
- Android真正意义上的无限轮播Banner
在android开发的时候,经常会使用到轮播图,对于这种效果,一般情况下,我们都会使用一种叫做ViewPager的来实现. 传统的实现逻辑是自定义一个View继承ViewPager,在适配器中 将co ...
- POJ 1655 Balancing Act&&POJ 3107 Godfather(树的重心)
树的重心的定义是: 一个点的所有子树中节点数最大的子树节点数最小. 这句话可能说起来比较绕,但是其实想想他的字面意思也就是找到最平衡的那个点. POJ 1655 题目大意: 直接给你一棵树,让你求树的 ...
- 【转】HttpServlet详解
[转]HttpServlet详解 Servlet的框架是由两个Java包组成:javax.servlet和javax.servlet.http. 在javax.servlet包中定义了所有的Servl ...