Qt的5种经常使用布局搭建

Qt布局详解:php

 

界面开发首先要对整个界面进行布局,使窗体上的全部的控件必须有一个合适的尺寸和位置。那么作出来的界面才看起来美观。设计模式

那么如何对界面进行布局呢?Qt提供了一些类负责排列窗体上的控件,主要有:QHBoxLayout,QVBoxLayout,QGridLayout,QFormLayout,QStackLayout。(布局管理类)这些类简单易用,不管在代码中仍是用Qt Designer开发程序都能用到。app

      经常使用的布局方法:编辑器

(1)使用水平布局类QHBoxLayout;ide

(2)使用垂直布局类QVBoxLayout;函数

(3)使用网格布局类QGridLayout;工具

(4)使用表格布局类QFormLayout;布局

(5)使用分组布局类QStackLayout(  QStackedLayout类把子控件进行分组或者分页,一次只显示一组或者一页,隐藏其余组或者页上的控件)。字体

这些方法能够嵌套使用。使用这些Qt布局管理类的另外一个缘由是,在程序、系统改变字体,语言或者在不一样的平台上运行时,布局管理器可以自动调整窗体里全部控件的大小和尺寸。ui

布局管理的三种方式:

Qt中有三种方式对窗体上的控件进行布局管理:

1.绝对位置定位(absolute positioning):控件布局是固定位置,没有自适应功能。

例子以下:

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);

                             

2.手工布局(manual layout):给出控件的绝对位置,可是他们的尺寸根据窗口的大小肯定,能够经过重写窗体控件的resizeEvent()实现对子控件的大小设置。

 

3.布局管理器(layout managers):运用QHBoxLayout、QVBoxLayout、QGridLayout 、QFormLayout、QStackLayout布局。

 

(1).Horizontal Layout布局设置(水平布局):他包含的对象都横向排列开,示例如图3-1所示:

                                         

 

                                             图 3-1  水平布局

(2).Vertical Layout布局设置(垂直布局):他包含的对象都纵向排列开,示例如图3-2所示:

                                                      

                                                 图3-2  竖直布局

 

(3).Grid Layout布局设置(网格布局):将控件放置到网格中布局,它自己会从父窗口或父布局中占据尽量多的界面空间,而后把本身的空间划分为行和列,再把每一个控件塞到设置好的一个或多个单元格中。一般状况下 QGridLayout不须要本身添加空白条 QSpacerItem,由于其余功能控件把各自的单元格占据以后,剩下没控件占据的单元格天然就是空的,空的格子默认里面什么都没有,也没有空白条。示例如图3-3所示:

                               

                                                  图3-3 网格布局

(4).Form Layout布局设置(表格布局):专门用于管理输入控件和与之相关的标签等表单布局,QFormLayout固定为两列布局,并针对表单作了建模,配套了一堆方便使用的函数。网格布局器的基本单元是单元格,而表单布局器的基本单元是行。表单布局器是高度建模并封装的,它没有 addWidget()和 addLayout()之类的函数,它只有addRow()函数。表单布局器中一行的空间能够由多个控件占据,也能够由一个控件占据。示例如图3-4所示:

                                        

                                                    图3-4 表格布局

(5).布局管理器在指定的位置留出一块空间:(Qt Designer中,能够加入一个spacer实现这一功能)示例如图3-5所示:

                                   

                                                 图3-5  布局留出指定空间

(6).QSpliter分割器的做用:分裂器 QSplitter 是一个实体功能控件,它的基类是 QFrame,QFrame 基类正是 QWidget。QSplitter 能够独立存在,能够做为父窗口容纳多个子控件,分裂器会彻底拥有内部的子控件。在 Qt 设计师或 QtCreator 设计模式左边 Widget Box 里面没有分裂器能够拖动,使用分裂器的方式是:选中已有的控件,而后点击上面工具栏的水平分裂器或垂直分裂器按钮。好比上图是将三个丰富文本编辑器做为一个水平分裂器排布 的。分裂器内每一个控件都有一个手柄 Handle,水平分裂器内控件的手柄在左边,垂直分裂器内控件的手柄在控件上方。第 0 个控件的手柄是永久隐藏的,分裂器自身占据的大矩形四个边界线一般不能拖动拉大,只能拖动控件之间的手柄,好比上图的手柄 1 和 手柄 2 。分裂器总体的尺寸不是用户控制的,而在分裂器内部的控件尺寸可让用户手工拖动手柄来控制。在程序运行时,水平分裂器内各个控件的宽度、垂直分裂器内部各个控件的高度, 通常都是用户拖动手柄控制,这是分裂器和布局器最大的不一样。

具体操做以下图3-6所示:

                           

                                                               图  3-6

实际效果以下图3-7所示:

                                           

                                                     图 3-7分割实际效果图

 

 

 

sizepolicy:

1. Fixed: 大小不能改变

2. Minimum: 已是最小, 不能再被缩小, 但能放大.

3. Maximum: 已是最大, 不能再被放大, 但能缩小.

4. Preferred:  控件的sizeHint()是他的sizeHint, 能被缩小, 放大.

5. Expanding: 控件能够自行增大或者缩小.


 


设置部件大小

只要是继承自QWidget的类都有如下两个属性:

大小提示:siziHint() 保存部件的建议大小信息 ->经过函数可获取

最小大小提示:minimumSizeHint() 保存部件的建议最小大小信息 ->经过函数可获取

sizePolicy属性:

常量 描述
QSizePolicy::Fixed 只能使用sizeHint()提供的值,没法伸缩
QSizePolicy::Minimum siziHint()提供的大小是最小的,部件能够被拉伸
QSizePolicy::Maximum sizeHint()提供的是最大大小,部件能够被压缩
QSizePolicy::Preferred sizeHint()提供的大小是最佳大小,能够拉伸能够压缩
QSizePolicy::Expanding sizeHint()提供的是合适的大小,部件能够被压缩,不过更倾向于拉伸来得到更多的空间
QSizePolicy::MinimumExpanding sizeHint()提供的大小是最小的,部件倾向于被拉伸来获取更多的空间
QSizePolicy::Ignored sizeHint()的值被忽略,部件将尽量的被拉伸来获取更多的空间

关于伸缩因子(stretch factor)的概念:在代码中,能够在使用布局管理器的addWidget()函数添加部件时,在第二个参数指定伸缩因子。2,1

 

QLayout

属性 说明
layoutName 如今所使用的布局管理器的名称
layoutLeftMargin 设置布局管理器到界面左边界的距离
layoutTopMargin 设置布局管理器到界面上边界的距离
layoutRightMargin 右边界
layoutBottomMargin 下边界
layoutSpacing 布局管理器各个子部件间的距离
layoutStretch 伸缩因子
layoutSizeConstraint 设置大小约束条件

QT窗口尺寸,窗口大小和大小改变引发的事件 QResizeEvent。

来源: http://www.qtcn.org/bbs/apps.php?q=diary&a=detail&did=1277&uid=139581

 

 

 


来源:http://blog.csdn.net/dbzhang800/article/details/6741344?reload
操做:


frameGeometry()


几何尺寸(位置+大小)


对于窗口,包含窗口装饰器


x()y()pos()


只包含位置信息(左上角坐标)


move()


只移动位置


geometry()


几何尺寸(位置+大小)


不包含窗口装饰器


width()height()rect()size()


只包含大小信息


setGeometry()


改变位置+大小


resize()


只改变大小



一直在考虑怎么使中心窗口在主窗口全屏以后,中心窗口也按比例放大。
其中包括,中心窗口的大小适应,中心窗口
1.建立你的UI,其中使用弄好你的顶级布局,选中widget窗口 - 点击右键 - 布局 - 栅格布局。

2.构造函数中





复制代码

  1.   centralWidget = new QWidget;
       QWidget * a = new QWidget(centralWidget);
       ui1->setupUI(a);
         a->hide();
       QWidget * b = new QWidget(centralWidget);
       ui2->setupUI(b);
         b->hide();
       setCentralWidget(centralWidget) //这样的好处在于,你能够弄不少ui,想使用哪一个UI直接uin->setupUI(widgetn),再widgetn->show()就能够了。








3.可是若是你想拖动主窗口的时候,可以让窗口中的组件随着窗口也能缩放的话,须要重写resizeEvent,缘由在于,在构造以后,子窗口的大小就是固定的。

复制代码

  1. void resizeEvent(QresizeEvent* size){
        centralWidget->resize(frameGeometry().size()); //是采用size()仍是frameGeometry.size()根据本身的需求。
    }

有什么问题,请留言说明,你们一块儿交流而且解决。 附加设备相关的屏幕尺寸信息,若是你重写resizeEvent的话,我认为这是没必要要的。 QDesktopWidget* desktopWidget = QApplication::desktop(); //获得客户区矩形 QRect clientRect = desktopWidget->availableGeometry(); //获得应用程序矩形 QRect applicationRect = desktopWidget->screenGeometry();

相关文章
相关标签/搜索