收藏 分享(赏)

嵌入式ppt第九章.ppt

上传人:bubibi 文档编号:20014182 上传时间:2023-12-02 格式:PPT 页数:48 大小:1.94MB
下载 相关 举报
嵌入式ppt第九章.ppt_第1页
第1页 / 共48页
嵌入式ppt第九章.ppt_第2页
第2页 / 共48页
嵌入式ppt第九章.ppt_第3页
第3页 / 共48页
嵌入式ppt第九章.ppt_第4页
第4页 / 共48页
嵌入式ppt第九章.ppt_第5页
第5页 / 共48页
亲,该文档总共48页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、第第9章章 QT图形界面应用程序开发基础图形界面应用程序开发基础目目 录录 9.1 9.1 QtQt简介简介9.2 9.2 Qt5Qt5概述概述9.3 9.3 信号和插槽机制信号和插槽机制9.4 9.4 QtQt程序设计程序设计9.5 9.5 QtQt数据库应用数据库应用与普通GUI不同的是,嵌入式GUI的要求是轻量级的,如在嵌入式linux中使用的图形界面系统。同时嵌入式GUI还具有可定制,高可靠性,可裁减性等特点。嵌入式GUI的开发系统主要有XWindow、MiniGUI、OpenGL、Qt等。MiniGUI是由北京飞漫软件技术有限公司主持的是由北京飞漫软件技术有限公司主持的一个自由软件项

2、目一个自由软件项目(遵循遵循GPL条款条款),其目标是为基于,其目标是为基于Linux的实时嵌入式系统提供一个轻量级的图形用户的实时嵌入式系统提供一个轻量级的图形用户界面支持系统。界面支持系统。MiniGUI为应用程序定义了一组轻量级的窗口和为应用程序定义了一组轻量级的窗口和图形设备接口。利用这些接口,每个应用程序可以建图形设备接口。利用这些接口,每个应用程序可以建立多个窗口,而且可以在这些窗口中绘制图形。用户立多个窗口,而且可以在这些窗口中绘制图形。用户也可以利用也可以利用MiniGUI建立菜单、按钮、列表框等常见建立菜单、按钮、列表框等常见的的GUI元素。元素。OpenGUI基于一个用汇编

3、实现的基于一个用汇编实现的x86图形图形内核,提供了一个高层的内核,提供了一个高层的C/C+图形图形/窗口接窗口接口,它的资源消耗小,可移植性差,不支持口,它的资源消耗小,可移植性差,不支持多进程。多进程。主流的主流的Linux窗口系统窗口系统Qt/Embedded(简称简称QtE)是一个专门为嵌入式系是一个专门为嵌入式系统设计图形用户界面的工具统设计图形用户界面的工具包。包。Qt是挪威是挪威Trolltech软件软件公司的产品,它为各种系统公司的产品,它为各种系统提供图形用户界面的工具包,提供图形用户界面的工具包,QtE就是就是Qt的嵌入式版本。的嵌入式版本。Qt/Embedded 也可以看

4、成是一组用于访问嵌入式设备的也可以看成是一组用于访问嵌入式设备的 Qt C+API;Qt/Embedded 的的Qt/X11,Qt/Windows 和和Qt/Mac版本提供的版本提供的都是相同的都是相同的API和工具。和工具。Qtopia是基于是基于 Qt编写的编写的一个用于手持设备的一个用于手持设备的 用户信用户信息管理软件,它集成了很多息管理软件,它集成了很多实用的程序。实用的程序。市面上买到的预装市面上买到的预装 linux操作系统的操作系统的 arm9开发版,开发版,开机后看到的图形界面多是开机后看到的图形界面多是qtopia。Qt简介简介Part One9.19.1Qt是一个跨平台应

5、用程序和图形用户界面GUI开发框架。使用Qt只需一次性开发应用程序,无须重新编写源代码,便可跨不同桌面和嵌入式操作系统部署这些应用程序。Qt是挪威Trolltech公司的标志性产品,于1991年推出。2008年,Trolltech被诺基亚公司收购,QT也因此成为诺基亚旗下的编程语言工具。2012年8月芬兰IT业务供应商Digia全面收购诺基亚Qt业务及其技术。Qt支持下列平台:MS/Windows-95、98、NT4.0、ME、2000、XP、Vista、Win7、win8、win10;Unix/X11-Linux、Solaris、HP-UX、CompaqTru64UNIX、IBMAIX、SG

6、IIRIX、FreeBSD、BSD/OS和其它X11平台;Macintosh-MacOSX;嵌入式Linux平台(有帧缓冲支持)、WindowsCE;Symbian、haiku-os等。Qt具有下列优点:(1)面向对象(2)丰富的API函数和直观的C+类库(3)支持2D/3D图形渲染,支持OpenGL(4)具有跨平台IDE的集成开发工具(5)跨桌面和嵌入式操作系统的移植性(6)大量的开发文档(7)国际化按不同的版本发行:Qt商业版:提供给商业软件开发。它们提供传统商业软件发行版并且提供在协议有效期内的免费升级和技术支持服务。Qt开源版:仅仅为了开发自由和开放源码软件,提供了和商业版本同样的功能

7、。GNU通用公共许可证下,它是免费的。2009年3月发布的Qt4.5起,诺基亚为Qt增添开源LGPL授权选择。Qt5概述概述Part Two9.29.29.2.1 Qt 5简介简介2012年12月19日,Digia宣布正式发行Qt5.0。Qt5.0是一个全新的流行于跨平台应用程序和用户界面开发框架的版本,可应用于桌面、嵌入式和移动应用程序Qt5的主要优势包括:图形质量;出色的图像处理与表现能力:更高效和灵活的研发:跨平台的移植变得更加简单:Qt通过使用OpenGLES,大大的增加了交付令人印象深刻的图形的能力9.2.2 通过通过”帮助帮助”了解了解Qt 5的组成的组成模块模块打开QtCreat

8、or,进入帮助模式,然后选择“QtReference”进行搜索。选择“AllQtModules”选项来查看所有的Qt模块。如下图所示。在“AllQtModules”页面Qt的模块被分为了三部分:Qt基本模块(QtEssentials)、Qt扩展模块(QtAdd-Ons)、Qt工具(QtTools)模块模块描述描述Qt Core使用其它模块的核心非图形类Qt GUI图形用户界面(GUI)组件的基础类,包括OpenGLQt Multimedia处理音频、视频、广播、摄像头功能的类Qt Network使网络编程更容易,更方便的类Qt QMLQML和JavaScript的类Qt Quick自定义用户界

9、面构建高度动态的应用程序的声明性框架Qt SQL使用SQL集成数据库的类Qt Test进行Qt应用程序和库单元测试的类Qt WebKit基于WebKit2实现的一个新的QMLAPI类Qt WebKit WidgetsQt4中,WebKit1和QWidget-based类Qt Widgets用C+部件扩展Qt图形界面的类表9-1Qt基本模块组成表9-1Qt基本模块组成信号和插槽机制信号和插槽机制Part Three9.39.3信号和插槽信号和插槽n在在Qt程序中,利用信号(程序中,利用信号(signal)和插槽)和插槽(slot)机制进行对象间的通信)机制进行对象间的通信nsignal和和slo

10、t机制真正实现了封装的概念,机制真正实现了封装的概念,slot除了接收除了接收signal之外和其它的成员函数没有之外和其它的成员函数没有什么不同,而且什么不同,而且signal和和slot之间也不是一一对之间也不是一一对应的。应的。l 事件处理的方式也是回调事件处理的方式也是回调l 当对象状态发生改变的时候,发出当对象状态发生改变的时候,发出signal通知所通知所有的有的slot接收接收signal,尽管它并不知道哪些函数定义,尽管它并不知道哪些函数定义了了slot,而,而slot也同样不知道要接收怎样的也同样不知道要接收怎样的signal回调callback程序跑起来时,一般情况下,应用

11、程序(applicationprogram)会时常通过API调用库里所预先备好的函数。但是有些库函数(libraryfunction)却要求应用先传给它一个函数,好在合适的时候调用,以完成目标任务。这个被传入的、后又被调用的函数就称为回调函数回调函数(callbackfunction)。回调callback打个比方,有一家旅馆提供叫醒服务,但是要求旅客自己决定叫醒的方法。可以是打客房电话,也可以是派服务员去敲门,睡得死怕耽误事的,还可以要求往自己头上浇盆水。这里,“叫醒”这个行为是旅馆提供的,相当于库函数,但是叫醒的方式是由旅客决定并告诉旅馆的,也就是回调函数。而旅客告诉旅馆怎么叫醒自己的动作

12、,也就是把回调函数传入库函数的动作,称为登记回调函数登记回调函数(toregisteracallbackfunction)。如下图所示信号和插槽用于两个对象之间的通信,信号和插槽(signal/slot)机制是Qt的核心特征,信号和插槽是Qt自定义的一种通信机制,它独立于标准的C/C+语言,所有从QObject或其子类派生的类都能够包含信号和插槽。图9-3信号与插槽的对应关系下面举例来说明信号/插槽机制。#includeclassCounter:publicQObjectQ_OBJECTpublic:Counter()m_value=0;intvalue()constreturnm_value

13、;publicslots:voidsetValue(intvalue);signals:voidvalueChanged(intnewValue);private:intm_value;在声明信号/插槽后,使用connect()函数将它们关联起来。Connect函数原型如下:boolQObject:connect(constQObject*sender,constchar*signal,constQObject*receiver,constchar*slot)static下面给出一个例子予以说明。Countera,b;QObject:connect(&a,&Counter:valueChang

14、ed,&b,&Counter:setValue);a.setValue(18);/a.value()=18,b.value()=18b.setValue(42);/a.value()=18,b.value()=42Counter类通过发射信号valueChanged来通知其他对象它的状态发生了变化,同时该类还具有一个插槽setValue,其他对象可以发信号给这个插槽。插槽setValue的定义如下:voidCounter:setValue(intvalue)if(value!=m_value)m_value=value;emitvalueChanged(value);当信号与插槽没有必要继续保

15、持关联时,用户可以使用disconnect()函数来断开连接。其定义如下所示:boolQObject:disconnect(constQObject*sender,constchar*signal,constObject*receiver,constchar*slot)static这个函数断开发射者中的信号与接收者中的插槽函数之间的关联。QObject类类nQObject是是Qt类体系的唯一基类,是类体系的唯一基类,是Qt各种功能的源头各种功能的源头活水,就象活水,就象MFC中的中的CObject和和Dephi中的中的TObjectn对象树:对象树:QObject在对象树中组织它们自己。当你以

16、另在对象树中组织它们自己。当你以另外一个对象作为父对象来创建一个外一个对象作为父对象来创建一个QObject时,它就被时,它就被添加到父对象的添加到父对象的children()列表中,并且当父对象被删列表中,并且当父对象被删除的时候,它也会被删除。这种机制很好的适合了图形除的时候,它也会被删除。这种机制很好的适合了图形用户界面应用对象的需要。用户界面应用对象的需要。n事件:事件是由窗口系统或事件:事件是由窗口系统或qt本身对各种事务的反应而本身对各种事务的反应而产生的。当用户按下、释放一个键或鼠标按钮,一个键产生的。当用户按下、释放一个键或鼠标按钮,一个键盘或鼠标事件被产生;当窗口第一次显示,

17、一个绘图事盘或鼠标事件被产生;当窗口第一次显示,一个绘图事件产生,从而告知最新的可见窗口需要重绘自身。大多件产生,从而告知最新的可见窗口需要重绘自身。大多数事件是由于响应用户的动作而产生的,但还有一些,数事件是由于响应用户的动作而产生的,但还有一些,比如定时器等,是由系统独立产生的。比如定时器等,是由系统独立产生的。QApplicationnQApplication和和QWidget都是都是QObject类类的子类的子类nQApplication类负责类负责GUI应用程序的控制应用程序的控制流和主要的设置,它包括主事件循环体,流和主要的设置,它包括主事件循环体,负责处理和调度所有来自窗口系统和

18、其他负责处理和调度所有来自窗口系统和其他资源的事件,并且处理应用程序的开始、资源的事件,并且处理应用程序的开始、结束以及会话管理,还包括系统和应用程结束以及会话管理,还包括系统和应用程序方面的设置。对于一个应用程序来说,序方面的设置。对于一个应用程序来说,建立此类的对象是必不可少的建立此类的对象是必不可少的QWidgetnQWidget类是所有用户接口对象的基类,类是所有用户接口对象的基类,它继承了它继承了QObject类的属性。组件是用户类的属性。组件是用户界面的单元组成部分,它接收鼠标、键盘界面的单元组成部分,它接收鼠标、键盘和其它从窗口系统来的事件,并把它自己和其它从窗口系统来的事件,并

19、把它自己绘制在盘屏幕上绘制在盘屏幕上nQWidget类有很多成员函数,但一般不直类有很多成员函数,但一般不直接使用,而是通过子类继承来使用其函数接使用,而是通过子类继承来使用其函数功能。如,功能。如,QPushButton、QlistBox等等都是它的子类都是它的子类对象树对象树事件运行机制事件运行机制Qt事件的处理过程:QApplication的事件循环体从事件队列中拾取本地窗口系统事件或其他事件,译成QEvent(),并送给QObject:event(),最后送给QWidget:event()本别对事件处理Qt程序设计程序设计Part Foue9.49.49.4.1 Helloworld程

20、序程序新建一个helloworld项目,该项目使用的类信息中将基类选择为QDialog。项目构成如下图所示。图9-4helloworld项目构成在源文件Main.cpp中输入源码,如下:#include#includeintmain(intargc,char*argv)QApplicationa(argc,argv);/创建了一个QApplication类的对象aQLabel*hello=newQLabel(Helloworld!,0);/创建了一个静态文本,将label设置为“Helloworld!”hello-show();/调用show()方法使窗口部件可见returna.exec();

21、/exec()中qt接收并处理用户和系统的事件,并且把它们传递给适当的窗口部件Qt数据库应用数据库应用Part Foue9.59.5Qt中的QtSql模块提供了对数据库的支持,该模块中的众多类基本上可以分为三层,分别是驱动层、SQL接口层和用户接口层。驱动层为具体的数据库和SQL接口层之间提供了底层的桥梁;SQL接口层提供了对数据库的访问,其中的QSqlDatabase类用来创建连接,QSqlQuery类可以使用SQL语句来实现与数据库交互,其他类对该层提供了支持;用户接口层的几个类实现了将数据库中的数据链接到窗口部件上,这些类使用模型/视图(model/view)框架实现,它们是更高层次的抽

22、象,即便不熟悉SQL也可以操作数据库。对应数据库部分的内容,可以在帮助中查看SQLProgramming关键字。9.5.1数据库驱动数据库驱动数据库驱动名称数据库驱动名称对应对应DBMSQDB2IBM DB2(版本7.1及以上)QIBASEBorland InterBaseQMYSQLMySQLQOCIOracle调用接口驱动QODBCODBCQPSQLPostgreSQL(版本7.3及以上)QSQLITE2SQLITE2QSQLITESQLITE3QTDSSybase自适应服务器也可以通过代码来查看本机Qt支持的数据库,一种典型代码如下所示:(1)新建Qtconsole应用,名称为sqldr

23、iverscheck。(2)完成后将sqldriverscheck.pro项目文件中第一行代码更改为:QT+=coresql表明使用了sql模块。(3)将main.cpp文件的内容更改如下:#include#include#include#includeintmain(intargc,char*argv)QCoreApplicationapp(argc,argv);qDebug()Availabledrivers:;QStringListdrivers=QSqlDatabase:drivers();foreach(QStringdriver,drivers)qDebug()tr(Cannoto

24、pendatabase),qApp-tr(Unabletoestablishadatabaseconnection.),QMessageBox:Cancel);returnfalse;QSqlQueryquery;query.exec(createtablestudent(idintprimarykey,namevarchar(30);query.exec(insertintostudentvalues(0,first);query.exec(insertintostudentvalues(1,second);数据库连接和表建立完毕后就可以进行查询等数据库操作了。如:query.exec(SE

25、LECT*FROMstudent);exec()方法执行后就可以对查询的结果集进行设置了。结果集就是查询到的所有记录的集合。在QSqlQuery类中提供了多个函数来操作这个集合,需要注意这个集合中的记录是从0开始编号的。最常用的操作有:seek(intn):query指向结果集的第n条记录;first():query指向结果集的第一条记录;last():query指向结果集的最后一条记录;next():query指向下一条记录,每执行一次该函数,便指向相邻的下一条记录;previous():query指向上一条记录,每执行一次该函数,便指向相邻的上一条记录;record():获得现在指向的记录

26、;value(intn):获得属性的值。其中n表示你查询的第n个属性,比方上面我们使用“select*fromstudent”就相当于“selectid,namefromstudent”,那么value(0)返回id属性的值,value(1)返回name属性的值。该函数返回QVariant类型的数据,关于该类型与其他类型的对应关系,可以在帮助中查看QVariant。at():获得现在query指向的记录在结果集中的编号。9.5.3 SQL模型模型类名类名用途用途QSqlQueryMdoel基于任意SQL语句的只读模型QSqlTableModel基于单个表的读写模型QSqlReltionalTableModelQSqlTableModel的子类,增加了外键支持

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

当前位置:首页 > 网络技术 > 前端技术

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:文库网官方知乎号:文库网

经营许可证编号: 粤ICP备2021046453号世界地图

文库网官网©版权所有2025营业执照举报