QT Nokia内部培训资料.pdf

上传人:赵** 文档编号:50070673 上传时间:2022-10-12 格式:PDF 页数:55 大小:1,008.67KB
返回 下载 相关 举报
QT Nokia内部培训资料.pdf_第1页
第1页 / 共55页
QT Nokia内部培训资料.pdf_第2页
第2页 / 共55页
点击查看更多>>
资源描述

《QT Nokia内部培训资料.pdf》由会员分享,可在线阅读,更多相关《QT Nokia内部培训资料.pdf(55页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Qt EssentialsCourse Overview2 2010 Digia Plc课程目标课程目标课程目标课程目标 Qt-based 程序 学习创建 Qt UIs 使用Qt自带的控件 自定义控件 使用Graphics view widgets 基本的风格设置3 2010 Digia Plc课程需求课程需求课程需求课程需求 C+编程经验 Qt 基础 4 2010 Digia Plc个人目标个人目标个人目标个人目标想从本课程中学到什么?5 2010 Digia PlcCourse ContentsGraphics ViewGraphics View 框架Graphics View 类Reso

2、urce Collection Files模型/视图Item viewsItem models自定义 ModelsItem 委托Qt Mobility概述API 内容InstallationPrivate Implementation6 2010 Digia PlcCourse DeliveryPresentationsQuestionsHands-on SessionsCourse ManualsLearn from othersQt EssentialsGraphics View8 2010 Digia PlcGraphics View 介绍介绍介绍介绍 管理大数量的定制2D 图形项目并与

3、其交互。提供消息传递机制 具有双精度的交互能力 可以处理键盘事件,鼠标事件(点击、移动、释放等),跟踪鼠标轨迹等 利用二元空间分割树(Binary Space Partitioning tree)快速查找图元 可以实时绘制大规模场景,管理上百万个图形项目。图形项目可以是控件Graphics View 框架框架框架框架 Graphics View 提供一种类似于 Qt model-view的编程方式。多个 views 可以监视同一个场景,而场景包含多个具有多种几何外形的 items Graphics View 框架包含三部分:视图-QGraphicsView 场景-QGraphicsScene

4、图形项目-QGraphicsItem10 2010 Digia Plc视图视图视图视图-QGraphicsView 视图部件,用于展示可视化场景中的内容 可以联结多个视图到同一个场景 对这个相同的数据集提供几个视口 视口部件是一个滚动区域提供滚动条以对大场景进行浏览 使用OpenGL 把QGLWidget设置为视口 QGraphicsView:setViewport()视图从键盘,鼠标接收输入事件 在发送这些事件到场景之前,会对这些事件进行适当的翻译(把事件坐标转换成对应的场景坐标)方便和有效的使用变换 变换场景的坐标系统:QGraphicsView:matrix()实现高级的导航特性,如缩放

5、,旋转,倾斜等 视图与场景之间进行坐标转换QGraphicsView:mapToScene()QGraphicsView:mapForScene()11 2010 Digia Plc场景场景场景场景 QGraphicsScene 为管理大量的items提供一个快速的接口 QgraphicsScene:addItem()QGraphicsScene:items()QGraphicsScene:itemAt()所有的item查找函数都以出栈序列返回(也就是说,第一个返回的是最顶端的,最后一个返回的是最底端的传播事件到每个item)管理场景到items的事件传递,以及多个items之间的事件传递 管

6、理item的状态 例如选择,焦点处理。QGraphicsScene:selectedItem()QGraphicsScene:focusItem()提供未经变换的渲染功能,主要用于打印 QGraphicsScene:render()12 2010 Digia Plc图形项目图形项目图形项目图形项目 QGraphicsItem 场景中图形项目的基类 提供了标准的item类QGraphicsRectItem,QGraphicsEllipseItem,QGraphicsTextItem 支持特性:鼠标按、移动、释放、双击事件,鼠标悬停事件,滚轮事件,弹出菜单事件键盘输入焦点,键盘事件拖拽组,包括父子

7、关系QGraphicsItemGroup碰撞检测QGraphicsItem:shape()QGraphicsItem:collideWith()QGraphicsItem:setFlag(GraphicsItemFlag flag,bool enabled=true)enum QGraphicsItem:GraphicsItemFlag Items使用自身的坐标系统坐标系统都是以他的原点(0,0)为中心,这个也是转换的中心.为item与场景之间,item与item之间的坐标转换提供许多工具函数使用矩阵来变换它的坐标系统QGraphicsItem:matrix()父items坐标系和子items

8、坐标系相关父items的转换被它的子孙所继承13 2010 Digia Plc坐标系统坐标系统坐标系统坐标系统 基于笛卡尔坐标系 item在场景中的位置与几何形状通过x,y坐标表示 三个坐标系统 Item坐标系 场景坐标系描述了每个最顶级item的位置 视图坐标系 坐标映射 视图与场景QGraphicsView:mapToScence()QGraphicsView:mapFromScene()场景与itemQGraphicsItem:mapToScene()QGraphicsItem:mapFromScene()item与itemQGraphicsItem:mapToParent()QGrap

9、hicsItem:mapFromItem()14 2010 Digia Plc变换变换变换变换 视图可以变换场景的坐标系统 QTransform QMatrix 例子:QTransform transform;transform.translate(50,50);transform.rotate(45);transform.scale(0.5,1.0);view.setTransform(transform);/Also available:view.rotate(45);15 2010 Digia Plc现有的现有的现有的现有的Graphics Items QGraphicsLineItem

10、 A line segment QAbstractGraphicsShapeItem Common baseclass for“shape items”,ie.ellipses,polygons etc.QGraphicsEllipseItem An ellipse or”pie segment”QGraphicsPolygonItem A polygon QGraphicsRectItem A rectangle QGraphicsPathItem A QPainterPath QGraphicsPixmapItem A pixmap QGraphicsTextItem A rich tex

11、t string(can be editable)QGraphicsSimpleTextItem A non-editable plain text string QGraphicsSvgItem An SVG element16 2010 Digia PlcQGraphicsItem的绘图的绘图的绘图的绘图 同QWidget绘图方式基本一致 QGraphicsItem:paint()相比于QWidget,只有一个重绘的方法 QGraphicsItem:update()多次 update()调用会被Qt合并为一次 不会有闪烁的情况17 2010 Digia Plc事件处理事件处理事件处理事件处

12、理 QGraphicsItems 的事件处理和Qwidget很相似 Example handlers:keyPressEvent(QKeyEvent*)mouseMoveEvent(QGraphicsSceneMouseEvent*)contextMenuEvent(QGraphicsSceneContextMenuEvent*)dragEnterEvent(QGraphicsSceneDragDropEvent*)focusInEvent(QFocusEvent*)hoverEnterEvent(QGraphicsSceneHoverEvent*)和QWidget:event(QEvent*

13、)相似Item也有一个QGraphicsItem:sceneEvent(QEvent*)用于接收所有Item的事件18 2010 Digia Plc练习练习练习练习-GraphicsViewFW 绘图-GraphicsViewFWPaint 绘制红色矩形框 将矩形旋转10度 尝试倾斜10度 事件-GraphicsViewFWEvent 绘制一个小球,实现鼠标拖动 重写item的鼠标事件 或者使用void QGraphicsItem:setFlag()模型模型模型模型/视图编程视图编程视图编程视图编程Model View Programming 20 2009 Digia Plc内容内容内容内容

14、 模型(Models)视图(Views)模型和视图 QVariantModel View Programming 21 2009 Digia Plc模型模型模型模型/视图编程视图编程视图编程视图编程管理数据和如何显示数据之间的关系标准的数据接口方便用户自定义数据的显示基于MVC(Model View Controller)设计模式Qt中使用委托(Delegate)替代传统的Controller用于控制数据的显示和编辑Qt对每种类型视图提供了默认的委托。多个 views 可能会使用相同的数据Model View Programming 22 2009 Digia Plc体系结构体系结构体系结构体

15、系结构模型为其它组件提供访问数据的接口QAbstractItemModel模型索引使数据存储与数据访问分开委托主要处理绘制自定义视图用户编辑数据时委托通常会直接操作model信号槽机制数据发生改变时,model通过信号槽机制来通知关联的viewsModel View Programming 23 2009 Digia Plc模型类模型类模型类模型类 访问数据的标准接口:QAbstractItemModel 忽略了数据在底层的存储结构 其子类会以层次结构的形式来表示数据,这个结构里包含了数据表项 访问model中的数据项,对数据显示无任何限制 数据发生改变时,model通过信号槽机制来通知关联的

16、views进行更新 树,表,和列表模型的基类 QAbstractTreeModel QAbstractTableModel QAbstractListModel 模型类 QStringListModel,QDirModel,QStandardItemModel(tree structure),QSqlQueryModelModel View Programming 24 2009 Digia PlcQVariant 模型和视图处理数据的类型都是variant QVariant 就像是一个普通类型的联合体 保存某个数据类型的单个值,数据类型可以使用type()得到。数据类型转换 bool QVa

17、riant:canConvert(Type t)const bool QVariant:convert(Type t)QVariant QVariant:fromValue(const T&value)static 获取数据可以使用函数:toT()toInt(),toString(),toBool()可以把自定义的类型转换成variants 自定义类型需要声明:Q_DECLARE_METATYPE(Type)Model View Programming 25 2009 Digia PlcQVariantQVariant v(123);/The variant now contains an i

18、ntint x=v.toInt();/x=123v=QVariant(hello);/The variant now contains a QByteArrayv=QVariant(tr(hello);/The variant now contains a QStringint y=v.toInt();/y=0 since v cannot be converted to an intModel View Programming 26 2009 Digia Plc模型索引模型索引模型索引模型索引 每个数据的信息都可以通过模型索引获得。使数据存储与数据访问完全分开 模型索引只是数据访问的约定,并

19、非底层数据存储格式。两种模型的索引:临时引用(QModelIndex)可以访问或者修改数据。长期引用(QPersistentModelIndex),这个引用会保持更新 长期引用会消耗更多的系统资源。一般不使用。索引包含了三个参数:行数,列数,父项的模型索引项角色项角色项角色项角色 项角色 为不同的环境提供不同的数据 每个数据项都可以为不同的角色提供数据 views可以用不同的形式显示不同的角色 通过指定索引与角色来获取需要的数据 QVariant value=model-data(index,role);可以自定义角色 用于自定义委托Model View Programming 28 2009

20、 Digia PlcTable和和和和Tree的索引的索引的索引的索引 Table是最简单的数据模型,它没有使用父索引 QModelIndex index=model-index(2,1,QModelIndex()Tree models QModelIndex indexA=model-index(0,0,QModelIndex();QModelIndex indexB=model-index(1,0,indexA);QModelIndex indexC=model-index(2,1,QModelIndex();从模型中获取数据的基本原则从模型中获取数据的基本原则从模型中获取数据的基本原则从

21、模型中获取数据的基本原则 模型的尺寸可以由 rowCount()与 columnCount()得到 通常需要一个表示父项的模型索引。模型索引用来从模型中访问数据项,数据项用行,列,父项模型索引定位。使用空的模型索引(QModelIndex())访问模型顶层的数据项。数据项使用不同的角色为视图提供不同的数据。为了获取数据,需要指定角色QDirModel*model=new QDirModel;QModelIndex parentIndex=model-index(QDir:currentPath();int numRows=model-rowCount(parentIndex);for(int

22、row=0;row index(row,0,parentIndex);QString text=model-data(index,Qt:DisplayRole).toString();/Display the text in a widget.概念总结概念总结概念总结概念总结 模型索引为视图和委托提供模型中数据项定位的信息,它与底层的数据结构无关。通过指定行,列数,父项的模型索引来使用数据项。依照别的组件的要求,模型索引由模型构建。使用 index()时,如果指定了有效的父项的模型索引,那么返回的模型索引对应于父项的某个孩子。使用index()时,如果指定了无效的父项的模型索引,那么返回的模型

23、索引对应于顶层项的某个孩子。角色用于区分一个数据项包含的不同类型的数据。Model View Programming 31 2009 Digia Plc视图视图视图视图 视图从模型中获得数据项然后显示给用户 数据显示的方式可以与模型提供的表示方式不同 可以与底层存储数据项的数据结构完全不同 显示数据 处理数据项的导航 数据项选择,拖拽 可搭配delegate实现更为特殊的定制编辑的需求 视图的基类是QAbstractItemView 继承自QScrollArea EditTrigger 枚举类型,定义访问当前item时如何触发编辑动作 QModelIndex indexAt(const QPo

24、int&point)itemDelegate()setItemDelegate()设置委托 edit()启动item的编辑器 三个子类 QListView QTableView QTreeViewQTableWidget tableWidget(4,4);tableWidget.setItemDelegate(new StarDelegate);tableWidget.setEditTriggers(QAbstractItemView:DoubleClicked|QAbstractItemView:SelectedClicked);Model View Programming 32 2009

25、Digia Plc练习练习练习练习-modelView 路径:execise/modelView/分别使用三种视图配合QFileSystemModel实现目录的查看功能Model View Programming 33 2009 Digia Plc视图控件视图控件视图控件视图控件 方便使用,并且提供了模型 继承与相应的视图类 QListWidget QTableWidget QTreeWidget 提供设置和获取数据的方法 setItem()item()for(int row=0;staticDatarow.title!=0;+row)QTableWidgetItem*item0=new QT

26、ableWidgetItem(staticDatarow.title);QTableWidgetItem*item1=new QTableWidgetItem(staticDatarow.genre);QTableWidgetItem*item2=new QTableWidgetItem(staticDatarow.artist);QTableWidgetItem*item3=new QTableWidgetItem;item3-setData(0,qVariantFromValue(StarRating(staticDatarow.rating);tableWidget-setItem(ro

27、w,0,item0);tableWidget-setItem(row,1,item1);tableWidget-setItem(row,2,item2);tableWidget-setItem(row,3,item3);Model View Programming 34 2009 Digia Plc委托委托委托委托 如果想要显示用户的数据(不是简单的数据类型如整型,字符串等)就需要委托(QAbstractItemDelegate)模型和编辑器同步 setModelData()setEditorData()自定义绘图 paint()自定义编辑 editorEvent()createEditor(

28、)void StarDelegate:paint(QPainter*painter,const QStyleOptionViewItem&option,const QModelIndex&index)constif(qVariantCanConvert(index.data()StarRating starRating=qVariantValue(index.data();if(option.state&QStyle:State_Selected)painter-fillRect(option.rect,option.palette.highlight();starRating.paint(p

29、ainter,option.rect,option.palette,StarRating:ReadOnly);else QItemDelegate:paint(painter,option,index);Model View Programming 35 2009 Digia Plc小结小结小结小结 模型/视图结构提供了管理和渲染数据的机制 QAbstractItemModel 提供了利用索引访问数据的接口 QAbstractItemView 提供了显示数据的功能 Custom delegates are used to render other data types QTableWidget

30、 是一个视图类,具有默认的模型 QAbstractItemDelegate可以用来显示用户自定义类型的数据Qt EssentialsQt Mobility37 2010 Digia PlcQt Mobility APIsMicrosoft PowerPoint PresentationQt Mobility APIs38 2010 Digia Plc背景背景背景背景 Qt最初是为桌面系统设计的 最初的Qt没有专门针对移动设备的接口 Qtopia 已经停止开发 Qt Mobility APIs Cross-platform solution,and not only for mobile OSs

31、!In”Qt Labs”phase Heavily under development At the moment,8 APIs published+2 APIs as previews 最新版本是1.1.0Mobility APIs System Information Service Framework Publish&Subscribe Messaging Bearer Management Contacts(+Versit)Location Multimedia Sensor(Extra:Camera)40 2010 Digia PlcBearer Management API 控制系

32、统连接状态 当有可用的连接时候应用程序能够提示给用户 获得详细的系统连接状态和所有可用网络连接的配置信息 允许程序选择最合适的网络配置。这包括私有和公共连接之间的区别41 2010 Digia PlcContacts API 保存联系人信息 查找不同平台不同种类的联系人的信息 程序可以使用接口函数添加应用程序指定的数据到联系人存储里。比如,一个即时通信程序可以使用接口函数添加一些额外的数据到每个联系人信息 支持远程同步联系人信息42 2010 Digia PlcLocation API 获得当前所在的位置信息并且随时可以更新 API is underlying location technol

33、ogy agnostic 可以创建一个位置触发器,当到了指定位时,系统会给出相应的提示 可以捕获卫星的信号,所以可以创建一个卫星状态识别器43 2010 Digia PlcMessaging API 可以支持多种信息如SMS,MMS,email 支持目录和过滤短信 获得账户的配置信息44 2010 Digia PlcMultimedia API 播放和记录多媒体信息 也支持广播 支持在线的多媒体播放45 2010 Digia PlcPublish and Subscribe API 分层数据表示在系统组件之间是可以共享 可以订阅更改通知 在允许范围内整个系统有效的共享数据46 2010 Dig

34、ia PlcService Framework API 对于多个平台,定义了统一的接口访问和查找服务接口 Client-server(service provider)abstraction 在应用程序直接各个功能是可以共享的 Developer has device independentmethods for finding/using/implementingservicesPicture:Qt Mobility Whitepaper,http:/ 2010 Digia PlcSystem Information API 访问这个系统的信息,并且可以给用户提示,不如电池的使用情况,网络是

35、否连接等 有了这个接口开发者就可以开发一些反应系统状态的程序.比如监视电池的使用情况,可以检测电池是在消耗还是在充电48 2010 Digia PlcPrivate Implementation私有实现是一种C+的编程方式,可以用来减少编译次数,增强封装性和保持二进制兼容性。在其他平台的程序向Qt移植的时候特别有用49 2010 Digia PlcPrivate Implementation/a.hclass A.private:int x;int y;/a.hclass AP;class A.private:AP*d_ptr;/a.cppclass AP private:int x;int

36、y;.Header file stays the same regardless of the contents of class APBinary Compatibility for A remains despite AP being changed50 2010 Digia PlcPrivate Implementation in Qt 在Qt中,这种模式称为d-pointer or P-IMPL 在公开接口里保存了指向私有类的指针 The pointer is actually stored to the QObject base class part The actual class

37、 header file shows nothing on the private class 私有类保存了所有平台相关的数据,方法等 Not part of public API!Yet visible everywhere in the source code.51 2010 Digia PlcPrivate Implementation Every QObject sub-class has a private counter-part QObject-QObjectPrivate QWidget-QWidgetPrivate QTcpSocket-QTcpSocketPrivate P

38、rivate class hierarchy mirrors public class hierarchy QObjectPrivate Base of all other Q*Private classes Derived from QObjectData Type of QObject:d_ptrQObjectDataQWidgetPrivateQWidgetQObjectPrivateQObject+q_ptr1#d_ptr52 2010 Digia PlcAccessing the Other Class d_ptr 是QObjectData类型,因此需要转换成正确的类型函数d_fun

39、c()实现了该功能,例外有一个更方便的宏Q_D(ClassName)Called in public class side,it creates a pointer named”d”of the private classstypeQ_Q(ClassName)Called in private class side,it creates a pointer named”q”of the public classstype53 2010 Digia PlcPrivate Implementationclass QWidget:public QObjectQ_OBJECTQ_DECLARE_PRI

40、VATE(QWidget)void QWidget:createWinId()Q_D(QWidget);d-createWinId();class QWidgetPrivate:public QObjectPrivateQ_DECLARE_PUBLIC(QWidget)void QWidgetPrivate:createWinId(WId winid)Q_Q(QWidget);q-isWindow();54 2010 Digia PlcP-IMPL My Code?Qt 没有提供任何文档介绍使用Qts d-pointer The d-pointer mechanism is still imp

41、ortant to understand in order to understand any of the source codes(try debugging,for instance).It can be used,but as the disclaimer states,it shouldnt be used Luckily,the same design pattern is easy to implement manually,ifneededIn qobject_p.h:/W A R N I N G/-/This file is not part of the Qt API.It exists for the convenience/of qapplication_*.cpp,qwidget*.cpp and qfiledialog.cpp.This header/file may change from version to version without notice,or even be removed./We mean it./Thank You!Please remember to give feedback

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁