Qt——中心窗口setCentralWidget
有时候,某些有特殊要求的应用程序需要在自定义窗口部件中显示数据,你可以把自定义的窗口部件作为中心窗口部件。例如,你的绘图编辑器程序程序就可以使用类似名为PhotoEditor的自定义窗口部件作为自己的中心窗口部件。
有时候,应用程序的中央区域会被许多窗口部件所占用。这时就可以通过使用一个作为所有这些其他窗口部件父对象的QWidget,以及通过使用布局管理器管理这些子窗口部件的大小和位置来完成这一特殊情况。
其实,这种情况是上一种情况的一个例子。多个窗口部件一起使用的另一种方法是使用QSplitter。我们把QSplitter作为一个容器,在其中容纳其它的窗口部件,这时的中心窗口部件就是一个QSplitter。QSplitter会在水平方向或者竖直方向上排列它的子窗口部件,用户可以利用切分条(splitter handle)控制他们的尺寸大小。切分窗口可以包含所有类型的窗口部件,包括其他切分窗口。
如果应用程序使用的是多文档界面,那么它的中心区域就会被QMdiArea窗口部件所占据,并且每个多文档界面窗口都是它的一个子窗口界面。QMdiArea是在Qt4.3以后引入的一个支持多文档应用的类。
这种情况通常用于多文档应用程序中,这时应用程序主窗口的中心部件是一个QWorkspace部件或者它的子类化部件。但这种方法在Qt4.5以后将被废弃。后面我们还会讲到它。 一个Qt主窗口应用程序必须有一个中心窗口部件(Central Widget)。当你采用Qt Designer创建主窗口时,默认情况下,系统已经为你创建了一个中心窗口部件,它是子类化QWidget的。 结合代码可以方便的设置中心窗口部件,可以调用主窗口类的setCentralWidget()方法,它的原型如下:
Qt应用程序的主窗口管理着中心窗口部件,它会在合适的时候销毁这个中心窗口部件。每次程序调用setCentralWidget()方法时,先前存在的中心窗口部件将被新的所替换,而且主窗口会销毁原来的部件,无需用户处理。 要想在程序中获得并使用、设置中心窗口部件也很简单,通过调用主窗口类的centralWidget()方法即可实现,它的函数原型如下:
QT设置centralWidget布局设置之前是这样的,这时候即使设置了控件的布局,实际上控件大小还是不会跟这变,因为centralWidget没有设置布局。
Qt布局详解:
界面开发首先要对整个界面进行布局,使窗体上的所有的控件必须有一个合适的尺寸和位置。那么做出来的界面才看起来美观。 那么如何对界面进行布局呢?Qt提供了一些类负责排列窗体上的控件,主要有:QHBoxLayout,QVBoxLayout,QGridLayout,QFormLayout,QStackLayout。(布局管理类)这些类简单易用,无论在代码中还是用Qt Designer开发程序都能用到。 常用的布局方法: (1)使用水平布局类QHBoxLayout; (2)使用垂直布局类QVBoxLayout; (3)使用网格布局类QGridLayout; (4)使用表格布局类QFormLayout; (5)使用分组布局类QStackLayout( QStackedLayout类把子控件进行分组或者分页,一次只显示一组或者一页,隐藏其他组或者页上的控件)。 这些方法可以嵌套使用。使用这些Qt布局管理类的另一个原因是,在程序、系统改变字体,语言或者在不同的平台上运行时,布局管理器能够自动调整窗体里所有控件的大小和尺寸。 布局管理的三种方式: 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的类都有以下两个属性: 大小提示: 最小大小提示: sizePolicy属性:
关于伸缩因子(stretch factor)的概念:在代码中,可以在使用布局管理器的addWidget()函数添加部件时,在第二个参数指定伸缩因子。2,1
QLayout
QT窗口尺寸,窗口大小和大小改变引起的事件 QResizeEvent。来源: http://www./bbs/apps.php?q=diary&a=detail&did=1277&uid=139581
QT 栅格布局(Grid Layout),设置控件所占行数(rowSpan)和所占列数(columnSpan)QT的栅格布局(Grid Layout)划分了行和列,能够将控件放入一个网状的栅格之中显示,每个控件能够占一格或多行多列,例如: 但是如果先拖入一个Grid Layout,再添加控件是没办法设置控件所占行列的,要用其他的办法才可以。 控件占任意行列的布局方法:方法一:1.先将控件的位置摆好如图: 2.全选控件,点上方的栅格布局,控件的位置就自动设置好了。 3.要追加控件,先选中gridlayout,点击打破布局 再添加控件并摆放好位置,全选重新点栅格布局就行了 方法二:代码的方式添加,有点繁琐 void addWidget(QWidget *, int row, int column, int rowSpan, int columnSpan, Qt::Alignment = 0); 在创建栅格布局完成后,就可以使用addWidget(),addItem(),以及addLayout()方法向其中加入窗口部件,以及其它的布局。 例子:
效果: Qt 让弹出的窗口居中显示设置窗口居中显示这是在UI编程中经常要遇到的问题。 方法一:在窗口(QWidget类及派生类)的构造函数中添加如下代码: 方法二:在调用show()函数后调用move()函数,j将窗口移动到屏幕中央。 #include <QDesktopWidget> int main(int argc, char *argv[]) } |
|