布局相关对象及简介

窗体上的所有的控件必须有一个合适的尺寸和位置。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布局管理类的另一个原因是,在程序、系统改变字体,语言或者在不同的平台上运行时,布局管理器能够自动调整窗体里所有控件的大小和尺寸。

其他可进行布局管理的类:这些类的共同特点是提供了更加灵活的布局管理,在一定程度上用户能够控制窗体内控件的大小。

QSplitterQScrollAreaQMainWindowQWorkspace(对多文档的支持)

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的更多相关文章

  1. C/C++ -- Gui编程 -- Qt库的使用 -- Qt窗体的类型状态布局

    -----工程WindowTest----- 1.-----窗体类型type.cpp----- #include <QtGui> int main(int argc, char * arg ...

  2. Qt之布局管理--基本布局

    Qt提供的布局类以及他们之间的继承关系QLayout-----QGirdLayout | ---QBoxLayout----QHBoxLayout | --QVBoxLayout----------- ...

  3. Qt窗体内控件自适应调整大小

    http://stackoverflow.com/questions/3492739/auto-expanding-layout-with-qt-designer After creating you ...

  4. Qt窗体关闭时,如何自动销毁窗体类对象

    Qt窗体关闭时,如何自动销毁窗体类对象     要对你的窗口设置WA_DeleteOnClose属性,默认的情况下关闭窗口仅仅意味着隐藏它 ImgWindow1->setAttribute(Qt ...

  5. pyqt5 窗体布局

    窗体布局 1使用qtdesigner新建一个对话框,然后拖放几个按钮和文本框,按钮使用水平布局,效果如下: 鼠标选中水平布局再选中文本框,进行垂直布局,如下: 垂直布局后的效果如下: 然后,如何让窗体 ...

  6. Qt Quick 布局演示

    于 Qt Widgets 于,我们经常使用许多布局管理器来管理界面 widgets . 于 Qt Quick 实际上,有两个相关的管理和布局库,所谓集 Item Positioner ,所谓集 Ite ...

  7. C#入门经典(2-重置窗体布局,界面介绍,错误列表)

  8. c#学习笔记之使用 TableLayoutPanel 控件设置窗体布局

    使用 TableLayoutPanel 控件设置窗体布局 在 Visual Studio IDE 左侧,找到“工具箱”选项卡. 选择“工具箱”选项卡,随即将显示工具箱.(或者,在菜单栏上,依次选择“视 ...

  9. Qt之布局管理器

    简述 Qt的布局系统提供了一个简单的和强有力的方式,来自动排列窗口子控件布局. 所有QWidget子类可以使用布局来管理他们的子控件.QWidget::setLayout()函数可以为一个控件布局.当 ...

随机推荐

  1. c# MongoDB插入和批量插入,插入原理

    在开发之前,选择MongoDb驱动是件很重要的事情.如果选择不好,在后期的开发的是件很费力的事情,因为我就遇到这样的问题.MongoDb驱动有几种比较流行驱动,官方驱动和samus是两种使用比较多的. ...

  2. [Angular 2] Using Pipes to Filter Data

    Pipes allow you to change data inside of templates without having to worry about changing it in the ...

  3. Android中View和ViewGroup介绍

    1. 概念Android中的View与我们以前理解的“视图”不同.在Android中,View比视图具有更广的含义,它包含了用户交互和显示,更像Windows操作系统中的window. ViewGro ...

  4. [转] linux中cat more less head tail 命令

    1.cat 显示文件连接文件内容的工具: cat 是一个文本文件查看和连接工具.查看一个文件的内容,用cat比较简单,就是cat 后面直接接文件名. 比如: [root@localhost ~]# c ...

  5. Android(java)学习笔记227:服务(service)之服务的生命周期 与 两种启动服务的区别

    1.之前我们在Android(java)学习笔记171:Service生命周期 (2015-08-18 10:56)说明过,可以回头看看: 2.Service 的两种启动方法和区别: (1)Servi ...

  6. zoj 3537 Cake(区间dp)

    这道题目是经典的凸包的最优三角剖分,不过这个题目给的可能不是凸包,所以要提前判定一下是否为凸包,如果是凸包的话才能继续剖分,dp[i][j]表示已经排好序的凸包上的点i->j上被分割成一个个小三 ...

  7. 学习CSS一些事(上)

    p.s:这是我在学习中总结出来知识,如有不对,请多包涵.谢谢. CSS样式:行内样式,内部样式,外部样式,他们的优先级是:行内,内部,外部,遵循就近原则. 一.HTML+CSS布局分为三大类,一是流式 ...

  8. Ecstore后台中显示页面display,page,singlepage方法的区别?

    dispaly 显示的页面不包含框架的其他页面,只是本身的页面(使用范围:Ecstore的前端.后端). page 显示的页面包含在框架的里面(使用范围:Ecstore的前端.后端). singlep ...

  9. 在Global.asax文件里实现通用防SQL注入漏洞程序(适应于post/get请求)

    可使用Global.asax中的Application_BeginRequest(object sender, EventArgs e)事件来实现表单或者URL提交数据的获取,获取后传给SQLInje ...

  10. linq的一些用法总结

    获取列表数据. IList<Model> list = dao.getmx(Model, pageInfo);//获取数据列表 1.将列表中id一样的数据进行group by分组,并返回序 ...