基于QT4的视频聊天工具的设计与实现论文设计_第1页
基于QT4的视频聊天工具的设计与实现论文设计_第2页
基于QT4的视频聊天工具的设计与实现论文设计_第3页
基于QT4的视频聊天工具的设计与实现论文设计_第4页
基于QT4的视频聊天工具的设计与实现论文设计_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

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

文档简介

武汉理工大学毕业论文绪论1.1软件开发的背景和目的近些年,人们的生活节奏越来越快。人们的生活压力越来越大,精神也越来越紧张,人们经常会出现不同的问题。在这时,人们往往会想到与人交流来缓解自己的压力,来发泄心中的不快。因此,聊天时一种和好的方式,来使自己在忙碌之中得到放松。网络聊天可以提升打字速度,还能转移注意力,使自己的精神得到放松。聊天还能医治抑郁,提升自己的语言表达。在聊天中同学善意的批评,老师精心的指点,或者得到一些热心人士的解答,都能使我们在聊天中得到放松,得到解决问题的办法。聊天对人是有许多益处,但是很多人却会因为网络出现问题了,导致我们不能聊天。就像我们学校,晚上经常断网,这样同学之间视频聊天,或者传递资料将很不方便。同学们急切需要一种聊天软件,可以使同学们打发空闲的时间,交流感情,共享资源。因此,我设计了一款局域网视频聊天软件。

1.2聊天软件在当今的形式如今各种各样的网络聊天工具到处存在,但是大部分软件都是只能在Windows平台上或者单一的平台上运行,这具有很大的局限性,因此我局域QT这个跨平台开发工具,开发了一个聊天软件。这个聊天软件能够实现局域网内的通信和文件传输,这十分方便同学们的需求。1.3软件设计和研究的方法由于TCP/IP通信和UDP通信用不同的软件实现的原理都类似,因此,通信方面可以参考的内容十分丰富。聊天界面的设计主要参考QQ聊天软件的界面设计。1.4设计过程1.对聊天软件界面应该十分熟悉,并且设计出一款和谐,美观的聊天界面2.创建登陆设定,针对不同的人建立相应的登陆方式3.建立UDP通信连接,使软件能够实现聊天通信4.建立TCP/IP通信连接,使软件能够实现文件传输5.优化界面,添加聊天的其他设置1.5研究内容该软件的研究内容主要在两方面:1.QT开发在界面设计方面是否能够设计出优美的界面,比其他开发软件是否更具优势,以及通信方面是否可行。2.QT开发的软件是否具有可移植性,跨平台性是否十分优越于其他开发软件。2系统开发技术及开发工具2.1QT的概念QT在网上有多种解释:如Quantity、Quart、Quarter等/Qt是诺基亚开发的一个跨平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。2.2QT的发展Qt是一个跨平台的C++图形用户界面库,由挪威TrollTech公司于1995年底出品。Trolltech公司在1994年成立,但是在1992年,成立Trolltech公司的那批程序员就已经开始设计Qt了,Qt的第一个商业版本于1995年推出。2.2.1发展历史Qt经历了漫长的发展:1996OctKDE组织成立。1998Apr05Trolltech的程序员在5天之内将Netscape5.0从Motif移植到Qt上。1998Apr08KDEFreeQt基金会成立。1998Jul09Qt1.40发布。1998Jul12KDE1.0发布。1999Mar04QPL1.0发布。1999Mar12Qt1.44发布。1999Jun25Qt2.0发布。1999Sep13KDE1.1.2发布。2000Mar20嵌入式Qt发布。2000Sep06Qt2.2发布。2000Oct05Qt2.2.1发布。2000Oct30Qt/Embedded开始使用GPL宣言。2000Sep04Qtfreeedition开始使用GPL。自从1996年早些时候,Qt进入商业领域,它已经成为全世界范围内数千种成功的应用程序的基础。Qt也是流行的Linux桌面环境KDE的基础,KDE是所有主要的Linux发行版的一个标准组件。2.2.2发展前景QT是一个跨平台的界面开发软件,因此Qt同XWindow上的Motif,Openwin,GTK等图形界面库和Windows平台上的MFC,OWL,VCL,ATL是同类型的东西,但是Qt具有下列优点:优良的跨平台特性:QT支持下列操作系统:MicrosoftWindows95/98,MicrosoftWindowsNT,Linux,Solaris,SunOS,HP-UX,DigitalUNIX(OSF/1,Tru64),Irix,FreeBSD,BSD/OS,SCO,AIX,OS390,QNX等等。面向对象Qt的良好封装机制使得Qt的模块化程度非常高,可重用性较好,对于用户开发来说是非常方便的。Qt提供了一种称为signals/slots的安全类型来替代callback,这使得各个元件之间的协同工作变得十分简单。丰富的APIQt包括多达250个以上的C++类,还提供基于模板的collections,serialization,file,I/Odevice,directorymanagement,date/time类。甚至还包括正则表达式的处理功能。支持2D/3D图形渲染,支持OpenGL。大量的开发文档。XML支持。Webkit引擎的集成,可以实现本地界面与Web内容的无缝集成但是真正使得Qt在自由软件界的众多Widgets(如Lesstif,Gtk,EZWGL,Xforms,fltk等等)中脱颖而出的还是基于Qt的重量级软件KDE。因此,QT比其他开发软件具有跟多的优势,在嵌入式界面开发方面起到重要作用。2.3QT的主要功能QT的主要功能是进行界面开发,QT开发的界面十分美观、和谐,让人容易接受。QT开发的软件具有一次开发,重复使用的特点。它开发的软件,能够移植到多种平台上运行。它的开发环境是QtCreator。QtCreator可带来两大关键益处:提供首个专为支持跨平台开发而设计的集成开发环境(IDE),并确保首次接触Qt框架的开发人员能迅速上手和操作。QtCreator包含了一套用于创建和测试基于Qt应用程序的高效工具,包括:一个高级的C++代码编辑器上下文感知帮助系统可视化调试器源代码管理项目和构建管理工具。2.4QT的应用平台QT由于具有跨平台的特点,因此能够在多种平台下运行,并进行开发。它支持的平台如下:MS/Windows-95、98、NT4.0、ME、2000、XP、Vista和Win7、Unix/X11-Linux、SunSolaris、HP-UX、CompaqTru64UNIX、IBMAIX、SGIIRIX和其它很多X11平台,还支持Macintosh-MacOSX、Embedded、WindowsCE、Symbian/S60等。由以上可知,QT具有较大的优势。2.5OpenCV介绍OpenCV的全称是:OpenSourceComputerVisionLibrary。OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上。它轻量级而且高效——由一系列C函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。3需求分析3.1引言3.1.1编写目的网络聊天可以提升打字速度,还能转移注意力,使自己的精神得到放松。聊天还能医治抑郁,提升自己的语言表达。在聊天中同学善意的批评,老师精心的指点,或者得到一些热心人士的解答,都能使我们在聊天中得到放松,得到解决问题的办法。聊天对人是有许多益处,但是却会因为不同系统之间存在局限性了,导致我们不能聊天。就像有的同学喜欢用Windows系统,有的同学喜欢用Linux系统,这样同学之间聊天,或者传递资料将很不方便,或者不能够进行数据传输。因此,同学们急切需要一种聊天软件,可以使同学们打发空闲的时间,交流感情,在不同的平台下进行共享资源。为了帮同学们解决这个问题,我开发了这款软件,帮同学们解决不同的平台之间的聊天。3.2任务概述3.2.1任务目标软件应该能够搜索到当前用户,并显示用户信息。软件应该具备优美,简单的大众化操作界面。软件能够供用户设置自己要发送的文字字体。软件还要能够传送文件。监听指定的端口,等待用户的连接。建立与客户端的逻辑连接,并能通知其他好友。接收客户端的消息请求,并能正确无误地处理消息,并能发出消息到客户端。及时地反映发出地消息和聊天消息,可以实现摄像头的开启和通信。当好友断开与服务器端地连接时,服务器能够正确地断开连接,并通知其他用户。3.2.2运行环境由于针对不同的同学,不同人喜欢用不同的操作系统,因此所开发的软件应该具备大众化,能够适应多种操作系统,因此我选择了QT进行开发,一次开发,可以移植到不同的操作系统中应用,但测试是在windowsxp下进行测试。3.3协议需求分析在软件中由于涉及到聊天信息的传输和文件的传送,因此我选择了TCP/IP协议和UDP协议都是用。用具有可靠性的TCP/IP协议传输文件,用不具可靠性的UDP协议传送聊天信息。3.3.1协议TCP/IP(TransmissionControlProtocol/InternetProtocol)的简写,中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是Internet最基本的协议、Internet国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的。1.工作流程它的工作流程图如图3-1所示:图3-1TCP/IP工作原理图2.应用方面TCP协议被称作一种端对端协议。这是因为它为两台计算机之间的连接起了重要作用:当一台计算机需要与另一台远程计算机连接时,TCP协议会让它们建立一个连接、发送和接收资料以及终止连接。传输控制协议TCP协议利用重发技术和拥塞控制机制,向应用程序提供可靠的通信连接,使它能够自动适应网上的各种变化。网际协议IP协议提供了能适应各种各样网络硬件的灵活性,对底层网络硬件几乎没有任何要求,任何一个网络只要可以从一个地点向另一个地点传送二进制数据,就可以使用IP协议加入Internet了。IP协议对于网络通信有着重要的意义:网络中的计算机通过安装IP软件,使许许多多的局域网络构成了一个庞大而又严密的通信系统。从而使Internet看起来好像是真实存在的,但实际上它是一种并不存在的虚拟网络,只不过是利用IP协议把全世界上所有愿意接入Internet的计算机局域网络连接起来,使得它们彼此之间都能够通信。3.套接字连接过程下面给出几个基本的套接字,这些套接字的使用贯穿了网络编程的始末,主导了数据通信的过程。(1)创建套接字——socket()功能:使用前创建一个新的套接字。格式:SOCKETPASCALFARsocket(intaf,inttype,intprocotol);参数:af:通信发生的区域。type:要建立的套接字类型。procotol:使用的特定协议(2)指定本地地址——bind()功能:将套接字地址与所创建的套接字号联系起来。格式:intPASCALFARbind(SOCKETs,conststructsockaddrFAR*name,intnamelen);参数:s:是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。其它:没有错误,bind()返回0,否则SOCKET_ERROR(3)建立套接字连接——connect()和accept()功能:共同完成连接工作。(4)监听连接——listen()功能:用于面向连接服务器,表明它愿意接收连接。格式:intPASCALFARlisten(SOCKETs,intbacklog);(5)数据传输——send()与recv()功能:数据的发送与接收。(6)多路复用——select()功能:用来检测一个或多个套接字状态。(7)关闭套接字——closesocket()功能:关闭套接字s。格式:BOOLPASCALFARclosesocket(SOCKETs);3.3.2UDP协议UDP是UserDatagramProtocol的简称,中文名是用户数据包协议,是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。1.工作流程它的工作流程图如图3-2所示:图3-2UDP工作原理图特点和应用UDP是一个无连接协议,传输数据之前源端和终端不建立连接,当UDP它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表.UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。虽然UDP是一个不可靠的协议,但它是分发信息的一个理想协议。例如,在屏幕上报告股票市场、在屏幕上显示航空信息等等。3.3.3协议的区别1.基于连接与无连接;2.对系统资源的要求(TCP较多,UDP少);3.UDP程序结构较简单;4.流模式与数据报模式;5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。3.3.4功能需求分析主要功能描述:进入聊天界面之后,用户进入聊天平台。在进入聊天平台之后,用户就可以进行聊天了。用户能够设置字体的大小,颜色等,可以发送数据,视频聊天,传送文件等。4概要设计4.1设计目的由前面的需求分析,得出了系统的基本需求和基本的数据流图,要实现整个系统,需要对用户的需求进行设计,概要设计主要是利用比较抽象的语言对整个需求进行概括,确定系统的物理配置,确定整个系统的处理流程和系统的数据结构、接口设计、实现对系统的初步设计。4.2系统物理配置4.2.1硬件环境CPU: InterCorei5内存: 3GB硬盘空间: 500GB4.2.2软件环境操作系统: Windows7

开发软件: QTSDK

库: OpenCV4.3系统模块功能说明1.改变字体部分:可以改变聊天文字字体、颜色、大小等。2.发送信息部分:输入信息点击发送按钮,发送聊天信息。发送数据流程图如图4-1所示:开始开始建立UDP连接建立UDP连接监听监听发送数据发送数据显示数据显示数据结束结束图4-1发送数据流程图3.清空信息部分:点击清空信息按钮,清空聊天的内容。保存信息部分:点击保存信息按钮,可以保存信息。发送文件部分:可以给指定用户发送文件。端口部分:新用户进入界面,同时搜索同一端口号所在线的人数。端口流程图如图4-2所示:开始进入界面进入界面NN搜索同一端口人数是否增加搜索同一端口人数是否增加YY在线人数加1在线人数加1退出界面退出界面结束结束图4-2端口流程图视频功能部分:点击视频按钮可以弹出视频窗口。4.4系统功能模块图进入聊天界面之后,用户进入聊天平台。在进入聊天平台之后,用户就可以进行聊天了。用户能够设置字体的大小,颜色等,可以发送数据,视频聊天,传送文件等。功能模块图如图4-3所示:聊天界面聊天界面创建端口视频功能发送文件清空信息发送信息改变文字保存信息创建端口视频功能发送文件清空信息发送信息改变文字保存信息图4-3系统功能功能模块图5详细设计及实现5.1聊天界面的设计5.1.1获取端口信息1.设计思路(1)通过在聊天文件中定义一个公共变量port1,通过“w.port1=port”语句将私有端口号传入聊天函数中。在创建登陆端口时,以该端口创建。而公共端口则是程序已经定义了。(2)获取同一端口号内用户的信息,其中包括用户名,本地主机名,ip地址每次加入一个用户,“在线人数”就会加1,如果存在用户离开,“在线人数”就会减1,并且在收到信息的界面中显示信息“XXXX离开”。流程图如图5-1示:开始开始进入界面进入界面NN搜索同一端口人数是否增加搜索同一端口人数是否增加YY在线人数加1在线人数加1退出界面退出界面结束结束图5-1端口界面流程图界面设计如图5-2所示:图5-2端口界面显示图代码实现这部分包括在线人数增加和减少两部分代码:(1)在线人数增加部分的代码voidWidget::newParticipant(QStringuserName,QStringlocalHostName,QStringipAddress){boolbb=ui->tableWidget->findItems(localHostName,Qt::MatchExactly).isEmpty();if(bb){QTableWidgetItem*user=newQTableWidgetItem(userName);QTableWidgetItem*host=newQTableWidgetItem(localHostName);QTableWidgetItem*ip=newQTableWidgetItem(ipAddress);ui->tableWidget->insertRow(0); ui->tableWidget->setItem(0,0,user); ui->tableWidget->setItem(0,1,host); ui->tableWidget->setItem(0,2,ip); ui->textBrowser->setTextColor(Qt::gray); ui->textBrowser->setCurrentFont(QFont("TimesNewRoman",10));ui->textBrowser->append(tr("%1在线!").arg(userName));ui->onlineUser->setText(tr("在线人数:%1").arg(ui->tableWidget->rowCount()));sendMessage(NewParticipant);}}(2)在线人数减少部分的代码voidWidget::participantLeft(QStringuserName,QStringlocalHostName,QStringtime){introwNum=ui->tableWidget->findItems(localHostName,Qt::MatchExactly).first()->row();ui->tableWidget->removeRow(rowNum);ui->textBrowser->setTextColor(Qt::gray);ui->textBrowser->setCurrentFont(QFont("TimesNewRoman",10));ui->textBrowser->append(tr("%1于%2离开!").arg(userName).arg(time));ui->onlineUser->setText(tr("在线人数:%1").arg(ui->tableWidget->rowCount()));}5.1.2发送信息界面 设计思路这部分包括两个部分:第一部分是聊天信息编辑界面。第二部分是聊天信息发送操作,在这部分中包括两个按钮,一个是“关闭”,另一个是发送按钮。操作流程用户在聊天编辑界面中编辑要发送的信息,当编辑完毕之后,用户可以点击发送按钮发送要发送的信息。用户发送信息的整个过程是通过建立UDP连接来传送需要发送的数据。流程图如图5-3所示:开始开始建立UDP连接建立UDP连接监听监听发送数据发送数据显示数据显示数据结束结束图5-3发送数据流程图界面设计如图5-4所示:图5-4发送数据操作界面代码实现voidWidget::sendMessage(MessageTypetype,QStringserverAddress)//发送信息{QByteArraydata;QDataStreamout(&data,QIODevice::WriteOnly);QStringlocalHostName=QHostInfo::localHostName();QStringaddress=getIP();out<<type<<getUserName()<<localHostName;switch(type){caseParticipantLeft:{break;}caseNewParticipant:{out<<address;break;}caseMessage:{if(ui->textEdit->toPlainText()==""){QMessageBox::warning(0,tr("警告"),tr("发送内容不能为空"),QMessageBox::Ok);return;}out<<address<<getMessage();ui->textBrowser->verticalScrollBar()->setValue(ui->textBrowser->verticalScrollBar()->maximum();break;}caseFileName:{introw=ui->tableWidget->currentRow();QStringclientAddress=ui->tableWidget->item(row,2)->text();out<<address<<clientAddress<<fileName;break;}caseRefuse:{out<<serverAddress;break;}}udpSocket->writeDatagram(data,data.length(),QHostAddress::Broadcast,port);}5.1.3接收信息界面设计思路这部分只包括信息显示界面。工作流程当软件接受到数据之后,包括用户编辑发送的信息和用户离开时显示的信息。用户接受信息的整个过程是通过建立UDP连接来接受需要收到的数据。流程图如图5-5所示:开始开始建立UDP连接建立UDP连接监听监听接收数据接收数据显示数据显示数据结束结束图5-5接受数据流程图界面设计如图5-6所示:图5-6接受数据界面图5.代码实现voidWidget::processPendingDatagrams()//接收数据UDP{while(udpSocket->hasPendingDatagrams()){QByteArraydatagram;datagram.resize(udpSocket->pendingDatagramSize());udpSocket->readDatagram(datagram.data(),datagram.size());QDataStreamin(&datagram,QIODevice::ReadOnly);intmessageType;in>>messageType;QStringuserName,localHostName,ipAddress,message;QStringtime=QDateTime::currentDateTime().toString("yyyy-MM-ddhh:mm:ss");switch(messageType){caseMessage:{in>>userName>>localHostName>>ipAddress>>message;ui->textBrowser->setTextColor(Qt::blue);ui->textBrowser->setCurrentFont(QFont("TimesNewRoman",12));ui->textBrowser->append("["+userName+"]"+time);ui->textBrowser->append(message);break;}caseNewParticipant:{in>>userName>>localHostName>>ipAddress;newParticipant(userName,localHostName,ipAddress);break;}caseParticipantLeft:{in>>userName>>localHostName;participantLeft(userName,localHostName,time);break;}caseFileName:{in>>userName>>localHostName>>ipAddress;QStringclientAddress,fileName;in>>clientAddress>>fileName;hasPendingFile(userName,ipAddress,clientAddress,fileName);break;}caseRefuse:{in>>userName>>localHostName;QStringserverAddress;in>>serverAddress;QStringipAddress=getIP();if(ipAddress==serverAddress){server->refused();}break;}}}}5.1.4改变编辑字体界面 1.设计思路这部分包括四个部分:第一部分是字体选择部分;第二部分是字体大小部分;第三部分是字体状态部分,其中主要包括字体是否是粗体、斜体、下划线、颜色等信息;第四部分是其他操作,如:发送文件,保存信息,清空信息。2.操作方式通过固定的按钮设置字体的状态,使用户在编辑信息时改变字体。如当用户点击按钮是,按钮显示按下状态,说明已经字体设置成当前状态3.界面设计字体界面包括字体设置、字体大小设置、粗体设置、下划线设置、视频、字体颜色、文件传输、聊天记录保存等部分。如图5-7所示:图5-7字体界面操作图4.代码实现主要包括几个部分函数(1)字体设置函数voidWidget::on_fontComboBox_currentFontChanged(QFontf)//字体设置{ui->textEdit->setCurrentFont(f);ui->textEdit->setFocus();}(2)字体大小设置函数voidWidget::on_fontsizecomboBox_currentIndexChanged(QStringsize){ui->textEdit->setFontPointSize(size.toDouble());ui->textEdit->setFocus();}(3)粗体设置voidWidget::on_textbold_clicked(boolchecked){if(checked)ui->textEdit->setFontWeight(QFont::Bold);elseui->textEdit->setFontWeight(QFont::Normal);ui->textEdit->setFocus();}voidWidget::on_textitalic_clicked(boolchecked){ui->textEdit->setFontItalic(checked);ui->textEdit->setFocus();}(4)下划线设置函数voidWidget::on_textUnderline_clicked(boolchecked){ui->textEdit->setFontUnderline(checked);ui->textEdit->setFocus();}(5)视频按钮函数voidWidget::on_pushButton_clicked(){Form*a=newForm();a->show();}(6)颜色设置函数voidWidget::on_textcolor_clicked(){color=QColorDialog::getColor(color,this);if(color.isValid()){ui->textEdit->setTextColor(color);ui->textEdit->setFocus();}}(7)保存聊天记录函数voidWidget::on_save_clicked()//保存聊天记录{if(ui->textBrowser->document()->isEmpty())QMessageBox::warning(0,tr("警告"),tr("聊天记录为空,无法保存!"),QMessageBox::Ok);else{//获得文件名QStringfileName=QFileDialog::getSaveFileName(this,tr("保存聊天记录"),tr("聊天记录"),tr("文本(*.txt);;AllFile(*.*)"));if(!fileName.isEmpty())saveFile(fileName);}}(8)保存文件函数boolWidget::saveFile(constQString&fileName)//保存文件{QFilefile(fileName);if(!file.open(QFile::WriteOnly|QFile::Text)){QMessageBox::warning(this,tr("保存文件"),tr("无法保存文件%1:\n%2").arg(fileName).arg(file.errorString()));returnfalse;}QTextStreamout(&file);out<<ui->textBrowser->toPlainText();returntrue;}(9)清空聊天记录函数voidWidget::on_clear_clicked()//清空聊天记录{ui->textBrowser->clear();}voidWidget::on_ConectB_clicked(){udpSocket=newQUdpSocket(this);port=port1;udpSocket->bind(port,QUdpSocket::ShareAddress|QUdpSocket::ReuseAddressHint);connect(udpSocket,SIGNAL(readyRead()),this,SLOT(processPendingDatagrams()));sendMessage(NewParticipant);server=newTcpServer(this);connect(server,SIGNAL(sendFileName(QString)),this,SLOT(sentFileName(QString)));connect(ui->textEdit,SIGNAL(currentCharFormatChanged(QTextCharFormat)),this,SLOT(currentFormatChanged(constQTextCharFormat)));}(10)视频按钮函数voidWidget::on_pushButton_clicked(){Form*a=newForm();a->show();}5.2文件传送界面的设计 设计思路这部分应该包括两个部分第一部分是文件名和发送进度条的显示第二部分是打开文件和发送文件,以及退出发送文件界面的按钮。操作方式发送文件时,先确定发送对象,然后必须有双方都同意,才能发送成功,否则退出。当用户进入发送界面之后,先点击“打开”按钮,选择要发送文件,然后点击发送,等待对方接受,但对方接受之后,会显示发送进度,否则,发送不成功。流程图如图5-8所示:开始开始点击界面发送文件按钮点击界面发送文件按钮找到要发送的文件找到要发送的文件点击发送文件点击发送文件N对方同意接受文件N对方同意接受文件文件传送,并显示进度文件传送,并显示进度退出退出图5-8发送文件流程图界面设计发送文件界面如图5-9所示:图5-9发送数据操作界面接收文件界面如图5-10所示:图5-10接受数据操作界面5.代码实现包括几部分代码(1)打开文件voidTcpServer::on_serverOpenBtn_clicked()//打开{fileName=QFileDialog::getOpenFileName(this);if(!fileName.isEmpty()){theFileName=fileName.right(fileName.size()-fileName.lastIndexOf('/')-1);ui->serverStatusLabel->setText(tr("要传送的文件为:%1").arg(theFileName));ui->serverSendBtn->setEnabled(true);ui->serverOpenBtn->setEnabled(false);}}(2)发送文件voidTcpServer::sendMessage()//开始发送数据{ui->serverSendBtn->setEnabled(false);clientConnection=tcpServer->nextPendingConnection();connect(clientConnection,SIGNAL(bytesWritten(qint64)),SLOT(updateClientProgress(qint64)));ui->serverStatusLabel->setText(tr("开始传送文件%1!").arg(theFileName));localFile=newQFile(fileName);if(!localFile->open((QFile::ReadOnly))){//以只读方式打开QMessageBox::warning(this,tr("应用程序"),tr("无法读取文件%1:\n%2").arg(fileName).arg(localFile->errorString()));return;}TotalBytes=localFile->size();QDataStreamsendOut(&outBlock,QIODevice::WriteOnly);sendOut.setVersion(QDataStream::Qt_4_6);time.start();//开始计时QStringcurrentFile=fileName.right(fileName.size()-fileName.lastIndexOf('/')-1);sendOut<<qint64(0)<<qint64(0)<<currentFile;TotalBytes+=outBlock.size();sendOut.device()->seek(0);sendOut<<TotalBytes<<qint64((outBlock.size()-sizeof(qint64)*2));bytesToWrite=TotalBytes-clientConnection->write(outBlock);qDebug()<<currentFile<<TotalBytes;outBlock.resize(0);}(3)被拒绝的处理voidTcpServer::refused()//被对方拒绝{tcpServer->close();ui->serverStatusLabel->setText(tr("对方拒绝接收!!!"));}(4)进度显示voidTcpServer::updateClientProgress(qint64numBytes)//更新进度条{bytesWritten+=(int)numBytes;if(bytesToWrite>0){outBlock=localFile->read(qMin(bytesToWrite,loadSize));bytesToWrite-=(int)clientConnection->write(outBlock);outBlock.resize(0);}else{localFile->close();}ui->progressBar->setMaximum(TotalBytes);ui->progressBar->setValue(bytesWritten);floatuseTime=time.elapsed();doublespeed=bytesWritten/useTime;ui->serverStatusLabel->setText(tr("已发送%1MB(%2MB/s)\n共%3MB已用时:%4秒\n估计剩余时间:%5秒").arg(bytesWritten/(1024*1024))//已发送.arg(speed*1000/(1024*1024),0,'f',2)//速度.arg(TotalBytes/(1024*1024))//总大小.arg(useTime/1000,0,'f',0)//用时.arg(TotalBytes/speed/1000-useTime/1000,0,'f',0));//剩余时间//num.sprintf("%.1fKB/s",(bytesWritten*1000)/(1024.0*time.elapsed()));if(bytesWritten==TotalBytes)ui->serverStatusLabel->setText(tr("传送文件%1成功").arg(theFileName));}(5)发送完毕voidTcpServer::on_serverCloseBtn_clicked()//退出{if(tcpServer->isListening()){tcpServer->close();clientConnection->abort();}this->close();}5.3视频界面设计思路一个窗体上面显示视频图像。2.操作方式点击视频按钮弹出视频界面开始进行视频。界面设计如图5-11所示: 图5-11视频界面代码实现voidWidget::processPendingDatagram(){qint64num=receiver->pendingDatagramSize();qDebug()<<"receiversize:"<<num;QByteArraybuffer;buffer.resize(num);receiver->readDatagram((char*)buffer.data(),num);//将接收到的数据放入buffer中QFilefile("test.jpg");file.write(buffer);//将数据写到硬盘,保存成BMP格式图片file.flush();file.close();img=QImage("test.jpg");ui->label->setPixmap(QPixmap::fromImage(img));//在label中显示图片ui->label->resize(ui->label->pixmap()->size());}Widget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui->setupUi(this);timer=newQTimer(this);connect(timer,SIGNAL(timeout()),this,SLOT(slot_timer()));timer->start(33);//启动定时器,设置帧率capture=cv::VideoCapture(0);//打开摄像头,这里使用了固定的摄像头,随机的话为-1if(!capture.isOpened())qDebug()<<"failtoopen!";socket_fd=init_socket();//初始化套接字}intWidget::init_socket(){intsockfd;if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1){perror("Socketerror");exit(1);}bzero(&server_addr,sizeof(server_addr));server_addr.sin_family=AF_INET;server_addr.sin_port=htons(PORTNUMBER);server_addr.sin_addr.s_addr=inet_addr("");//主机IPreturnsockfd;}voidWidget::slot_timer(){capture>>frame;//将摄像头的每一帧放入frameif(frame.empty()){printf("frameisempty\n");return;}/*将opencv采集的BGR格式的图像转化成QT下的RGB格式的图像*/cv::cvtColor(frame,frame,CV_BGR2RGB);img=QImage((unsignedconstchar*)frame.data,frame.cols,frame.rows,QImage::Format_RGB888);QFilefile("test.jpg");QByteArraybuffer=file.readAll();if(sendto(socket_fd,buffer.data(),buffer.size(),0,(structsockaddr*)(&server_addr),sizeof(structsockaddr_in))<0){printf("sendfail%d\n",buffer.size());perror("sendtoerror");}file.close();}

6软件测试6.1测试项目在MIS开发过程中采用了多种措施保证软件质量,但是实际开发过程中还是不可避免地会产生差错,系统中通常可能隐藏着错误和缺陷,不经周密测试的系统投入运行,将会造成难以想象的后果,因此系统测试是MIS开发过程中为保证软件质量必须进行的工作。大量统计资料表明,系统测试的工作量往往占MIS开发总工作量的40%以上。因此,我们必须重视测试工作。由于程序中隐藏的缺陷只在特定的环境下才有可靠显露,系统缺陷通常是由于对某些特定情况考虑不周造成的。因此测试不是为了表明程序正确;成功的测试也不是没有发现错误的测试。有意义的软件测试应该是从“破坏”软件系统的角度出发,精心设计最有可以暴露程序系统缺陷的测试方案。因此软件测试的目标应该是以尽可能少的代价和时间找出软件系统中潜在的错误和缺陷。从产品角度看,测试计划中的测试项目包括软件结构中的分系统层、子系统层、功能模块层、程序模块层中的各类模块,从测试本身看,分为单元测试,组合测试,确认测试等。测试对象是随不同阶段而异的,最基本、最初的测试是单元测试,后面的组合测试、确认测试都是以被测过的模块作为测试对象的。1.单元测试:单元测试也称模块测试或程序测试,单元测试是对每个模块单独进行的,验证模块接口与设计说明书是否一致,对模块的所有主要处理路径进行测试且与预期的结构进行对照,还要对所有错误处理路径进行测试。对源码进行审查,对照设计说明书,表态地检查源程序是否符合功能的逻辑要求,是进行单元测试前的重要工作工。单元测试一般是由程序员完成,也称程序调试。2.组合测试组合测试也称集成测试或子系统测试,通常采用自顶向下测试和自底向上测试两种测试方法。组合测试的对象是指已经通过单元测试的模块,不是对零散模块进行单个测试,而是用系统化的方法装配和测试软件系统,是一个严格的过程,必须认真地进行,其计划的产生和单元模块测试的完成日期要协调起来,这种测试应在系统目标机上进行,造成系统应用的环境条件,除了开发部分项目负责人参加以外,还应该有相应系统的用户参加,给评审员进行演示。3.确认测试确认测试是对通过组合测试的软件进行的,这些软件已经存于系统目标设备的介质上,确认测试的目的是表明软件是可以工作的,并且符合“软件需求说明书”中规定的全部功能和性能要求。确认测试是按照这些要求定出的“确认测试计划”进行的。测试工作是由一个独立的组织进行,而且测试要从用户的角度出发。4.系统测试系统测试是对整体性能的测试,主要解决各子系统之间的数据通信和数据共享问题以及检测系统是否达到用户的实际要求,系统测试的依据是系统分析报告。系统测试应在系统的整个范围内进行,这种测试不只对软件进行,而是对构成系统的硬、软件一起进行。系统测试与建构同时进行或略慢。系统测试需要确认从头到尾的功能正常才算完成,应当尽量避免系统测试延到项目末尾进行。5.用户验收测试在系统测试完成后,进行用户的验收测试,它是用户在实际应用环境中所进行的真实数据测试。在具体的测试中,一般应遵循以下原则:由程序设计者之外的人进行测试;测试用例应由两部分组成:输入数据和预期输出结果;应选用不合理的输入数据与非法输入测试;不仅要检验程序是否实现预期功能,还应检查程序是否做了不应该做的工作;集中测试容易出错的程序模块;对程序修改以后,必须重新进行测试。6.2测试方法一般来说,对程序测试有两种测试方法:如果已经知道了软件系统应具有的功能,可通过测试来对每个功能是否都能正常使用;如果知道程序的内部工作过程,可以通过测试来检测程序内部是否按照规格说明书的规定正常进行。前一种方法称为黑盒测试,后一种方法称为白盒子测试。黑盒测试又称为功能测试,白盒子测试又称为结构测试。经过对系统的软件验收测试系统满足用户的要求。首先对软件的功能进行测试,然后进行了全系统的72小时连续运行测试,系统稳定性强。功能测试可以发生在单元测试中也可以在集成测试、系统测试中进行,软件功能是最基本的,需要在各个层次保证功能的执行的正确性。在单元功能测试中,其目的是保证所测试的每个独立模块的功能是正确的,主要是从输入条件和输出结果来判断是否满足程序的设计要求。所进行的系统功能测试,不仅要考虑模块之间的相互作用,而且要考虑系统的应用环境,其衡量标准是实现产品的功能,特别需要模拟用户完成从头到尾(end-to-end,端对端)的测试,确保系统可以完成事先设计的功能,满足用户的真正需求。如表1所示:表6.1功能测试表6.3聊天测试测试方案正常发送数据时,界面是可以显示的,所以测试发送空数据时,界面是否有处理。测试结果界面显示(1)错误警告如图6-1所示:图6-1发送数据错误处理界面正常显示如图6-2所示:图6-2正常发送数据界面6.4视频聊天测试测试方案打开视频功能,看是否有图像。测试结果界面显示如图6-3所示:图6-3正常视频界面6.5字体改变测试测试方案点击字体设置按钮,改变字体,查看字体是否改变。测试结果界面显示如图6-4所示:图6-4字体改变正常界面6.6文件传送测试测试文件是否可以传送文件,并查看文件是否传送成功。传送界面如图6-5所示: 图6-5发送数据操作界面当接收人确认接收后开始接收文件,接收界面如图6-6所示:图6-6接受数据操作界面传送文件“北极星的眼泪.mp3”成功。6.7多平台聊天测试测试方案分别在不同的平台下,如Linux和Windows下测试平台是否能够正常聊天和发送接收文件。测试界面如图6-7所示:图6-7在linux下运行7总结随着科技的发展,嵌入式设备将遍布我们生活中的各处。而在嵌入式界面开发的工具中,首推QT,QT自1995年开始,至今已经有十几年的历史,它的技术成熟,并在嵌入式中应用广泛。我的课题就是应用QT进行开发的。本软件实现了在局域网内的聊天通信和文件传输。不仅操作简单,界面优美,而且使用性很强。在开发该软件时,我遇到了三个难题,第一个是以前没有接触过QT,对其并不是太了解;第二个是通信的网络协议不是很熟悉;第三个是界面到底要设计成什么形式。针对这三个问题,我查找许多资料,最终顺利解决。首先,我利用三个星期的时间,从最基础的QT编程,一步一步学习在QT下进行开发,到现在,我虽然不能说很精通QT,但至少我能够很熟练的运用QT进行开发。、其次,我查找以前网络老师教我们的通信编程,并与QT下进行对照,最终顺利解决了如何在QT下进行通信编程。通过这次开发,我了解到不管在那种开发软件下进行通信编程,通信编程的流程始终不会改变。最后,界面开发中,我参考网上别人的界面,和QQ聊天软件的界面,加入自己的想法,并且添加各种图片,最终将界面做的十分优美。虽然这个软件不能说是十分完美,也还有许多可以修改的地方,随着以后的修改,我发现只要学习就会有更多的问题,有更多的难点,但也会有更多的收获。

参考文献[1] 宋冲亚,李爱菊.QT局域网聊天项目制作[J].北京联合大学,2012[2] 郭晖,陈光.基于OpenCV的视频图像处理应用研究[J].微型机与应用,2010[3] 陈少祥,李临生.嵌入式LINUX视频采集系统设计与研究[J].太原科技大学,2013[4]施政.多人视频聊天系统中的视频压缩算法与研究[J].中国传媒科技,2005[5]解鹏.基于LINUX的网络视频监控系统设计[D].太原理工大学,2012[6]白常青,陈沛.嵌入式终端基于LINUXV4L2的图像采集系统[J].科技资讯,2012[7]成波.基于LINUX的网络聊天软件的设计[D].内蒙古职业建筑技术学院信息网络中心,2012[8]刘冬.基于Qt4和OpenCV的嵌入式视频监控系统[J].现代电子技术,2013[9]JasminBlanchette,MarkSummerfield.C++GUIProgrammingwithQt3[M].PrenticeHallinassociationwithTrolltechPress,2004[10]K.L.EddieLaw,RoyLeung.ADesignandImplementationofActiveNetworkSocketProgramming[M].theEdwardS.RogersSr.DepartmentofElectricalandComputerEngineeringUniversityofToronto,2004[11]JasminBlanchette,MarkSummerfield.C++GUIProgrammingwithQt4[M].PrenticeHall,2006 致谢在本论文的写作过程中,我的导师罗成果、张辉老师倾注了大量的心血,从选题到开题报告,从写作提纲,到一遍又一遍地指出每稿中的具体问题,严格把关,循循善诱,在此我表示衷心感谢。同时我还要感谢在我学习期间给我极大关心和支持的各位老师以及关心我的同学和朋友。感谢各位专家的批评指导。附录一:英文原文CreatingGraphics/ViewWindowsByreimplementingacustomQWidgetsubclass’spaintEvent()andusingaQPainter,wecandrawanythingwewant.Thisisidealforcustomwidgets,butisnotatallconvenientifwewanttodrawlotsofindividualitems,especiallyifwewanttoprovidetheuserwiththeabilitytointeractwiththeitems.Forexample,inthepastsomeusershavecreatedgraphicalapplicationsusingliterallythousandsofcustomwidgetstostandasgraphicalitems,andalthoughwidgetpaintingisveryfast,handlingasinglemouseclickinsuchsituationscouldeasilyconsumealmostthewholeCPU’sprocessingcapability.Fortunately,Qt4.2introducedthegraphics/viewarchitecturewhichperfectlyfulfillstheneedforhigh-performanceitem-baseddrawingandinteraction.AlthoughoriginallydesignedasasuperiorreplacementforQt3’sQCanvasclass,Qt4’sgraphics/viewarchitecturehasgonefarbeyondthecanvas’sfunctionality.Infact,someapplicationsnowuseaQGraphicsViewastheirmainwindow’scentralwidgetandplaceallthewidgetsusedtoprovidetheuserinterfaceinsidetheviewasgraphicsitemsintheirownright.Inthischapter’sfirstsectionwebeginwithabriefoverviewofthegraphics/viewarchitecture,includingasidebaronsomesignificantchangesintroducedinQt4.6.Then,inthesecondsection,wewillreviewanapplicationwhosemainwindow’scentralwidgetisaQGraphicsViewandwhichhasbothwidgetitemsandconventionalgraphicsitems.Andfinally,inthechapter’sthirdsection,wewilllookatasimpleQGraphicsItemsubclassandtheQGraphicsI

温馨提示

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

评论

0/150

提交评论