第4章布局管理19_第1页
第4章布局管理19_第2页
第4章布局管理19_第3页
第4章布局管理19_第4页
第4章布局管理19_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、4.1 分割窗口QSplitter类4.2 停靠窗口QDockWidget类4.3 堆栈窗体QStackedWidget类4.4 基本布局(QLayout)窗体上的所有的控件必须有一个合适的尺寸和位置。Qt 提供了一些类负责排列窗体排列窗体上的控件,主要有:QHBoxLayout,QVBoxLayout,QGridLayout,QStackLayout。其他能够进行布局管理布局管理的类还有QSplitter,QScrollArea,QMainWindow,QWorkspace。这些类的共同特点是提供了更加灵活的布局管理,在一定程度上用户能够控制窗体内控件的大小。 例如,QSplitter 类显

2、示一个分隔条(splitter bar),用户拖动分隔条时就可以改变控件的大小。 QWorkspace 提供了对多文档(MDI,multiple document interface)的支持使用这些Qt 布局管理类的另一个原因是,在程序改变字体,语言或者在程序改变字体,语言或者在不同的平台上运行时,布局管理器能够自动调整窗体里所有控件的在不同的平台上运行时,布局管理器能够自动调整窗体里所有控件的大小和尺寸大小和尺寸下面介绍一个十分简单的分割窗口功能,整个对话框由3个窗口组成,各窗口之间的大小可随意拖动改变,效果如图4.1所示。 一个QSplitter 控件中可以包含其他控件,这些控件被一个分隔

3、条隔开,托拽这个分隔条,里面的控件的大小可以改变。QSplitter 控件经常做为布局管理器使用,给用户提供更多的界面控制。 QSplitter 控件中的子控件总是按顺序自动水平排列水平排列(或者上下排列上下排列)。相邻的控件之间有一个分隔条相邻的控件之间有一个分隔条 这个例子中的窗体有一个QSplitter 控件,其中有三个水平排列的QTextEdit 控件, 和布局管理器不同,QSplitter 不但可以排列子控件,还有不但可以排列子控件,还有一个可视的外观,一个可视的外观,QSplitter 控件从QWidget继承,拥有QWidget 所有的功能。int main(int argc,

4、char *argv)QApplication app(argc, argv);QTextEdit *editor1 = new QTextEdit;QTextEdit *editor2 = new QTextEdit;QTextEdit *editor3 = new QTextEdit;QSplitter splitter(Qt:Horizontal);splitter.addWidget(editor1);splitter.addWidget(editor2);splitter.addWidget(editor3);.splitter.show();return app.exec(); Q

5、t Designer 也支持QSplitter。 把子控件放到合适的位置,把他们选中,选择菜单Form|Layout Horizontally in Splitter 或者Form|Lay out Verticallly in Splitter,所选择的子控件就被加入到QSplitter 控件中。 对QSplitter 进行水平或者垂直嵌套可以实现更加复杂的布局。 例如,图 所示的MailClient程序中,就是一个垂直方向的QSplitter 控件中嵌套了一个水平方向的QSplitter 控件。 111 创建完我们所需要显示三个控件(messageTreeWidget,textEdit,fo

6、ldersTreeWidget)后, 我们创建一个垂直的QSplitter,rightSplitter 控件,把messageTreeWidget 和textEdit控件加到rightSplitter 中。 然后创建一个水平的QSplitter,mainSplitter 控件,把rightSplitter 和foldersTreeWidget 加入到mainSplitter 中。 把mainSplitter 做为QMainWindow 的中央控件。下面的代码是MailClient 程序的主窗口类构造函数代码:MailClient:MailClient().rightSplitter = new

7、 QSplitter(Qt:Vertical);rightSplitter-addWidget(messagesTreeWidget);rightSplitter-addWidget(textEdit);rightSplitter-setStretchFactor(1, 1);mainSplitter = new QSplitter(Qt:Horizontal);mainSplitter-addWidget(foldersTreeWidget);mainSplitter-addWidget(rightSplitter);mainSplitter-setStretchFactor(1, 1);s

8、etCentralWidget(mainSplitter);setWindowTitle(tr(Mail Client);readSettings();当用户改变窗口的大小时, QSplitter 通常给所有的子控件一样的空间。在MailClient 程序中,我们希望左边的文件树控件(foldersTreeWidget)和消息树控件(messageTreeWidget)保持它们的大小,把其他的空间都分配给QTextEdit。这由两个setStretchFactor()调用实现。第一个参数是0 开始的子控件的索引值,第二个参数为我们设置的拉伸系数,缺省值为0。(1) 创建一个工程,创建过程在第2

9、章中已经详细介绍过,在这里就不在赘述。需要注意的是,创建过程在“Qt4 Gui Application”界面中,Base Class选择“QMainwindow”选项,取消“Gernerate form”复选框的选中状态。(2) 在上述工程的main.cpp文件中添加如下灰色背景代码。P89(3) 在main.cpp文件的开始部分加入以下头文件:#include#include#include (4) 运行程序,显示效果如图4.1所示。函数说明:函数说明: P89-90 可停靠控件能够停靠在QMainWindow 中或者作为一个独立窗口浮动。 QMainWindow 提供了四个可停靠控件的地方

10、:上方,下方,左方,右方。 在Qt 中,可停靠窗口是QDockWidget的一个实例。 每一个可停靠控件都有一个标题条标题条。用户可以拖动标题栏把窗口从一个可停靠区域移动到另一个可停靠区域。 拖动标题栏把窗口移动到不能停靠的区域,窗口就浮动为一个独立的窗口。自由浮动的窗口总是在主窗口的上面。 用户点击标题栏上的关闭按钮可以关闭QDockWidget。 调用QDockWidget:setFeatures()能够设置以上这些属性。停靠窗口停靠窗口QDockWidget类类也是应用程序中经常用到的,设置停靠窗口的一般流程为:(1) 创建一个QDockWidget对象的停靠窗体。(2) 设置此停靠窗体

11、的属性,通常调用setFeatures()及setAllowedAreas()两种方法 (P92) 。(3) 新建一个要插入停靠窗体的控件,常用的一般为QListWidget和QTextEdit。(4) 把控件插入停靠窗体把控件插入停靠窗体,调用QDockWidget的setWidget()方法。(5) 使用addDockWidget()方法在在MainWidow中加入此停靠窗体中加入此停靠窗体。下面通过一个简单的例子来学习停靠窗口QDockWidget类的使用,效果如图4.2所示。窗口窗口1只可在主窗口的左只可在主窗口的左边和右边停靠;边和右边停靠;窗口窗口2只可在浮动和右部只可在浮动和右部

12、停靠两种状态间切换,并停靠两种状态间切换,并且不可移动;且不可移动;窗口窗口3可实现停靠窗口的可实现停靠窗口的各个状态。各个状态。(1) 创建一个工程,创建过程中在“Qt4 Gui Application”界面中“Base Class”下拉列表框中选择“QMainwindow”选项,停靠窗口DockWindows类继承自QMainWindow类,停靠窗口只在主窗口停靠窗口只在主窗口QMainWindow中使用中使用。因此,在“Class name”后面的文本框中输入“DockWindows”,取消取消“Gernerate form”复选框复选框的选中状态,的选中状态,如图4.3所示。(2) D

13、ockWindows类说明中只有一个构造函数的说明。代码如下:class DockWindows : public QMainWindow Q_OBJECTpublic: DockWindows(QWidget *parent = 0); DockWindows();(3) 打开“dockwindows.cpp”文件,DockWindows类构造函数实现窗口的初始化及功能实现,具体代码。P92(4) 在dockwindows.cpp文件的开始部分加入以下头文件:#include#include(5) 运行程序,显示效果如图4.2所示。 QStackedLayout 类把子控件进行分组或者分页,

14、一次只显示一组或者一页,隐藏其他组或者页上的控件。 QStackedLayout 本身并不可见,对换页也不提供本质的支持。 为了方便起见,Qt 还提供了类QStackedWidget,这个类的布局管理器为QStackedLayout。 创建一个QListWidget,它的每一项为一个控件页的名字。 然后创建一个QStackedLayout,调用addWidget()把每一页的控件加入到布局中。 连接连接QListWidget 的信号信号currentRowChanged(int)和QStackedLayout 的函数setCurrentIndex(int)连接,改变QListWidget 的当

15、前项时换页。 最后调用QListWidget 把开始页设置为0。这样的对话框使用Qt Designer 会更加简单:1. 用“Dialog”或者“Widget”模板创建一个窗体、2. 在窗体上增加一个QListWidget 和一个QStackedWidget 控件。3. 给每一页添加子控件,子控件按布局排列好(右击右击QStackedWidget 控件,选择控件,选择Insert Page菜单便可创建一个新页。菜单便可创建一个新页。点击右上角的左右键头,可以在页和页之间切换点击右上角的左右键头,可以在页和页之间切换)。4. 把QListWidget 和QStackedWidget 用水平布局管

16、理。5. 连接连接QListWidget 控件的currentRowChanged(int)信号和QStackedWidget 控件的槽setCurrentIndex(int)。6. 设置当前QListWidget 控件的currentRow 属性为0。在Qt Designer 中预览时,点击列表控件中不同的项目,窗体就会换为不同的页。下面通过一个简单的例子来学习堆栈窗体QStackedWidget类的使用,当选择左侧列表框中不同的选项时,右侧显示所选的不同的窗体。在此使用列表框QListWidget,效果如图4.4所示。(1) 创建一个工程,创建过程中在“Qt4 Gui Applicatio

17、n”界面中选择“Base Class”下拉列表框中“QDialog”选项,停靠窗体StackDlg类继承自QDialog类,并声明所用到的控件。因此,在“Class name”后面的文本框中输入“StackDlg”,取消“Gernerate form”复选框的选中状态,如图4.5所示。(2) 打开stackdlg.h文件,添加如下加黑代码:class StackDlg : public QDialogQ_OBJECTpublic:StackDlg(QWidget *parent = 0);StackDlg();private:QListWidget *list;QStackedWidget *

18、stack;QLabel *label1;QLabel *label2;QLabel *label3;在文件开始部分添加以下头文件:#include #include #include (3) 打开stackdlg.cpp文件,在停靠窗体StackDlg类的构造函数中添加代码。P95(4) 在stackdlg.cpp文件的开始部分加入以下头文件:#include (5) 运行程序,显示效果如图4.4所示。这样的对话框使用Qt Designer 会更加简单:1. 用“Dialog”或者“Widget”模板创建一个窗体、2. 在窗体上增加一个QListWidget 和一个QStackedWidge

19、t 控件。3. 给每一页添加子控件,子控件按布局排列好(右击右击QStackedWidget 控件,选择控件,选择Insert Page菜单便可创建一个新页。菜单便可创建一个新页。点击右上角的左右键头,可以在页和页之间切换点击右上角的左右键头,可以在页和页之间切换)。4. 把QListWidget 和QStackedWidget 用水平布局管理。5. 连接连接QListWidget 控件的currentRowChanged(int)信号和QStackedWidget 控件的槽setCurrentIndex(int)。6. 设置当前QListWidget 控件的currentRow 属性为0。在

20、Qt Designer 中预览时,点击列表控件中不同的项目,窗体就会换为不同的页。4.1 分割窗口QSplitter类4.2 停靠窗口QDockWidget类4.3 堆栈窗体QStackedWidget类4.4 基本布局(QLayout) 管理窗体上控件最简单的方法就是使用管理窗体上控件最简单的方法就是使用Qt 的布局管理类。的布局管理类。 这些类能够给出所有类型控件的默认值,能够根据控件的这些类能够给出所有类型控件的默认值,能够根据控件的字体,样式,内容得到不同的控件的字体,样式,内容得到不同的控件的sizeHint。 布局管理类能够得到控件的最大,最小尺寸,在字体,内布局管理类能够得到控件

21、的最大,最小尺寸,在字体,内容或者窗口改变时自动调整布局。容或者窗口改变时自动调整布局。 QHBoxLayout,QVBoxLayout,QGridLayout 是三个最重要是三个最重要的布局管理器,的布局管理器, 这些类从这些类从QLayout 继承,继承,QLayout 提供布局最基本的框架。提供布局最基本的框架。 这三个类可以在代码中使用,也可以在这三个类可以在代码中使用,也可以在QtDesigner 中使用中使用Qt提供了了QHBoxLayout类、类、QVBoxLayout类类及QGridLayout类类等的基本布局管理,分别是水平排列布局、垂直排列布局水平排列布局、垂直排列布局和网

22、格排列布局网格排列布局。它们之间的继承关系如图4.6所示。 QHBoxLayout 和QVBoxLayout 的使用很简单, QGridLayout 有点复杂。QGridLayout 工作的基础是一个二维的单元格布局中常用的方法有addWidget()和addLayout ()。addWidget()方法用来向布局中加入需布局的控件向布局中加入需布局的控件,addWidget()的函数原型如下:void addWidget(QWidget *widget, /为需插入的控件对象int fromRow, /为插入的行int fromColumn, /为插入的列int rowSpan, /表示占用

23、的行数int columnSpan, /表示占用的列数Qt:Alignment alignment=0 /描述各控件的对齐方式)addLayout ()方法用来向布局中加入需布局的子布局向布局中加入需布局的子布局,addLayout ()的函数原型如下:void addLayout(QLayout *layout, /表示要插入的子布局对象int row, /插入的起始行int column, /插入的起始列int rowSpan, /表示占用的行数int columnSpan, /表示占用的列数Qt:Alignment alignment=0 /指定对齐方式) 函数addStretch()使

24、布局管理器在指定的位置留出一块空间使布局管理器在指定的位置留出一块空间。例中,布局管理器在“确定”按钮和“取消”按钮前留出一个额外的空隙。P100 在Qt Designer 中,我们可以加入一个spacer 实现这一功能,在Qt Designer 中,spacer 表现为蓝色的弹簧式折线。也可以使用也可以使用Qt Designer 实现,实现, 首先把所有的子控件放置在近似适当的位置,首先把所有的子控件放置在近似适当的位置, 选择需要布局管理器一同管理的控件选择需要布局管理器一同管理的控件(或者布局或者布局), 点击点击Form|Layout Horizontally,Form|Layout

25、Vertically或者或者Form|Layout in a Grid。 通过属性设置布局管理器通过属性设置布局管理器 拖拽操作等拖拽操作等本小节将通过实现一个“用户基本资料修改”的功能来介绍如何使用基本布局管理,如QHBoxLayout类、QVBoxLayout类及QGridLayout类,效果如图4.7所示。本实例共用到5个布局管理器,分别是LeftLayout、TopRightLayout、RightLayout、BottomLayout和MainLayout,其布局框架如图4.8所示。TopRightLayout用用QHBoxLayout实现实现(1) 创建一个工程,在创建过程中,创建

26、过程中在“Qt4 Gui Application”界面中,选择“Base Class”下拉列表框中“QDialog”选项,取消取消“Gernerate form”复复选框选框的选中状态。(2) 打开“dialog.h”头文件,在头文件中声明对话框中的各个控件。添加代码P98。接着添加如下的头文件:#include #include #include #include #include (3) 打开“dialog.cpp”文件,在类Dialog的构造函数中添加代码 P98。(4) 在dialog.cpp文件的开始部分加入以下头文件:#include#include#include#include#include#include#include#include(5) 打开main.cpp文件,在主函数中添加以下加黑代码:int main(int argc, char *argv) QApplication a(argc, argv); QTextCodec:setCodecForTr(QTextCodec:codecForLocale(); /在窗口中显示在窗口中显示中文中文 Dialog w; w.show(); return a.exec();(6) 运行程序,显示效果如图4.7所示。这个对话框也可以使用这个对话框也可以使用Qt Designe

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论