版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
智能家居平台应用项目化教程第1章
环境搭建相关知识介绍项目实施实训项目2项目描述项目描述3项目描述随着科技的发展,如今信息化技术已经深入人们的日常生活之中,伴随而来的便是其对于生活便利舒适的要求越来越高,这便造成智能家居技术的快速发展。因此智能家居的进步是顺应时代发展的产物,因为它不仅给人们的生活提供了便利,改变了传统的工作方式,还具有一定的艺术性和鉴赏性,极大丰富了人们的生活和工作。为了符合智能家居用户的实际需求,本书中的项目主要划分为五个模块:登录注册模块、环境监测模块、家电控制模块、自动控制模块和数据可视模块。4相关知识介绍5相关知识介绍虚拟机软件是指可以在一台电脑上模拟出若干台PC,每台PC都可以运行单独的操作系统而互不干扰,即可以实现一台电脑“同时”运行几个操作系统,且这些操作系统之间还可以根据需要组成一个网络。VMwareWorkstation可在一部实体机器上模拟完整的网络环境,以及可便于携带的虚拟机器,其更好的灵活性与先进的技术胜过了市面上其他的虚拟计算机软件。其主要具有以下优缺点:(1)计算机虚拟能力,性能与物理机隔离效果非常优秀。(2)功能非常全面,倾向于计算机专业人员使用。(3)操作界面简单明了,适用各种计算机领域的用户。(4)体积庞大,安装时间耗时较久。(5)使用时占用物理机资源较大。6VMwareWorkstation介绍Linux是免费使用和自由传播的类UNIX操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了UNIX以网络为核心的设计思想,是一款性能稳定的多用户网络操作系统。7Linux介绍相关知识介绍常用的Linux命令如下所示:ls显示文件或目录-l列出文件详细信息l(list)-a列出当前目录下所有文件及目录,包括隐藏的a(all)mkdir创建目录
-p创建目录,若无父目录,则创建p(parent)cd切换目录touch创建空文件echo创建带有内容的文件。cat查看文件内容cp拷贝mv移动或重命名rm删除文件
-r递归删除,可删除子目录及文件
-f强制删除find在文件系统中搜索某文件wc统计文本中行数、字数、字符数grep在文本文件中查找某个字符串rmdir删除空目录tree树形结构显示目录,需要安装tree包pwd显示当前目录ln创建链接文件more、less分页显示文本文件内容head、tail显示文件头、尾内容ctrl+alt+F1命令行全屏模式8相关知识介绍Qt是由奇趣科技在1991年开发的跨平台C++图形界面应用程序的开发框架,它是目前流行的Linux环境KDE的基础,KDE是Linux发行版的主要的一个标准组件。Qt具有以下优点:(1)跨平台特性:Qt支持下列操作系统:MicrosoftWindows95/98、MicrosoftWindowsNT、Linux、Solaris、SunOS、HP-UX、DigitalUNIX(OSF/1、Tru64)、Irix、FreeBSD、BSD/OS、SCO、AIX、OS390和QNX等。(2)面向对象:Qt的良好封装机制使得Qt的模块化程度非常高,可重用性较好,对于用户开发来说是非常方便的。Qt提供了一种称为signals/slots的安全类型来替代callback,这使得各个元件之间的协同工作变得十分简单。(3)丰富的API:Qt包括多达250个以上的C++类,还提供基于模板的collections、serialization、file、I/Odevice、directorymanagement和date/time类。甚至还包括正则表达式的处理功能。(4)支持2D/3D图形渲染,支持OpenGL。(5)大量的开发文档实例。(6)支持XML。9Qt介绍相关知识介绍QtCreator是跨平台的QtIDE,QtCreator是Qt被Nokia收购后推出的一款新的轻量级集成开发环境(IDE)。此IDE能够跨平台运行,支持的系统包括Linux(32位及64位)、MacOSX以及Windows。根据官方描述,QtCreator的设计目标是使开发人员能够利用Qt这个应用程序框架更加快速及轻易的完成开发任务。10QtCreator介绍相关知识介绍QtCreator主要是为了帮助新Qt用户更快速入门并运行项目,还可提高有经验的Qt开发人员的工作效率。其主要具有以下优点:(1)使用强大的C++代码编辑器可快速编写代码。语法标识和代码完成功能输入时进行静态代码检验以及提示样式上下文相关的帮助代码折叠括号匹配和括号选择模式高级编辑功能。(2)使用浏览工具管理源代码。集成了领先的版本控制软件,包括Git、Perforce和Subversion开放式文件,无须知晓确切的名称或位置搜索类和文件跨不同位置或文件沿用符号在头文件和源文件,或在声明和定义之间切换。(3)为Qt跨平台开发人员的需求而量身定制。集成了特定于Qt的功能,如信号与槽(Signals&Slots)图示调试器,对Qt类结构可一目了然集成了QtDesigner可视化布局和格式构建器只需单击一下就可生成和运行Qt项目。11QtCreator介绍相关知识介绍协调器主要是用于与各传感器实现组网,利用ZigBee协议完成各组件之间的数据交换。通常与该协调器组网的传感器包括:温湿度传感器、光照度传感器、烟雾传感器、燃气传感器、二氧化碳传感器、PM2.5传感器、气压传感器、人体红外传感器、电压型继电器和节点型继电器等。12协调器介绍相关知识介绍A8网关主要是用于烧录编写的智能家居应用程序,用户可以通过触摸屏操作对应的智能家居功能模块,同时其会通过串口线与协调器连接来进行数据传输,以此实现获取环境参数和控制命令的功能。13A8网关介绍相关知识介绍硬件名称详细信息CPU处理器SamsungS5PV210,基于CortexTM-A8,运行主频1GMHzDDR2RAM内存512MBDDR2RAM@200Mhz32bit数据总线FLASH存储标配512MSLCNANDFlash可选1GBSLCNANDFlash引脚接口2x60pin2.0mmspaceDIPconnector2x34pin2.0mmspaceDIPconnector在板资源4xUserLED(Green)EthernetChip:DM9000AEPCodecChip:WM8960SupplyVoltagefrom2Vto6VPCB规格尺寸6层高密度电路板,采用沉金工艺生产74x55x10(mm)软件支持Superboot-210Linux2.6.35+Qtopia-2.2.0+Qtopia4+QtE-4.8.5Android2.3(基于Linux-2.6.35)Android4.0(基于Linux-3.0.8)WindowsCE6.0uCos2实时操作系统14A8网关详细参数相关知识介绍项目实施15项目实施整个智能家居应用的工作结构是由各类传感器、协调器和A8网关构成。其首先利用ZigBee协议实现协调器和监测器及继电器之间的数据交换;随后通过数据线将协调器和A8网关连接起来,使其能够实现数据的传输;最后将数据进行预处理并显示在A8网关的智能家居应用中,反之该应用也能通过此步骤将操作指令传输给传感器,以此完成智能家居实时监控。右边是该系统的流程示意图:16方案设计项目实施序号设备名称板号1温湿度监测器42照度监测器53烟雾探测器64燃气探测器75二氧化碳监测器136PM2.5监测器87气压监测器38人体红外监测器210LED射灯1111电动窗帘1012电视、空调、DVD113换气扇1214报警灯915门禁系统1417传感器板号配置表项目实施18项目软件开发环境表名称版本操作系统Windows732位Ubuntu版本10.10VMWareWorkstation版本10.0.1QtCreator版本2.4.1虚拟机编译版本Qt4.8.1Linux内核烧写版本Qt4.7.0项目实施19项目目标通过本项目的完成,使学生可以掌握以下技能:①能够完成虚拟机程序VMWareWorkstation的下载及安装;②能够完成Ubuntu镜像的下载及安装;③能够完成Qt和QtCreator集成开发环境的下载、安装及搭建;④能够添加已经完成的Ubuntu集成开发环境镜像并正常使用。项目实施20虚拟机下载安装(1)运行对应目录内的安装程序VMware-workstation-full-10.0.0-1295980.exe。(2)选择如图所示中的“我接受许可协议中的条款”,并单击“下一步”按钮。项目实施21虚拟机下载安装(3)选中“典型”,根据实际需要单击图片中的“更改”按钮以选择VMWare的安装目录,但是注意安装路径中不能出现中文。项目实施22虚拟机下载安装(4)按照步骤单击“下一步”,直到出现如下图所示的界面并点击“继续”,安装过程大约持续3分钟。项目实施23虚拟机下载安装(5)在右图所示的界面中输入注册码,随后单击“输入”按钮会出现安装完成的界面,此时便说明VMWareWorkstation10已经安装完成,单击“完成”结束安装。项目实施24解压现有Ubuntu镜像考虑到智能家居开发环境的搭建相对繁琐,本书建议读者直接下载官方已经配置好的开发环境。以下是现有Ubuntu镜像环境的导入过程:(1)读者可以通过网址/s/1hsejIxm下载已经安装好的Ubuntu环境,并对下载好的压缩文件进行解压,其压缩包界面如图所示:项目实施25解压现有Ubuntu镜像(2)对三个ubuntu压缩包进行解压,直接单击解压目录中的Ubuntu.vmx,此时虚拟机软件会自动启动,读者只需单击VmwareWorkstation中的“开启此虚拟机”并在如图所示的登录界面中输入相应信息便可进入开发环境,其中用户名是zdd,开机密码是bizideal。项目实施26Ubuntu镜像下载安装(1)在浏览器中输入网址/download/alternative-downloads,点击如图所示的Ubuntu12.04.5LTS下的“Ubuntu12.04.5Desktop(32-bit)”链接开始下载Ubutnu12.04镜像,读者也可以通过其他渠道下载相同版本的Ubuntu。项目实施27Ubuntu镜像下载安装(2)当下载完成后,打开桌面上的VMWareWorkstation软件,单击主界面上的“创建新的虚拟机”,出现右图所示的界面。(3)单击“下一步”出现右图所示的界面,通过单击“浏览”按钮选择刚才下载的Ubuntu镜像文件。项目实施28Ubuntu镜像下载安装(4)单击“下一步”,其结果如右图所示,用户可以按照需要输入相应的用户名密码,此处例子中用户名为“smarthome”,密码为“123”。(5)按要求输入完数据后单击“下一步”出现右图所示的界面,用户可以根据需要更改虚拟机安装的名称和路径。项目实施29Ubuntu镜像下载安装(6)单击“下一步”,按照软件提示完成虚拟机的硬件分配。本书中将虚拟机的CPU设置为2个核心,内存设置为2048MB,用户也可以根据实际需要自行调整配置。(7)单击“完成”,此时虚拟机会自动启动并显示如图所示的安装界面,该安装过程大概会持续3-5分钟。项目实施30Ubuntu镜像下载安装(8)安装完成后将显示如图所示的界面,用户需输入步骤4中设置的密码,随后单击“Login”便可进入Ubuntu系统,至此Ubuntu虚拟机的安装全部结束。项目实施31Qt4下载及编译安装本书中将采用Qt4.8.6作为开发版本,以下为其详细的下载安装步骤:(1)在浏览器中输入网址http://download.qt.io/archive/qt/4.8/4.8.6/进入下载界面,并点击“qt-everywhere-opensource-src-4.8.6.tar.gz”进行下载,其界面如图所示。读者也可通过其他渠道下载相同版本的Qt,同时在比赛或实训过程中,学生一般不需要自行搭建QT开发环境。项目实施32Qt4下载及编译安装(2)打开终端,在其中输入命令“cd/home/smarthome/Downloads/”进入下载路径,随后输入命令“gunzipqt-everywhere-opensource-src-4.8.6.tar.gz”和“tarxvfqt-everywhere-opensource-src-4.8.6.tar”对下载的文件进行解压。(3)解压完成后会在该路径下生成一个qt-everywhere-opensource-src-4.8.6文件夹,此时继续在终端中输入命令“cdqt-everywhere-opensource-src-4.8.6/”以进入该目录,并依次输入命令“sudoapt-getinstalllibX11-devlibXext-devlibXtst-dev”和“./configure”。项目实施33Qt4下载及编译安装(4)按回车执行configure命令进行配置,并在第一个提示处输入字母o,在第二个提示处输入yes,等待几分钟,会生成Makefile文件,其界面如图所示。项目实施34Qt4下载及编译安装(5)随后在终端中继续输入命令“sudoapt-getinstallg++”以安装g++,完成后输入命令“make”编译Qt,该过程可能会花费一到两个小时。(6)编译完成后,执行“sudomakeinstall”,这样会将Qt安装到/usr/local/Trolltech/Qt-4.8.6目录下。随后执行命令“/usr/local/Trolltech/Qt-4.8.6/bin/designer”,如果能运行如下图所示的界面就证明安装成功。项目实施35Qt4下载及编译安装除了通过下载源码包进行解压编译来安装Qt4外,Ubuntu还支持通过命令直接安装Qt4,其步骤如下所示:(1)因为Ubuntu默认的更新源是国外的,其速度非常缓慢,因此首先需要更改/etc/apt/sources.list文件的使用权限,然后用书中代码直接更换sources.list里面的代码即可。(2)随后在终端中输入命令“apt-getupdate”更新源信息,完成后输入命令“sudoapt-getinstallg++”安装g++。(3)输入命令“sudoapt-getinstalllibqt4-devlibqt4-dbglibqt4-guilibqt4-sqlqt4-dev-toolsqt4-docqt4-designerqt4-qtconfigqtcreator”并执行。注意安装包可以根据需要选择,但建议这些全部安装。随后耐心等待安装完成,安装完成之后在命令行敲入命令“qtcreator”
即可打开QtCreator。项目实施36QtCreator下载安装(1)在浏览器中输入网址http://download.qt.io/archive/qtcreator/2.4/,选择“qt-creator-linux-x86-opensource-2.4.1.bin”进行下载,其界面如图所示。读者也可通过其他渠道下载相同版本的QtCreator,同时在比赛或实训过程中,学生一般不需要自行搭建QT开发环境。项目实施37QtCreator下载安装(2)单击界面左端任务栏上的终端程序,使用终端命令行cd到Downloads目录,输入命令“chmoda+xqt-creator-linux-x86-opensource-2.4.1.bin”使bin文件具有可执行的权限,然后输入“./qt-creator-linux-x86-opensource-2.4.1.bin”命令安装bin文件,其执行结果如下图所示。项目实施38QtCreator下载安装(3)随后根据提示完成QtCreator的安装,结束后该程序的运行界面如右图所示。(4)在Tools->Options中打开Build&Run,选择QtVersions并点击Add,路径选择为/usr/local/Trolltech/Qt-4.8.6/bin/qmake,其运行结果如右图所示,最后点击Apply。至此QtCreator的编译环境搭建完毕。实训项目39实训项目完成Ubuntu系统中的Qt集成开发环境安装后,可尝试在Windows系统中安装和搭建Qt集成开发环境,比较两者之间存在的差异及优势。40智能家居平台应用项目化教程第2章登录注册相关知识介绍项目实施实训项目42项目描述项目描述43项目描述智能家居应用主要用于监测环境参数和控制家电设备,因此其安全性设计至关重要,而登录注册作为一个用户授权的功能模块,能够有效避免无关用户对重要功能的操作及使用。本章将主要讲解登录注册模块的设计思路和所需要的基础知识。44相关知识介绍45相关知识介绍SQLite是一种嵌入式数据库,它的数据库就是一个文件。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成。因此其是一款实现了自给自足的、无服务器的、零配置的、事务性的
SQL数据库引擎,基于此种特性,它很好的符合了智能家居嵌入式平台应用的使用场景及需求,为其登录注册模块提供了相对便利和安全的存储方式。46SQLite数据库相关知识介绍SQLite具有以下优势:不需要一个单独的服务器进程或操作的系统(无服务器的)。SQLite不需要配置,这意味着不需要安装或管理。一个完整的SQLite数据库是存储在一个单一的跨平台的磁盘文件。SQLite是非常小的,是轻量级的,完全配置时小于400KB,省略可选功能配置时小于250KB。SQLite是自给自足的,这意味着不需要任何外部的依赖。SQLite事务是完全兼容ACID的,允许从多个进程或线程安全访问。SQLite支持SQL92(SQL2)标准的大多数查询语言的功能。SQLite使用ANSI-C编写的,并提供了简单和易于使用的API。SQLite可在UNIX(Linux,MacOS-X,Android,iOS)和Windows(Win32,WinCE,WinRT)中运行。47SQLite数据库相关知识介绍SQLite中常用的语句分为增删改查四种,其使用方法如下:(1)插入数据插入语句的格式如下所示:insert[into]<表名>(列名)values(列值)
例如在一个学生表Students中插入一行信息的语句为:insertintoStudents(name,sex,birth)values('开心朋朋','男','1980/6/15');(2)删除数据删除语句的格式如下所示:deletefrom<表名>[where<删除条件>]例如删除学生表Students中姓名为“开心朋朋”的语句为:deletefromStudentswherename='开心朋朋';48SQLite数据库相关知识介绍(3)修改数据删除语句的格式如下所示:update<表名>set<列名=更新值>[where<更新条件>]例如修改学生表Students中姓名为“开心朋朋”的性别为“女”的语句为:updateStudentssetsex='女'wherename='开心朋朋';(4)查询数据查询语句的格式如下所示:select<列名>from<表名>[where<查询条件表达试>][orderby<排序的列名>[asc或desc]]例如查询学生表Students中所有学生信息的语句为:select*fromStudents;49SQLite数据库相关知识介绍栅格布局管理器QGridLayout类主要用于实现部件在网格中布局,它将所有的空间分割成一定数量的行和列,并把每个窗口部件插入并管理到正确的单元格,其工作原理如下:栅格布局管理器QGridLayout首先计算了位于其中的空间,然后将它们合理的划分成若干个行(row)和列(column),并把每个由它管理的窗口部件放置在合适的单元之中,这里所指的单元(cell)即是指由行和列交叉所划分出来的空间。控件效果如图所示:50栅格布局管理器QGridLayout相关知识介绍51QGridLayout主要函数函数说明addLayout(Qlayout*layout,introw,intcolumn,Qt::Alignment=0)主要用于在QGridLayout中添加布局。其中layout表示需要添加的布局对象;row和column分别表示添加布局网格的行号和列号;Qt::Alignment表示布局放置在单元格中的位置,默认为0表示填充整个单元格。addWidget(QWidget*widget,introw,intcolumn,Qt::Alignment=0)主要用于在QGridLayout中添加控件。其中widget表示需要添加的窗口部件;row和column分别表示添加部件网格的行号和列号;Qt::Alignment表示控件放置在单元格中的位置,默认为0表示填充整个单元格。QRectcellRect(introw,intcolumn)主要用于获取根据row和column值所确定单元格的空间尺寸,如果row和column越界,则返回无效的QRectintcolumnCount()获取QGridLayout中的列数,同样有rowCount返回行数相关知识介绍52QGridLayout主要函数函数说明intcolumnMinimumWidth(intcolumn)获取指定列的最小宽度,该值可以通过函数setColumnMinimuWidth(intcolumn,intwidth)设置。同样有rowMinimumHeight(introw)获取某一行的最小高度,且利用函数setRowMinimunHeight(introw,intheight)进行设置intcolumnStretch(intcolumn)获取指定列column的拉升因子,该值可以通过函数setColumnStretch(intcolumn,intstretch)进行设置。同样函数introwStretch(introw)可以获取行row的伸缩值,并通过函数setRowStretch(introw,intstretch)设置。count()返回网格有多少个单元voidgetItemPosition(intindex,int*row,int*column,int*rowSpan,int*columnspan)用于获取index所制定的元素所在的行列号及水平垂直所占用的跨越单元个数。setSpacing()设置网格垂直及水平方向控件之间的间隔尺寸。该值可以利用函数spacing()获取,并且如果horizontalSpacing与verticalSpacing不同则返回-1。相关知识介绍QLabel是Qt界面中的标签类,它继承自QFrame类,其主要用于文本或图像的显示,但没有提供用户交互功能。一个QLabel可以包含下表中的任意内容类型。53QLabel、QLineEdit和QPushButtion内容设置纯文本使用setText()设置一个QString富文本使用setText()设置一个富文本的QString,相比较于纯文本,富文本可以对选中的部分单独设置字体、字形、字号、颜色图像使用setPixmap()设置一个图像动画使用setMovie()设置一个动画数字使用setNum()设置int或double,并转换为纯文本。Nothing空的纯文本,默认的,使用clear()设置相关知识介绍QLineEdit部件是一个单行文本输入框,它允许用户输入和编辑单行纯文本,它提供了很多有用的编辑功能,包括:撤销和重做、剪切和粘贴、以及拖放等。下表中列举了QLineEdit部件的常用接口。54QLabel、QLineEdit和QPushButtion函数说明QStringtext()返回输入框的当前文本。voidaddAction(QAction*action,ActionPositionposition)添加action至指定位置。Qt::Alignmentalignment()用于设置输入框的对齐方式(水平和垂直方向)。默认情况下,该属性包含Qt::AlignLeft和Qt::AlignVCenter。相关知识介绍55QLabel、QLineEdit和QPushButtion函数说明QStringselectedText()返回选中的的文本。如果没有选中,返回一个空字符串。默认为一个空字符串。voidsetCursorPosition(int)用于设置输入框当前光标的位置。设置光标位置时,会重新绘制光标位置。默认情况下,属性值为0。voidsetEchoMode(EchoMode)用于设置输入框的显示模式。显示模式决定了输入框对用户的文本显示。默认值为Normal,同时包含NoEcho、Password和PasswordEchoOnEdit等其它模糊输入。注意部件的显示、复制或拖动文本的行为受此设置的影响。voidsetMaxLength(int)用于设置文本的最大允许长度。如果文本太长,将从限制的位置截断。默认值为32767。voidsetReadOnly(bool)用于设置输入框是否为只读。在只读模式下,用户仍然可以将文本复制到剪贴板,或拖放文本(如果echoMode()是Normal),但不能编辑它。注意只读模式下,QLineEdit也不显示光标。voidsetValidator(constQValidator*v)设置输入框的验证器,将限制任意可能输入的文本。如果v==0,将会清除当前的输入验证器。相关知识介绍QPushButton部件继承自QButton类,通常用于执行命令或触发事件。其中下表列举了其常用成员函数。56QLabel、QLineEdit和QPushButtion函数说明QPushButton::QPushButton(constQString&text,QWidget*parent,constchar*name=0)构造一个名称为name,父对象为parent并且文本为text的按钮voidQButton::pressed()[信号]当按下该按钮时发射信号voidQButton::clicked()[信号]当单击该按钮时发射信号voidQButton::released()[信号]当释放该按钮时发射信号voidQButton::setText(constQString&)设置该按钮上显示的文本QStringQButton::text()返回该按钮上显示的文本相关知识介绍QMouseEvent类包含了用于描述鼠标事件的参数。当在一个窗口里按住鼠标按键、或移动、或释放就会产生鼠标事件QMouseEvent。当需要对鼠标事件进行处理时,通常要重新实现以下几个鼠标事件处理函数:QWidget::mousePressEvent():鼠标按下处理事件QWidget::mouseReleaseEvent():鼠标释放处理事件QWidget::mouseDoubleClickEvent():鼠标双击处理事件QWidget::mouseMoveEvent:鼠标移动处理事件57鼠标事件相关知识介绍标准对话框是Qt内置的一系列对话框,它主要用于简化开发。事实上,有很多对话框都是通用的,比如打开文件、设置颜色、打印设置等。这些对话框在所有程序中几乎相同,因此没有必要在每一个程序中都自己实现这么一个对话框。QMessageBox是指模态对话框,主要用于显示信息、询问问题等,其控件运行效果如图所示:58标准对话框QMessageBox相关知识介绍59QMessageBox常用几种消息提示类型函数说明QMessageBox::about(QWidget*parent,constQString&title,constQString&text)用于显示关于对话框。这是一个最简单的对话框,其标题是title,内容是text,父窗口是parent。对话框只有一个OK按钮。QMessageBox::aboutQt(QWidget*parent,constQString&title=QString())用于显示关于Qt信息的对话框,其标题是title,父窗口是parent。QMessageBox::critical(QWidget*parent,constQString&title,constQString&text,StandardButtonsbuttons=Ok,StandardButtondefaultButton=NoButton)用于显示严重错误对话框。这个对话框将显示一个红色的错误符号。我们可以通过buttons参数指明其显示的按钮。默认情况下只有一个Ok按钮,我们可以使用StandardButtons类型指定多种按钮。QMessageBox::question(QWidget*parent,constQString&title,constQString&text,StandardButtonsbuttons=StandardButtons(Yes|No),StandardButtondefaultButton=NoButton)QMessageBox::question()函数与QMessageBox::critical()类似,不同之处在于这个对话框提供一个问号图标,并且其显示的按钮是“是”和“否”两个。QMessageBox::warning(QWidget*parent,constQString&title,constQString&text,StandardButtonsbuttons=Ok,StandardButtondefaultButton=NoButton)QMessageBox::warning()函数与QMessageBox::critical()类似,不同之处在于这个对话框提供一个黄色叹号图标。项目实施60项目实施为保证智能家居平台应用的安全性和可靠性,它需要通过开发设计登录注册模块来实现授权用户后续功能的可操作性,最后验证该功能的实际运行情况并根据实验要求完善其设计。通过本项目的完成,使学生可以掌握以下技能:能够创建合适的Qt工程项目并根据需要添加资源文件;能够理解并灵活使用栅格布局管理器、基础控件、鼠标事件和标准对话框能够利用代码实现SQLite数据库的增删改查操作;能够通过调试解决代码的错误提示并保证正常编译运行。61方案设计和项目目标项目实施(1)选择项目模板。在QtCreator主界面上选择“文件->新建文件或项目”菜单项(也可以通过主界面上的“创建项目”或者快捷键Ctrl+N实现),在弹出的新建模块界面中选择Qt控件项目中的“QtGui应用”一项,然后单击“选择按钮”,其结果如下图所示。62Qt工程创建项目实施(2)输入项目信息。在“项目介绍和位置”界面中输入项目的名称SmartHome(项目名称可以自己设定,这里就以“SmartHome”为项目名称),随后单击“浏览”按钮在选择Documents文件夹,点击“Open”确定操作,如图所示。完成后单击“下一步”进入下个界面(注意项目名称和路径中均不可以出现中文)。63Qt工程创建项目实施(3)选择构建套件。首先在SmartHome工程项目的根目录下新建文件夹,详细设置如表所示,同时将lib-SmartHomeGateway-X86.so类库复制到Release-x86文件夹和Debug-x86文件夹中,将lib-SmartHomeGateway-ARM.so类库复制到Release-ARM文件夹和Debug-ARM文件夹中。在“创建构建设置”中选择手动设置,并根据需要分别设置发布版本和调试版本的工作目录。然后单击“下一步”。64Qt工程创建文件夹名称用途Debug-x86存储虚拟机中运行的调试版本编译文件Debug-ARM存储网关中运行的调试版本编译文件Release-x86存储虚拟机中运行的发布版本编译文件Release-ARM存储网关中运行的发布版本编译文件项目实施(4)输入类信息。在如图所示的类信息界面中已经自动生成了项目工程的类名,此处修改类名为Login,基类选择QDialog,表明该类继承自QDialog类,使用这个类可以自动生成一个对话框界面,且下面的头文件、源文件和界面文件都会自动生成,然后单击“下一步”。65Qt工程创建项目实施(5)设置项目管理。在该界面可以看到所创建项目的汇总信息,同时还可以设置版本控制系统,但在本项目中不会涉及,直接单击“完成”结束项目创建,如右图所示。(6)根据项目需求,需要单独创建一个注册界面,所以接下来需要添加新文件。在项目文件名称处点击鼠标右键会弹出如右图所示的对话框,单击“添加新文件”。66Qt工程创建项目实施(7)添加Qt设计师界面类。在如右图所示的弹出界面中选择Qt下的“Qt设计师界面类”,然后单击“选择”按钮。在Qt中,每一个界面类包含了头文件、源文件和界面文件,选择“Qt设计师界面类”选项后,会自动生成这三项文件。(8)选择界面模板。在右图中的界面中选择“DialogwithoutButtons”,即无按钮界面样式,然后单击“下一步”。67Qt工程创建项目实施(9)选择类名。将类名对话框中的名称改为Register,其主要用于实现注册功能,这时下面的头文件、源文件和界面文件都会自动生成,保持默认即可,如右图所示,然后单击“下一步”。(10)项目管理。在如右图所示的项目管理界面中会显示所有添加的文件名称,单击“完成”结束添加新文件操作。68Qt工程创建项目实施(1)在项目文件名称处点击鼠标右键单击“添加新文件”,在右图所示的界面中选择Qt的“Qt资源文件”,完成后单击“选择”。(2)如右图所示,在名称对话框中输入资源文件的名称Images,路径保持默认即可,随后单击“下一步”。69添加资源文件及头文件项目实施(3)在右图所示的项目管理界面中会显示所有添加的文件名称,单击“完成”结束添加资源文件操作。(4)打开新添加的资源文件Images.qrc,单击“添加”选择“添加前缀”,并将其前缀名称改为images,这样有利于代码编写时能够根据前缀名来导入图片,而不需要知道详细的图片路径,其界面如右图所示。70添加资源文件及头文件项目实施(5)在SmartHome工程项目的根目录中新建images文件夹,将项目所需的图片素材全部复制到该文件夹中。随后再次单击“添加”选择“添加文件”,并在弹出的对话框中选择images文件夹路径下所需添加的图片素材文件,完成后的界面如图所示。71添加资源文件及头文件项目实施为方便利用QtCreator开发应用程序,其通常需要引用各类已通过编译测试的头文件,这些文件的搭配使用极大降低了应用程序的开发周期。以下是添加头文件的详细操作流程:(1)将需要添加的文件复制到工程文件的根目录下,如图所示,将所需头文件command.h、configure.h、jsoncommand.h、log.h、posix_qextserialport.h、qextserialbase.h、qextserialport.h、sql.h、tcpclientthread.h、tcpserver.h、tcpthread.h和VariableDefinition.h复制到项目SmartHome的根目录中。72添加资源文件及头文件项目实施(2)打开工程项目文件SmartH,右键头文件文件夹,选择“添加现有文件”,依次将所需添加的头文件添加后即可显示在工程中,其项目结构如右下图所示。73添加资源文件及头文件项目实施74添加功能模块类在以上步骤的基础上添加设计师界面类DataBrowse、Smart以及编译所需的库文件lib-SmartHomeGateway-X86.so,其中SmartH的代码结构如下:QT+=coreguiQT+=network#添加network模块用于网络通信QT+=script#添加script模块用于解析JSONQT+=sql#添加sql模块用于数据库操作LIBS+=./lib-SmartHomeGateway-X86.so#添加库文件TARGET=SmartHome#项目名称TEMPLATE=app项目实施75添加功能模块类
SOURCES+=main.cpp\#源文件列表…….HEADERS+=login.h\#头文件列表…….FORMS+=login.ui\#界面文件列表…….RESOURCES+=\#资源文件列表Images.qrc项目实施Label控件的使用方法如下:(1)选择找到界面文件,在本项目中以login.ui为例。双击“login.ui”文件,进入图形化界面设计窗体,在窗体的左侧的DisplayWidgets栏找到Label图标,如左图所示。Label就是Qt开发中常用的文本标签。76修改界面布局项目实施(2)选中Label图标,将它拖拽至界面中,就成功地在界面中添加了一个文本标签了。此时可以将Label中的文本修改成符合项目需求的文本了,在此处就以“温湿度:”为例。修改文本的方法有两种,第一种是:双击刚刚拖出来的Label控件,将它自带的“TextLabel”文本修改为“温湿度:”文本,如右图所示。另一种方法则是:选中刚刚拖出来的Label后,在右侧的属性栏中找到text属性,在其中输入文本“温湿度:”即可,如右图所示。77修改界面布局项目实施(3)为了在项目以后的开发过程中,避免控件太多导致的混淆,就需要修改控件的名称,在右上角的控件列表中找到这个label,修改它的名称,在此处就以temp为例,如下图所示。78修改界面布局项目实施LineEdit控件的使用方法如下:(1)选择找到界面文件,在本项目中以login.ui为例。双击“login.ui”文件,进入图形化界面设计窗体,在窗体的左侧的InputWidgets栏找到LineEdit图标,如图所示。LineEdit是Qt开发中常用的单行文本输入控件,一般用于用户名、密码等少量文本交互地方。79修改界面布局项目实施(2)选中LineEdit图标,将它拖拽至界面中,就能成功在界面中添加一个输入文本。此时可以将LineEdit中的文本修改成符合项目需求的文本了,在此处就以“bizideal”为例。修改文本的方法有两种,第一种是:双击刚刚拖出来的LineEdit控件,将它自带的空白文本修改为“bizideal”文本,如右图所示。另一种方法则是:选中刚刚拖出来的LineEdit后,在右侧的属性栏中找到text属性,在其中输入文本“bizideal”即可,如右图所示。80修改界面布局项目实施(3)为了在项目以后的开发过程中,避免控件太多导致的混淆,就需要修改控件的名称,在右上角的控件列表中找到这个LineEdit,修改它的名称,在此处就以username为例,如图所示。81修改界面布局项目实施PushButton控件主要有两种表现形式,第一种是使用文本表示按钮内容,第二种是用图片表示内容,以下是两种表示方法的具体设置步骤:(1)选择找到界面文件,在本项目中以login.ui为例。双击“login.ui”文件,进入图形化界面设计窗体,在窗体的左侧的Buttons栏找到PushButton图标,如图所示。PushButton是Qt开发中用来命令计算机执行一些操作,或者回答一个问题。82修改界面布局项目实施(2)选中PushButton图标,将它拖拽至界面中,就能成功在界面中添加一个命令按钮,此时可以将PushButton中的文本修改成符合项目需求的文本了,在此处就以“登录”为例。修改文本的方法有两种,第一种是:双击刚刚拖出来的PushButton控件,将它自带的“PushButton”文本修改为“登录”文本,如右图所示。
另一种方法则是:选中刚刚拖出来的PushButton后,在右侧的属性栏中找到text属性,在其中输入文本“登录”即可,如右图所示。83修改界面布局项目实施(3)为了在项目以后的开发过程中,避免控件太多导致的混淆,就需要修改控件的名称,在右上角的控件列表中找到这个PushButton,修改它的名称,在此处就以login为例,如右图所示。(4)对于以图片作为背景的PushButton按钮,其首先拖拽一个PushButton控件至界面中,将其自带的“PushButton”文本删除,使其内容变为空白,如右图所示。84修改界面布局项目实施(5)鼠标右击该按钮控件,选择“改变样式表”
,在弹出的样式表对话框中选择“添加资源”里的“border-image”,如图所示。(6)在弹出的界面中选择所需添加的背景图片,完成后会在样式表对话框中显示所添加图片的相对路径,如右图所示。单击“确定”按钮完成操作。85修改界面布局项目实施登录界面login.ui的界面布局效果图如下图所示,其中控件的详细信息如右表所示:86修改界面布局控件ID控件类别控件内容labelQLabel用户名:label_2QLabel密码:label_3QLabel服务器IP:label_4QLabel端口号:leIDQLineEditbizideallePWQLineEdit123456leServerIpQLineEditlePortQLineEdit6001btnLoginQPushButton登录btnRegisterQPushButton注册账户btnSelectQPushButton查看账户btnManageQPushButton管理账户btnCloseQPushButton关闭系统项目实施注册界面register.ui的界面布局效果图如下图所示,其控件详细信息如右表所示:87修改界面布局控件ID控件类别控件内容labelQLabel用户名:label_2QLabel密码:label_3QLabel确认密码:leIDQLineEdit
lePWQLineEdit
lePW2QLineEdit
btnRegisterQPushButton注册btnCloseQPushButton项目实施数据浏览界面databrowse.ui的界面布局效果图如下图所示,其控件详细信息如下表所示:88修改界面布局控件ID控件类别控件内容tableViewQTableView
btnDeleteQPushButton删除账户btnCloseQPushButton项目实施主界面smart.ui的界面布局效果图如下图所示,其控件详细信息如下表所示:89修改界面布局控件ID控件类别控件内容labelQLabel成功进入主界面项目实施登录功能主要是用于实现验证用户信息,判断是否给予该用户使用权限,其功能模块主要由头文件login.h和源文件login.cpp实现。其中login.h的具体编写步骤如下:(1)修改login.h头文件,在其首部引入其它功能的头文件,以此实现功能模块之间的交互,因此在代码#include<QDialog>下一行写入如下代码:#include"QMessageBox"//导入Qt对话框#include"sql.h"//导入数据库操作功能的头文件#include"register.h"//导入用户注册功能的头文件#include"databrowse.h"//导入用户查看功能的头文件#include"tcpclientthread.h"//导入环境参数传递至服务器操作的客户端线程类头文件#include"tcpserver.h"//导入网络服务端类头文件#include"smart.h"//导入主要功能模块实现函数的头文件90修改登录功能头文件和源文件项目实施91修改登录功能头文件和源文件(2)随后在以上代码的下一行声明deleteZhi和exPort两个全局变量,
SOURCES+=main.cpp\#源文件列表…….
HEADERS+=login.h\#头文件列表…….
FORMS+=login.ui\#界面文件列表…….
RESOURCES+=\#资源文件列表Images.qrc其代码和注释如下所示:externintdeleteZhi;//用于判断账户删除操作是否符合条件externQStringexPort;//用于读取所输入的端口号项目实施92修改登录功能头文件和源文件(3)在classLogin:publicQDialog函数的public中声明Sql变量,同时在privateslots中对各个按钮事件进行声明,其详细代码如下所示:public:explicitLogin(QWidget*parent=0);~Login();SQLSql;//声明一个SQL类实例
privateslots://声明鼠标单击事件的槽函数voidon_btnClose_clicked();//关闭按钮点击事件
voidon_btnManage_clicked();//账户管理按钮点击事件
voidon_btnSelect_clicked();//账户查看按钮点击事件
voidon_btnRegister_clicked();//账户注册按钮点击事件
voidon_btnLogin_clicked();//账户登录按钮点击事件项目实施对于登录功能源文件login.cpp的具体操作如下:(1)对头文件login.h中声明的deleteZhi和exPort两个全局变量进行初始化,其位置处于#include"ui_login.h"下一行,具体代码如下:intdeleteZhi=0;QStringexPort="";(2)在函数Login::Login(QWidget*parent)中输入功能代码,其主要用于实现界面初始化工作,即当登录界面启动时完成数据库创建和用户信息插入,其代码如下:93修改登录功能头文件和源文件94项目实施setWindowFlags(Qt::FramelessWindowHint);//使窗口去掉标题栏
staticinti=0;if(i==0){if(!Sql.SqlConnect()){this->deleteLater();}QSqlQuerysql;sql.exec("createtableuser(name,pwd)");//创建数据库user,其属性包括用户名name和密码pwdsql.exec("select*fromuserwherename='"+ui->leID->text()+"'andpwd='"+ui->lePW->text()+"'");//对数据库进行查找
if(sql.next()){}else{sql.prepare("insertintouservalues('bizideal','123456')");//将数据插入数据库中
sql.exec();//执行数据库操作命令
}}i++;95项目实施(3)在程序尾部插入按钮事件实现函数,这些函数均与头文件login.h中privateslots中声明的函数一一对应,具体代码如下:/**函数名称:on_btnClose_clicked()*函数功能:关闭程序*返回值:空*/voidLogin::on_btnClose_clicked(){this->close();//关闭该窗口}/**函数名称:on_btnManage_clicked()*函数功能:管理数据库*返回值:空*/voidLogin::on_btnManage_clicked(){deleteZhi=1;//全局变量deleteZhi设置为1DataBrowsea;//新建数据浏览窗口
a.exec();}96项目实施/**函数名称:on_btnSelect_clicked()*函数功能:查看数据库*返回值:空*/voidLogin::on_btnSelect_clicked(){deleteZhi=2;//全局变量deleteZhi设置为2DataBrowsea;//新建数据浏览窗口
a.exec();}/**函数名称:on_btnRegister_clicked()*函数功能:注册程序*返回值:空*/voidLogin::on_btnRegister_clicked(){Registera;//新建用户注册窗口
this->close();a.exec();}97项目实施/**函数名称:on_btnLogin_clicked()*函数功能:登录进入主界面*返回值:空*/voidLogin::on_btnLogin_clicked(){QSqlQuerysql;sql.exec("select*fromuserwherename='"+ui->leID->text()+"'andpwd='“+ui->lePW->text()+"'");//根据用户名和密码查找用户
if(sql.next())//如果条件查找成功则继续执行以下操作
{exPort=ui->lePort->text();ServerIP=ui->leServerIp->text();Smarta;//新建主界面
this->close();a.exec();}}项目实施注册功能主要是用于实现用户信息写入数据库,以此授予用户权限提供其具体功能服务,其功能模块主要由头文件register.h和源文件register.cpp实现。其中register.h的具体编写步骤如下:(1)修改register.h头文件,在其首部引入登录功能的头文件,在代码#include<QDialog>下一行写入如下代码:#include"login.h"(2)在classRegister:publicQDialog函数的privateslots中对各个按钮事件进行声明,其详细代码如下所示:privateslots:voidon_btnClose_clicked();//关闭按钮点击事件voidon_btnRegister_clicked();//注册按钮点击事件98修改注册功能头文件和源文件项目实施99修改注册功能头文件和源文件对于注册功能源文件register.cpp的具体操作如下:(1)在函数Register::Register(QWidget*parent)中输入功能代码,其主要用于去除界面标题栏,具体代码如下:
setWindowFlags(Qt::FramelessWindowHint);//去除窗口标题栏项目实施100修改注册功能头文件和源文件(2)在程序尾部插入按钮事件实现函数,这些函数均与头文件register.h中privateslots中声明的函数一一对应,其主要用于实现数据库操作的各个对话框功能,具体代码如下所示:/**函数名称:on_btnClose_clicked()*函数功能:返回起始界面*返回值:空*/voidRegister::on_btnClose_clicked(){Logina;//新建登录界面this->close();//关闭注册界面a.exec();}101项目实施/**函数名称:on_btnRegister_clicked()*函数功能:数据库注册*返回值:空*/voidRegister::on_btnRegister_clicked(){if(ui->leID->text()==""){QMessageBox::critical(this,"注册失败","用户名不能为空","确认","取消");//利用基础对话框提示错误信息}elseif(ui->lePW->text()==""){QMessageBox::critical(this,"注册失败","密码不能为空","确认","取消");//利用基础对话框提示错误信息}elseif(ui->lePW2->text()==""){QMessageBox::critical(this,"注册失败","确认密码不能为空","确认","取消");//利用基础对话框提示错误信息}else{QSqlQuerysql;sql.exec("select*fromuserwherename='"+ui->leID->text()+"'");//根据用户名查找数据库
102项目实施if(sql.next()){
}else{if(ui->lePW->text()==ui->lePW2->text())//判断两个密码框中的信息是否一致{sql.prepare("insertintouservalues(:name,:pwd)");//将用户名和密码插入数据库sql.bindValue(":name",ui->leID->text());//将控件中的数据绑定到数据库的插入操作中sql.bindValue(":pwd",ui->lePW->text());//将控件中的数据绑定到数据库的插入操作中sql.exec();//执行插入操作QMessageBox::information(this,"注册成功","欢迎使用","确认","取消");//提示用户注册成功}103项目实施else{QMessageBox::critical(this,"注册失败","两次密码不同","确认","取消");//提示用户注册失败}}}}104项目实施其中各个对话框的效果图如以下图片所示:项目实施数据浏览功能主要是用于查看和删除用户注册信息,其功能模块主要由头文件databrowse.h和源文件databrowse.cpp实现。其中databrowse.h的具体编写步骤如下:(1)修改databrowse.h头文件,在其首部引入登录功能的头文件,以此实现功能模块之间的交互,因此在代码#include<QDialog>下一行写入如下代码:#include"login.h"(2)在classDataBrowse:publicQDialog函数的privateslots中对各个按钮事件进行声明,其详细代码如下所示:privateslots:voidon_btnClose_clicked();//关闭按钮点击事件voidon_btnDelete_clicked();//删除按钮点击事件105修改数据浏览功能头文件和源文件项目实施106修改数据浏览功能头文件和源文件对于数据浏览功能源文件databrowse.cpp的具体操作如下:(1)在函数DataBrowse::DataBrowse(QWidget*parent)中输入功能代码,其主要用于实现界面中表格信息的填充,并根据条件判断是否显示删除按钮,具体代码如下:
setWindowFlags(Qt::FramelessWindowHint);//去除窗口标题栏
QSqlQueryModel*model=newQSqlQueryModel();model->setQuery("select*fromuser");//查询用户信息
model->setHeaderData(0,Qt::Horizontal,"用户名");//设置查询结果的列表中的属性名称
model->setHeaderData(1,Qt::Horizontal,"密码");//设置查询结果的列表中的属性名称
ui->tableView->setModel(model);if(deleteZhi==1){
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 基于Agent的自动化测试框架监控方案课程设计
- 基于机器视觉的尺寸测量系统在系统设计课程设计
- 小学二年级科学下册认识常用工具一课的探究式教学设计
- 高中一年级化学氧化还原反应规律与守恒应用第三课时教学设计
- 小学三年级科学上册“我们关心天气”单元整体教学设计
- 高一信息技术必修1Python分支结构综合应用第三课时教学设计
- 高中信息技术必修一第四单元“初识人工智能”单元整体教学设计
- 初中九年级英语Unit 6 Beyond Earth Section B 3a-3c写作课教学设计
- 高中信息技术必修模块互联网应用单元IP地址及其配置教学设计
- 高中一年级信息技术教学设计:确定组网方案-从需求分析到拓扑规划的完整实践
- 2025-2026学年北师大版八年级生物上册全册教案
- 屋面木结构框架施工方案
- 家装工程质量监理验收表模板
- 餐饮厨房标准操作流程SOP范本
- 老兵退伍茶话会课件
- 索尼摄像机HXR-MC2500说明书
- 外研版(三起)(2024)三年级上册英语Unit 2 My school things 单元整体教学设计(共5课时)
- 国家安全教育大学生读本电子版教材2025年课件讲义全套合集
- 《基础会计学》期末考试试卷附答案
- 2025年设备监理师职业资格考试(设备工程项目管理)历年参考题库含答案详解(5套)
- 2025-2026学年北师大版数学小学三年级上册(全册)教案设计及教学计划
评论
0/150
提交评论