首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

linux嵌入式下的QT图形界面开发(4)

linux嵌入式下的QT图形界面开发(4)

2.4 对话框
使用Qt 图形设计器这个可视化设计工具用户可以建立自己的对话框。Qt 使用布局管理自动的设置窗体与别的窗体之间相对的尺寸和位置,这样可以确保对话框能够最好的利用屏幕上的可用空间。使用布局管理意味着按钮和标签可以根据要显示的文字自动的改变自身大小,而用户完全不用考虑文字是那一种语言。

2. 4. 1 布局
Qt 的布局管理用于组织管理一个父窗体区域内的子窗体。它的特点是可以自动的设置子窗体的位置和大小,并可判断出一个顶级窗体的最小和缺省的尺寸,当窗体的字体或内容变化后,它可以重置一个窗体的布局。使用布局管理,开发者可以编写独立于屏幕大小和方向之外的程序,从而不需要浪费代码空间和重复编写代码。对于一些国际化的应用程序,使用布局管理,可以确保按钮和标签在不同的语言环境下有足够的空间显示文本,不会造成部分文字被剪掉。布局管理使得提供部分用户接口组件,例如输入法和任务栏变得更容易。我们可以通过一个例子说明这一点,当Qtopia的用户正在输入文字时,输入法会占用一定的文字空间,应用程序这时也会根据可用的屏幕尺寸的变化调整自己。
图十 Qtopia 的布局管理
Qt提供了三种用于布局管理的类:QHBoxLayout, QVBoxLayout 和 QgridLayout。
图十一 QHBoxLayout, QVBoxLayout 和 QGridLayout 的布局效果
QHBoxLayout 布局管理把窗体按照水平方向从左至右排成一行
QVBoxLayout 布局管理把窗体按照垂直方向从上至下排成一列
QGridLayout 布局管理以网格的方式来排列窗体,一个窗体可以占据多个网格。
在多数情况下,布局管理在管理窗体时执行最优化的尺寸,这样窗口看起来就更好看而且可以尺寸变化会更平滑。使用以下的机制可以简化窗口布局的过程:
1、 为一些子窗口设置一个最小的尺寸,一个最大的或者固定的尺寸。
2、 增加拉伸项(stretch items)或者间隔项 (spacer item)。拉伸项和间隔项可以填充一个排列的空间。
3、 改变子窗口的尺寸策略,程序员可以调整窗体尺寸改变时的一些策略。子窗体可以被设置为扩展,紧缩和保持相同尺寸等策略。
4、 改变子窗口的尺寸提示。QWidget::sizeHint() 和 QWidget::minimumSize-Hint() 函数返回一个窗体根据自身内容计算出的首选尺寸和首选最小尺寸,我们在建立窗体时可考虑重新实现这两个函数。
5、设置拉伸比例系数。设置拉伸比例系数是指允许开发者设置窗体之间占据空间大小的比例系数,例如我们设定可用空间的2/3 分配给窗体A,剩下的1/3 则分配给窗体B。布局管理也可按照从右至左,从下到上的方式来进行。当一些国际化的应用需要支持从右至左阅读习惯的语言文字(例如阿拉伯和希伯来)时,使用从右至左的布局排列是更方便的。布局是可以嵌套的和随意进行的。下面是一个对话框的例子,它以两种不同尺寸大小来显示:
图十二 小的对话框和大的对话框
这个对话框使用了三种排列方式。QVBoxLayout管理一组按钮,QHBoxLayout管理一个显示国家名称的列表框和右边那组按钮,QVBoxLayout管理窗体上剩下的组件“Now pleaseselect a country”标签。在“< Prev”和“Help”按钮之间放置了一个拉伸项(stretch items),使得两者之间保持了一定比例的间隔。
建立这个对话框窗体和布局管理的实现代码如下:
QVBoxLayout *buttonBox = new QVBoxLayout( 6 );
buttonBox->addWidget( new QPushButton("Next >", this) );
buttonBox->addWidget( new QPushButton("< Prev", this) );
buttonBox->addStretch( 1 );
buttonBox->addWidget( new QPushButton("Help", this) );
QListBox *countryList = new QListBox( this );
countryList->insertItem( "Canada" );
/* … */
countryList->insertItem( "United States of America" );
QHBoxLayout *middleBox = new QHBoxLayout( 11 );
middleBox->addWidget( countryList );
middleBox->addLayout( buttonBox );
QVBoxLayout *topLevelBox = new QVBoxLayout( this, 6, 11 );
topLevelBox->addWidget( new QLabel("Now please select a country", this) );
topLevelBox->addLayout( middleBox );
使用Qt 图形设计器设计的这个对话框,显示如下
图十三 Qt 图形设计器中使用了布局的对话框

2. 4. 2 Qt 图形设计器
Qt 图形设计器是一个具有可视化用户接口的设计工具。Qt 的应用程序可以完全用源代码来编写,或者使用Qt 图形设计器来加速开发工作。启动Qt 图形设计器的方法是:
在Linux 命令模式下,键入以下命令(假设Qt X11 安装在/usr/local 下):
cd qt-2.3.2/bin
./designer
这样就可以启动一个与Windows 下的Delphi 相类似界面。 下图是使用Qt 图形设计器设计一个表单的截屏图。
图十四 Qt 图形设计器
开发者点击工具栏上的代表不同功能的子窗体/组件的按钮,然后把它放到一个表单上面,这样就可以把一个子窗体/组件放到表单上了。开发者可以使用属性对话框来设置子窗体的属性。精确的设置子窗体的位置和尺寸大小是没必要的。开发者可以选择一组窗体,然后对他们进行排列。例如,我们选定了一些按钮窗体,然后使用“水平排列(lay out horizontally)”选项对它们进行一个接一个的水平排列。这样做使得设计工作变得更快,而且完成后的窗体将能够按照属性设置的比例填充窗口的可用尺寸范围。使用Qt 图形设计器进行图形用户接口的设计可以消除应用的编译,链接和运行时间,同时使得修改图形用户接口的设计变得更容易。Qt 图形设计器的预览功能可以使开发者能够在开发阶段看到各种样式的图形用户界面,包括客户样式的用户界面。通过Qt集成的功能强大的数据库类,Qt 图形设计器还可提供生动的数据库数据浏览和编辑操作。
开发者可以建立同时包含有对话框和主窗口的应用,其中主窗口可以放置菜单,工具栏,旁述帮助等等的子窗口部件。Qt 图形设计器提供了几种表单模板,如果窗体会被多个不同的应用反复使用,那么开发者也可建立自己的表单模板,以确保窗体的一致性。Qt 图形设计器使用向导来帮助人们更快更方便的建立包含有工具栏、菜单和数据库等方面的应用。程序员可以建立自己的客户窗体,并把它集成到Qt 图形设计器中。Qt 图形设计器设计的图形界面以扩展名“ui”的文件进行保存,这个文件有良好的可读性,这个文件可被uic(Qt 提供的用户接口编译工具)编译成为C++的头文件和源文件。Qmake 工具在它为工程生成的Makefile 文件中自动的包含了uic 生成头文件和源文件的规则。另一种可选的做法是,在应用程序运行期间载入ui 文件,然后把它转变为具备原先全部功能的表单。这样开发者就可以在程序运行期间动态修改应用的界面,而不需重新编译应用,另一方面,也使得应用的文件尺寸减小了。

2. 4. 3 建立对话框
Qt 为许多通用的任务提供了现成的包含了实用的静态函数的对话框类,下边是一些Qt 的标准的对话框的截屏图。QmessageBox类是一个用于向用户提供信息或是给用户进行一些简单选择(例如 “yes”或“no”)的对话框类。
图十五 一个QMessageBox 对话框
progressDialog对话框包含了一个进度栏和一个“Cancel”按钮图十六 一个QprogressDialog 对话框Qwizard类提供了一个向导对话框的框架
图十七 一个向导类
Qt提供的对话框还包括QColorDialog, QFileDialog, QFontDialog 和QprintDialog。这些类通常适用于桌面应用,一般不会在Qt/Embedded中编译使用它们。

2.5 外形与感觉
Qt桌面应用随着执行环境(例如Windows XP, Mac OS X, Linux)的不同而具有不同的样式,或者叫做外形与感觉。Qt/Embedded 的应用可以使用不同操作环境提供的样式,也可以以静态或插件的方式使用客户样式。开发者可以设计自己窗体的样式和窗口装饰。

2.5.1 窗体样式
一个样式是一个实现Qt窗体外形与视觉效果的类Qstyle的子类。Qt/Embedded 程序员可以自由的使用和修改目前存在的样式,也可以使用Qt样式设计引擎实现自己的样式。目前Qt/Embedded提供的样式类型有EmbeddedareWindows, Motif, MotifPlus,CDE, Platinum 和 SGI。样式可以被动态的设置到一个应用中,甚至可以设置到特定的窗体上。
图十八 以不同样式建立的下拉框
通过给一组相关的应用编写一个客户样式,可以让这些应用的外观具有与众不同的感觉。建立客户样式可以通过子类化QStyle,QcommonStyle或者QcommonStyle的派生类来实现。通过重新实现现有样式基类的一两个虚函数可以很容易对现有样式做一些小的修改。一个样式可以编译成为一个插件,在Qt 图形设计器中,把样式做成插件的话,开发者就可以以设备的客户样式来预览设计出来的表单。样式插件使得开发者不需重新编译就可改变设备的外观。
图十九 Qstyle 的继承图
Qt发布的窗体都是样式已知的,当它们的样式改变后,窗体会自动重绘。客户窗体和对话框大多数都是Qt原先发布的窗体和布局的重新整合。它们也是自动的获得原先的样式。在少数场合,当有必要写一个外观上很随意的窗体时,开发者可以使用QStyle去写一些用户接口元素,而不是直接的绘制固有的矩形。

2.5.2 窗口装饰
顶级窗口的装饰是由一个标题栏和一个框架组成的。Qt/Embedded 包括了这些窗口样式:BeOS, Hydro, KDE 和 Windows。
图二十 不同的平台上的窗口风格
如果需要的话,我们可以配置不同的窗口使用不同的窗口装饰。通过子类化QWSDecoration,我们可以建立客户的装饰样式,并且把它们以插件的形式进行发布。为了在窗口管理器之外进行更多的控制行为,开发者需要子类化QWSManager。

2.6 国际化
Qt/Embedded完全支持Unicode,一个国际标准的字符集。开发者在他们的应用中可以自由的混合使用被Unicode字符集支持的语言,例如阿拉伯文,英文,中文,希伯来文,日文和俄文等。为了有助于公司将产品推向国际市场,Qt还提供了将应用翻译成支持多种语言环境的工具。
继承事业,薪火相传
返回列表