讲稿(嵌入式设计与实现)



《讲稿(嵌入式设计与实现)》由会员分享,可在线阅读,更多相关《讲稿(嵌入式设计与实现)(26页珍藏版)》请在装配图网上搜索。
1、 目 录 第1章 嵌入式硬件开发环境 2 1.1 嵌入式系统的概念 2 1.2 熟悉OURS PXA270RP实验箱的硬件环境 2 第2章 Linux常用命令 2 第3章 搭建嵌入式Linux开发环境 4 3.1 vwaretools的安装与共享设置 4 3.2 tslib-1.4的编译安装 4 3.3 qtX11和qtE4的编译安装 5 3.4 PATH与LD_LIBRARY_PATH的设置 6 3.5 配置交叉编译器 6 3.6 配置minicom、tftp和NFS 7 第4章bootloader、Linux内核及文件系统制作与移植 12 4.1 boo
2、tloader 12 4.2 Linux内核编译与移植 12 4.3文件系统制作与移植 13 第5章 Qt图形编程 14 5.1 嵌入式GUI简介 14 5.2 Qt/Embedded开发入门 14 5.2.1 Qt/Embedded介绍 14 5.2.2 Qt/Embedded图形界面 15 5.2.3 Qt/Embedded信号和槽机制 17 5.2.4 Qt/Embedded网络编程 18 第6章 聊天系统设计与实现 18 6.1 聊天软件需求分析 18 6.2 界面设计 18 6.3 网络相关部分的实现 18 6.4 项目运行 24 第7章 系统移植与调
3、试 24 第1章 嵌入式硬件开发环境 1.1 嵌入式系统的概念 以应用为中心,以计算机技术为基础、软硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。开发机称为宿主机,应用机称为目标机。 1.2 熟悉OURS PXA270RP实验箱的硬件环境 1、认识核心板和扩展板 2、认识nor flash、nand flash、sdram、ARM处理器 3、熟悉电源接口、并口、JTAG接口、串口、网口、USB接口 4、熟练掌握将PC机与开发实验箱的连接 第2章 Linux常用命令 Shell与用户间的关系如图 2.1 所示。用户在提示符下输入的命
4、令都由Shell 先解释然后传给 Linux 内核。 图 2.1 内核、Shell 和用户的关系 小知识:命令的使用可以通过man 命令名或命令名 -–help的方式获得帮助。 1、ls: 列出目录的内容,常用参数有-l(长文件名显示格式)和-a(显示所有文件), 显示格式为: 文件类型与权限 链接数 文件属主 文件属组 文件大小 修改的时间 名字 2、find: 在指定目录中搜索文件,常用参数为-name,如find /usr/qpe/pic/ -name *.png 3、cd: 改变工作目录。可使用“cd –”回到前次工作目录。“./”代表当前目录,“../”代表上
5、级目录。 4、mkdir: 创建一个目录,可以一次建立多个目录,常用参数有-p(自动创建指定路径中不存在的目录),如mkdir /home/lny/myfile 5、rm: 删除一个目录中的一个或多个文件或目录,常用参数-f(删除已存在的目标文件而不提示),-i(在覆盖目标文件前要求用户确认),-r(递归地删除该目录及其子目录下的所有内容) 6、cp: 将给出的文件或目录复制到另一文件或目录中,常用参数有-a(保留链接、文件属性、并复制其子目录),-f(同rm),-i(同rm) 7、mv: 为文件或目录改名或将文件由一个目录移入另一个目录中,常用参数-f(同rm),-i(同rm) 8
6、、ln: 为某一个文件在另外一个位置建立一个符号链接,常用参数-s(建立符号链接),如在当前目录下创建/usr/qpe/lib/fonts的软链接可以用命令 ln -s /usr/qpe/lib/fonts/ ./fonts 9、fdisk: 可以查看硬盘分区情况,并可对硬盘进行分区管理,如fdisk -l 10、mount:磁盘挂载命令。如挂载根目录mount –o soft,timeo=100,rsize=1024 192.168.0.100:/ /mnt; 挂载U盘mount –t vfat /dev/sdb1 /mnt/usb 挂载windows目录为mount -o u
7、sername=administrator,password=pldy123,iocharset=utf8 //172.21.28.71/c /mnt/c 若想设置在开机时自动挂载,可在文件“/etc/fstab”中加入相应的设置行即可。 11、echo: 显示字符串 12、export: 设置新的环境变量,如export QTDIR=/usr/local/Trolltech/Qt-4.4.3 export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH 13、chmod: 改变文件的访问权限. 文件的访问权限可表示成:- rwx rwx
8、 rwx。在此设有三种不同的访问权限:读(r)、写(w)和运行(x);三个不同的用户级别:文件拥有者(u)、所属的用户组(g)和系统里的其他用户(o)。可增加一个用户级别 a(all)来表示所有这三个不同的用户级别。 ① 对于第一种符号连接方式的 chmod 命令中,用加号“+”代表增加权限,用减号“−”删除权限,等于号“=”设置权限,如chmod a+rx,u+w /home/lny/myfile ② 对于第二种八进制数指定的方式,将文件权限字符代表的有效位设为“1”,即“rw-”、“rw-”和“r--”的八进制表示为“110”、“110”、“100”,把这个 2 进制串转换成对应的
9、8 进制数就是 6、6、4,也就是说该文件的权限为 664(三位八进制数),如chmod 765 /home/lny/myfile 14、tar: 对文件目录进行打包或解包,常用参数有-c(建立新的打包文件),-f(对普通文件操作),-x(从打包文件中解出文件),-v(处理过程中输出相关信息),-z(调用gzip来压缩打包文件,与-x联用时调用gzip完成解压缩),-j(调用bzip2来压缩打包文件,与-x联用时调用bzip2完成解压缩)。如tar -zcvf lny.tar.gz /home/lny; tar -jxvf linux-2.6.11.tar.bz2 第3章 搭建嵌入式Lin
10、ux开发环境 3.1 vwaretools的安装与共享设置 1、安装VMware tools,以方便鼠标内外移动(确保“虚拟化”不选),步骤如下: VM菜单 →VMware tools install →“是” →将光驱(linux中的光驱)的VMware tools 中的Vmwaretools-6.0.2-59824.tar.gz复制到目录root下 →在终端对Vmwaretools-6.0.2-59824.tar.gz进行解压tar –zxvf Vmwaretools-6.0.2-59824.tar.gz →cd vmware-tools-distrib →./vmw
11、are-install.pl(全部选yes,注意有一个默认为[no]的选项改为yes) 2、设置windows与linux相互共享: Windows下访问linux的内容: 确保网线正确连接; 确保网络端口激活(系统→管理→网络→设置静态IP并激活); 确保samba服务安装并启动(系统→管理→服务器设置→services中勾选smb选项); 添加samba用户(必须是存在的用户,如果冲突,则注释/etc/samba/smbusers中对应的用户名)(“首选项”→samba用户→添加用户); 添加共享(选择共享目录和设置共享对象权限等)。 通过\\192.168.11.7即“
12、\\虚拟机ip”的形式访问。 3、Linux下访问windows的内容: 确保安装时没有选择“虚拟化”选项; 菜单VM →settings →options →shared folds →add。 在linux系统下通过/mnt/hgfs目录访问windows中共享文件夹。 3.2 tslib-1.4的编译安装 假设源码解压目录为: /home/tslib-1.4 1、cd /home/tslib-1.4 ./autogen.sh //生成congigure 2、./configure --host=arm-linux --cache-file=arm
13、-linux.cache//加上参数--prefix=/home/tslib-1.4可以看到头文件 3、make 出现错误:undefined reference 'rpl_malloc' 解决:将config.h.in中的 #undef malloc 行注释掉 重新执行make,OK! 4、make install 生成的库文件分别在目录./src、./plugins的.lib目录中,其中./lib为隐藏目录,src/.lib中包含libts-0.0.so.0.1.1,libts-0.0.so.0、libts.la、libts.lai、libts.so,plugins/.l
14、ib中包含ucb1x00.so、pthres.so、linear.so、input.so、variance.so、dejitter.so等,库文件版本为libts-0.0.so.0.1.1 5、拷贝 mkdir tslib-1.4 cd tslib-1.4 mkdir lib etc plugins include tests 目录lib:将src/.lib/中的libts-0.0.so.0,libts-0.0.so.0.1.1,libts.so拷到其中。 目录etc: 将etc/中的ts.conf拷到其中。//结合自己的触摸屏型号进行相应的修改 目录plugins: 将plug
15、ins/.libs/中的*.so拷到其中。//结合自己的触摸屏型号,删除部分库文件 目录tests: 将tests/中的ts_*拷到其中。//只需要保留ts_calibrate和ts_test 目录include:将src/tslib.h拷到其中。 6、测试 执行测试程序ts_calibrate时一直出现错误:ts_open:no such device 通过查找ts_calibrate.c发现,编译时如果没有加参数--enable-inputapi=no,则应将环境变量定义如下: export TSLIB_TSDEVICE=/dev/input/event0(出错时为TSLIB_
16、TSDEVICE=/dev/touchscreen/ucb1x00,因为我的触摸屏型号为 ucb1x00) export TSLIBDIR=/home/tslib-1.4 export TSLIB_CONFFILE=$TSLIBDIR/etc/ts.conf export TSLIB_PLUGINDIR=$TSLIBDIR/plugins export TSLIB_FBDEVICE=/dev/fb0 export TSLIB_CONSOLEDEVICE=none export POINTERCAL_FILE=/etc/pointercal //生成校准文件 export LD_
17、LIBRARY_PATH=$TSLIBDIR/lib export QWS_MOUSE_PROTO=TPanel:/dev/touchscreen/ucb1x00 export TSLIB_CALIBFILE=/etc/pointercal //应用校准文件 [ -f /etc/pointercal ] || /home/tslib-1.4/tests/ts_calibrate //检查是否存在校准文件 另外,还要注意的是,ts.conf内容如下: module_raw input #module_raw ucb1x00 //如果注释前一句而保留该句,则会出现意想不到的问题。 m
18、odule pthres pmin=1 module variance delta=30 module dejitter delta=100 module linear 执行ts_calibrate顺利通过。 3.3 qtX11和qtE4的编译安装 一、QT-X11环境的配置 1、解压qt-x11-4.4.3.tar.gz 2、cd 解压了的目录 QT-X11 3、 #./configure //生成Makefile #make //要好几个小时(约3个半小时) #make install //安装完后会生成目
19、录/usr/local/Trolltech/QT-4.4.3 ,这时刚才解压完得到的QT-X11可以不要了。 4、设置环境变量(实际上是设置编译环境): 在/etc/profile 加入: #for QT-X11-4.4.3 export QTDIR=/usr/local/Trolltech/Qt-4.4.3 export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH export PATH=$QTDIR/bin:$PATH export QMAKESPEC=$QTDIR/mkspecs/linux-g++ 5、#source
20、 /etc/profile 使环境变量生效,确保要用的编译器摆在首位,以屏蔽系统自带的编译器。 二、QT-embed环境的配置 1、把arm-linux-gcc版本:3.3.2 放目录/usr/local/arm并在环境变量PATH中指明 #export PATH=/usr/local/arm/3.3.2/bin:$PATH 2、解压qt-embedded-linux-4.4.3.tar.gz 得qt-embed 3、配置 支持触摸屏的参数配置: ./configure -release -shared -fast -no-largefile -qt-sql-sql
21、ite -no-qt3support -no-xmlpatterns -no-mmx -no-3dnow -no-sse -no-sse2 -no-svg -no-webkit -qt-zlib -qt-gif -qt-libtiff -qt-libpng -qt-libmng -qt-libjpeg -make libs -nomake tools -nomake examples -nomake docs -nomake demo -no-nis -no-cups -no-iconv -no-dbus -no-openssl -xplatform qws/linux-a
22、rm-g++ -embedded arm -little-endian -qt-freetype -depths 16,18 -qt-gfx-linuxfb -no-gfx-transformed -no-gfx-multiscreen -no-gfx-vnc -no-gfx-qvfb -qt-kbd-usb -no-glib -qt-mouse-tslib -I/home/tslib-1.4/include -L/home/tslib-1.4/lib 4、#make 5、#make install 3.4 PATH与LD_LIBRARY_PATH的设置 参考3.3节内容
23、。 3.5 配置交叉编译器 修改/etc/profile,在有“pathmunge”命令语句处加上如下命令语句: Pathmunge /usr/local/arm-linux/bin 3.6 配置minicom、tftp和NFS 1、配置minicom 开发板上的信息显示给开发人员最常用的就是通过串口线输出到宿主机的显示器上,这样,开发人员就可以看到系统的运行情况了。Minicom 是 Linux 下串口通信的软件,它的使用完全依靠键盘的操作,虽然没有“超级终端”那么易用,但是使用习惯之后读者将会体会到它的高效与便利。下面主要讲解如何对Minicom 进行串口参数的配置。 首先在
24、命令行中键入“minicom”,这就启动了 minicom 软件。Minicom 在启动时默认会进行初始化配置,如图 3.1 所示。 图 3.1 minicom 启动 注意 在 Minicom 的使用中,经常会遇到三个键的操作,如“CTRL-A Z”,这表示先同时按下 CTRL和“A”(大写),然后松开此二键再按下“Z”。 正如图 3.1 中的提示,接下来可键入 CTRL+A Z,来查看 minicom 的帮助,如图 3.2所示。按照帮助所示,可键入“O”(代表 Configure Minicom)来配置 minicom 的串口参数,当然也可以直接键入“CTRL-A O”
25、来进行配置,如图 3.3 所示。 图3.2 minicom 帮助 图 3.3 minicom 配置界面 在这个配置框中选择“Serial port setup”子项,进入如图 3.4 所示配置界面。上面列出的配置是 minicom 启动是的默认配置,用户可以通过键入每一项前的大写字母,分别对每一项进行更改。图 3.5 所示为在“Change which setting 中”键入了“A”,此时光标转移到第 A 项的对应处。 注意 在 minicom 中“ttyS0”对应“COM1”,“ttyS1”对应“COM2”。 图3.4 minicom 串口属性配置界面
26、 图 3.5 minicom 串口号配置 接下来,要对波特率、数据位和停止位进行配置,键入“E”,进入如图 3.6 所示的配置界面。 在该配置界面中,可以键入相应波特率、停止位等对应的字母,即可实现配置,配置完成后按回车键就退出了该配置界面,在上层界面中显示如图 3.7 所示配置信息,要注意与图3.4 进行对比,确定相应参数是否已被重新配置。 图 3.6 minicom 波特率等配置界面 图 3.7 minicom 配置完成后界面 到此为止,读者已经能将开发板的系统情况通过串口打印到宿主机上了,这样,就能很好地了解硬件的运行状况。 小知识 通过串
27、口打印信息是一个很常见的手段,很多其他情况如路由器等也是通过配置串口的波特率这些参数来显示对应信息的。 2、tftp tftp 协议是简单文件传输协议,它可以看作是一个 FTP 协议的简化版本,与 FTP 协议相比,它的最大区别在于没有用户管理的功能。它的传输速度快,可以通过防火墙,使用方便快捷,因此在嵌入式的文件传输中广泛使用。 tftp 分为客户端和服务器端两种。通常,首先在宿主机上开启 tftp 服务器端服务,设置好 tftp 的根目录内容(也就是供客户端下载的文件),接着,在目标板上开启 tftp的客户端程序(现在很多开发板都已经提供了该项功能)。这样,把目标板和宿主机用直连线相
28、连之后,就可以通过 tftp 协议传输可执行文件了。 Linux 下 tftp 的服务器服务是由 xinetd 所设定的,默认情况下是处于关闭状态。首先,要修改 tftp 的配置文件,开启 tftp 服务,如下所示: [root@ateng tftpboot]# vi /etc/xinetd.d/tftp # default: off # description: The tftp server serves files using the trivial file transfer \ # protocol. The tftp protocol is oft
29、en used to boot diskless \ # workstations, download configuration files to network-aware printers, \ # and to start the installation process for some operating systems. service tftp { socket_type = dgram protocol = udp wait
30、 = yes user = root server = /usr/sbin/in.tftpd server_args = -s /tftpboot disable = no per_source = 11 cps = 100 2 flags = IPv4 } 在这里,主要要将
31、“disable=yes”改为“no”,另外,从“server_args”可以看出,tftp服务器端的默认根目录为“/tftpboot”,用户若需要可以更改为其他目录。接下来,重启 xinetd 服务,使刚才的更改生效,如下所示: [root@ateng tftpboot]# service xinetd restart 关闭 xinetd: [ 确定 ] 启动 xinetd: [ 确定 ] 接着,使用命
32、令“netstat -au”以确认 tftp 服务是否已经开启,如下所示: [root@ateng tftpboot]# netstat -au Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State udp 0 0 *:32768 *:* udp 0 0 *:831
33、 *:* udp 0 0 *:tftp *:* udp 0 0 *:sunrpc *:* udp 0 0 *:ipp *:* 这时,用户就可以把所需要的传输文件放到“/tftpboot”目录下,这样,主机上的 tftp 服务就可以建立起来了。 接下来,用直连线(注意:不可以使用网线)把目标板和宿主机连起来,并且将其配置成一个网段的地址,再在目标板上启动 tftp 客户端程序(注意:不同的开发板
34、所使用的命令可能会不同,读者可以查看帮助来获得确切的命令名及格式),如下所示: =>tftpboot 0x30200000 zImage TFTP from server 192.168.1.1; our IP address is 192.168.1.100 Filename 'zImage'. Load address: 0x30200000 Loading: ################################################################# #################################
35、############################## ############################################# done Bytes transferred = 881988 (d7544 hex) 可以看到,此处目标板使用的 IP 为“192.168.1.100”,宿主机使用的 IP 为“192.168.1.1”,下载到目标板的地址为 0x30200000,文件名为“zImage”。 小知识 tftp 是一个很好的文件传输协议,它的简单易用吸引了广大用户。但它同时也存在着较大的安全隐患。由于 tftp 不需要用
36、户的身份认证,因此给了黑客的可乘之机。因此在使用 tftp 时一定要设置一个单独的目录作为 tftp 服务的根目录,如上文所述的“/tftpboot”等。 3、NFS 在/etc/exports中加入语句: / 192.168.0.* (rw,inscure,no_root_squash,no_all_squash) 第4章bootloader、Linux内核及文件系统制作与移植 4.1 bootloader 1、编译 cd /pxa270_linux/blob_ours/blob-xscale make –f Makefile.cvs ./configure –host=
37、arm-linux –with-board=mainstone –with-linux-prefix=/pxa270_linux/linux/ --enable-xli –enable-network make(保存在/pxa270_linux/blob_ours/blob-xscale/src/blob下) 2、移植(确保开发板上电) cd /pxa270_linux/tools ./Jflashmm-linux PXA270 blob p(该命令是寻找PXA270.dat文件所指定的CPU,把blob文件烧写到这个CPU使用的flash中,要求blob,PXA270.dat与Jfl
38、ashmm-linux在同一个文件夹中,.dat文件不可以加后缀。 4.2 Linux内核编译与移植 1、编译 内核的编译根据不同的情况会有不同的步骤,但其中最主要分别为3 个步骤:内核配置、建立依存关系、建立内核,其他的为一些辅助功能,如清除文件等。 (1)内核配置 cd /pxa270_linux/linux make menuconfig (菜单式配制) 在menuconfig 的配置界面是图形化的内核裁减界面。通过此部分,读者可以方便地选择,决定哪些部分被加载并编译入Linux内核,哪些部分被编译为模块,哪些部分不用,如图 4.1 所示。“Load an Alterna
39、te Configuration File”选项表示装载一个已经保存好的设置。也可以选择“Save Configuration to an Alternate File”选项保存自己的配置文件。 图 4.1 make menuconfig 配置界面 此外,要注意 2.6 和 2.4 内核在串口命名上的一个重要区别,在 2.4 内核中“COM1”对应的是“ttyS0”,而在 2.6 内核中“COM1”对应“ttySAC0”,因此在启动参数的子项要格外注意,如图4.3 所示,否则串口打印不出信息。 (2)建立依赖关系 make dep 由于内核源码树中的大多数文件都与一些头文件有依
40、赖关系,因此要顺利建立内核,内核源码树中的每个 Makefile 就必须知道这些依赖关系。建立依赖关系往往发生在第一次编译内核的时候,它会在内核源码树中每个子目录产生一个“.depend”文件。 (3)建立内核 make clean make zImage 这里建立的为压缩的内核映像,名为zImage,位于/pxa270_linux/linux/arch/arm/boot目录中。 2、移植 cp zImage /tftpboot –rf (虚拟机终端) 以下命令在minicom中完成: blob>tftp zImage –kernel (下载到内存0xa0008000处) b
41、lob>fwrite 0xa0008000 0x00040000 0x00200000 表示从内存0xa0008000处取出长度为0x00200000的数据,写入flash中0x00040000开始的地址中。 4.3文件系统制作与移植 1、制作文件系统: cd /pxa270_linux/fs ./mkfs.jffs2 –r rootfs270 –o xscale_fs.jffs2 –e 0x40000 –pad=0x01000000(根文件系统) ./mkfs.jffs2 –r junk –o junk.jffs2 –e 0x40000 –pad=0x0dc0000(扩展文件系统
42、) 其中,-r后面是指令要做成image的文件夹,默认为当前文件夹;-o后面是指令输出的文件名,-e表擦除块的大小,默认为64KB,--pad表输出文件的大小,为了不浪费flash空间,这个值最好符合flash driver所规划的区块大小,如果不足,则使用0xff来填充补满。 2、文件系统移植: cp xscale_fs.jffs2 /tftpboot –rf (虚拟机终端) cp junk.jffs2 /tftpboot –rf (虚拟机终端) 以下命令在minicom中完成: blob>tftp xscale_fs.jffs2 blob>fwrite 0xa1000000
43、0x00240000 0x01000000 blob>tftp junk .jffs2 blob>fwrite 0xa1000000 0x01240000 0x0dc0000 表示从内存0xa1000000处取出长度为0x0dc0000的数据,写入flash中0x01240000开始的地址中。 第5章 Qt图形编程 5.1 嵌入式GUI简介 GUI( 图形用户界面)是指计算机与其使用者之间的对话接口,它的存在为使用者提供了友好便利的界面,并大大方便了非专业用户的使用,使得人们从烦琐的命令中解脱出来,可以通过窗口、菜单方便地进行操作。 Qt/Embedded是Trolltec
44、h(奇趣)公司为嵌入式系统开发的Qt版本。从Qt 4.1版本开始,Qt/Embedded改名为Qtopia Core,又从Qt 4.4.1版本开始,又改名为Qt for Embedded Linux。其优点是: 1、以开发包的形式提供,包括了图形设计器、Makefile制作工具、字体国际化工具、Qt的C++类库等。 2、支持跨平台(如Microsoft Windows、MacOS X、Linux、Solaris等)。 3、类库支持跨平台(封装了适应不同操作系统的访问细节)。 4、模块化,可任意裁减(最小可裁减到几百KB,但这时已基本失去了使用价值)。 缺点是:结构过于复杂臃肿,很难进
45、行底层的扩充、定制和移植。 5.2 Qt/Embedded开发入门 5.2.1 Qt/Embedded介绍 1、架构如下图所示。 应用程序源代码 Qt API Qt/Embedded Qt/X11 Qt/XLib X Windows Server 帧缓冲 Linux内核 Qt/Embedded与Qt/X11的Linux版本的比较 2、Qt的开发环境 Qt桌面版本:Qt/X11或Qt/Windows,结合大家熟知的Visual C++或Borland C++就可以进行开发了。` 3、Qt的支撑工具 Qmake和Qt designer(图形设计器) 5.2.
46、2 Qt/Embedded图形界面 Qt提供了一整套的窗口部件,它们组合起来可用于创建用户界面的可视元素。窗口部件是QWidget或其子类的实例,用户自定义的窗口通过子类化得到,如下图所示。 QObject QTimer QWidget QDialog QFrame QSpinBox QLabel QLineEdit 对于初学者来说,使用designer工具设计程序界面非常方便快捷,如秒表程序stopwatch的界面文件digclock.ui效果如下图所示。 播放器程序mediaplayer界面文件videoface.ui效果如下图所示。 对应的
47、.h文件代码自动生成,但比较复杂,为了熟悉代码,完全可以用代码的形式生成用户界面,如通讯录程序addressbook中的部分代码如下:
addressBook::addressBook(QWidget *parent)
{
setWindowTitle(tr("this is addressbook."));
setFixedSize(lcdWidth,lcdHeight);
contacts=new QMap
48、utton(tr("cancel")); findBt=new QPushButton(tr("find")); contactName=new QLabel(tr("name")); contactTele=new QLabel(tr("telephone")); nameDetail=new QLineEdit; teleNo=new QTextEdit ; QHBoxLayout *hlayout=new QHBoxLayout; hlayout->addWidget(saveBt,Qt::AlignCenter); hlayout->ad
49、dWidget(cancelBt,Qt::AlignJustify); hlayout->addWidget(findBt,Qt::AlignCenter); QGridLayout *layout=new QGridLayout; layout->addWidget(contactName,0,0,Qt::AlignRight); layout->addWidget(nameDetail,0,1); layout->addWidget(contactTele,1,0,Qt::AlignTop); layout->addWidget(teleNo,1,1,Qt
50、::AlignLeft); layout->addLayout(hlayout,2,1); setLayout(layout); connect(saveBt,SIGNAL(clicked()),this,SLOT(saveInform())); connect(cancelBt,SIGNAL(clicked()),this,SLOT(cancelInform())); connect(findBt,SIGNAL(clicked()),this,SLOT(findName())); } 5.2.3 Qt/Embedded信号和槽机制 1、机制概述 信号(sig
51、nals)和槽机制是Qt的核心机制,是Qt自行定义的一种通信机制,独立于标准的C/C++语言。所有从QObject或其子类(如QWidget)派生的类都能够包含信号和槽。当对象改变状态时,信号就由该对象发射(Emit)出去了,它不知道另一端是是谁在接收这个信号。槽函数用于接收信号,它们是普通的对象成员函数,一个槽函数并不知道是否有任何信号与自己相连接。 对象间信号与插槽的关系 用户可以将多个信号与单个槽函数连接,也可以将单个信号与多个槽函数连接,甚至将一个信号与另外一个信号相连接。其间的关系如下图所示。 对象2 信号1 槽1 槽2 对象1 信号1 信号2
52、 对象3 槽1 槽2 2、信号与插槽实现 信号的定义: signals: void mySignal(); void mySignal(int x); void mySignalParam(int x,int y); 槽函数的定义: public slots: void mySlot(); void mySlot(int x); void mySlotParam(int x,int y); 信号与插槽关联(通过QObject对象的connect()函数实现) QLabel *label=new QLabel; QSc
53、rollBar *scroll=new QScrollBar; QObject::connect(scroll,SIGNAL(valueChanged(int)),label,SLOT(setNum(int))); 5.2.4 Qt/Embedded网络编程 QTcpSocket和QTcpServer类,具体查看Qt的帮助文档。 第6章 聊天系统设计与实现 6.1 聊天系统需求分析 1、使用对象:09计嵌。 2、系统说明:以宿舍为单位,主界面中的成员为全班同学,聊天包括私聊、群聊(信息仅限于本宿成员)和广播(全班同学都能看到);ID为各自的学号,禁止非本班同学登录。 3、功能分
54、析:注册、登录、下线、加入群、退出群、添加和修改个人信息、聊天、提供对用户信息和聊天信息的保存等。 6.2 界面设计 服务器端创建聊天室 客户端登录界面 6.3 网络相关部分的实现 服务器端程序部分代码: TcpServer::TcpServer(QWidget *parent,Qt::WindowFlags f) :QDialog(parent,f) { setWindowTitle(tr("TCP Server")); QVBoxLayout *vbMain=new QVBoxLayout(t
55、his); ListWidgetContent=new QListWidget(this); vbMain->addWidget(ListWidgetContent); QHBoxLayout *hb=new QHBoxLayout(); LabelPort=new QLabel(this); LabelPort->setText(tr("Port")); hb->addWidget(LabelPort); LineEditPort=new QLineEdit(this); hb->addWidget(LineEditPort); vbMain->addLa
56、yout(hb); PushButtonCreate=new QPushButton(this); PushButtonCreate->setText(tr("create")); vbMain->addWidget(PushButtonCreate); connect(PushButtonCreate,SIGNAL(clicked()),this,SLOT(slotCreateServer())); port=8010; LineEditPort->setText(QString::number(port)); } TcpServer::~TcpServer(
57、) { } void TcpServer::slotCreateServer() { server=new Server(this,port); connect(server,SIGNAL(updateServer(QString,int)), this,SLOT(updateServer(QString,int))); PushButtonCreate->setEnabled(false); } void TcpServer::updateServer(QString msg,int length) { ListWidgetContent->addIt
58、em(msg.left(length)); } TcpClientSocket::TcpClientSocket(QObject *parent) { connect(this,SIGNAL(readyRead()),this,SLOT(dataReceived())); connect(this,SIGNAL(disconnected()),this,SLOT(slotDisconnected())); } void TcpClientSocket::dataReceived() { while(bytesAvailable()>0) { char
59、buf[1024]; int length=bytesAvailable(); read(buf,length); QString msg=buf; emit updateClients(msg,length); } } TcpClientSocket::~TcpClientSocket() { } void TcpClientSocket::slotDisconnected() { this->close(); emit disconnected(this->socketDescriptor()); } Server::Serv
60、er(QObject *parent,int port) :QTcpServer(parent) { listen(QHostAddress::Any,port); } void Server::incomingConnection(int socketDescriptor) { TcpClientSocket *tcpClientSocket=new TcpClientSocket(this); connect(tcpClientSocket,SIGNAL(updateClients(QString,int)), this,SLOT(updateClient
61、s(QString,int))); connect(tcpClientSocket,SIGNAL(disconnected(int)), this,SLOT(slotDisconnected(int))); tcpClientSocket->setSocketDescriptor(socketDescriptor); tcpClientSocketList.append(tcpClientSocket); } void Server::updateClients(QString msg,int length) { emit updateServer(msg,le
62、ngth);
for(int i=0;i 63、em=tcpClientSocketList.at(i);
if(item->socketDescriptor()==descriptor)
{
tcpClientSocketList.removeAt(i);
return;
}
}
return;
}
客户端程序部分代码:
TcpClient::TcpClient(QDialog *parent,Qt::WindowFlags f)
:QDialog(parent,f),status(false),port(8010)
{
setWindowTitle(tr("TCP client 64、"));
ListWidgetContent=new QListWidget;
LineEditMsg=new QLineEdit;
PushButtonSend=new QPushButton(tr("send"));
PushButtonSend->setEnabled(false);
QHBoxLayout *msgLayout=new QHBoxLayout;
msgLayout->addWidget(LineEditMsg);
msgLayout->addWidget(PushButtonSend);
QHBoxLayout *use 65、rLayout=new QHBoxLayout;
userNameLabel=new QLabel(tr("user name:"));
LineEditUser=new QLineEdit;
userLayout->addWidget(userNameLabel);
userLayout->addWidget(LineEditUser);
QHBoxLayout *serverIPLayout=new QHBoxLayout;
serverIPLabel=new QLabel(tr("server IP:"));
LineEditServerIP=new Q 66、LineEdit;
serverIPLayout->addWidget(serverIPLabel);
serverIPLayout->addWidget(LineEditServerIP);
QHBoxLayout *portLayout=new QHBoxLayout;
portLabel=new QLabel(tr("port Num:"));
LineEditPort=new QLineEdit;
LineEditPort->setText(QString::number(port));
portLayout->addWidget(portLabel);
portLayout->addWidget(LineEditPort);
PushButtonEnter=new QPushButton(tr("enter"));
QVBoxLayout *mainlayout=new QVBoxLayout;
mainlayout->addWidget(ListWidgetContent);
mainlayout->addLayo
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 专题党课讲稿:以高质量党建保障国有企业高质量发展
- 廉政党课讲稿材料:坚决打好反腐败斗争攻坚战持久战总体战涵养风清气正的政治生态
- 在新录用选调生公务员座谈会上和基层单位调研座谈会上的发言材料
- 总工会关于2025年维护劳动领域政治安全的工作汇报材料
- 基层党建工作交流研讨会上的讲话发言材料
- 粮食和物资储备学习教育工作部署会上的讲话发言材料
- 市工业园区、市直机关单位、市纪委监委2025年工作计划
- 检察院政治部关于2025年工作计划
- 办公室主任2025年现实表现材料
- 2025年~村农村保洁员规范管理工作方案
- 在深入贯彻中央8项规定精神学习教育工作部署会议上的讲话发言材料4篇
- 开展深入贯彻规定精神学习教育动员部署会上的讲话发言材料3篇
- 在司法党组中心学习组学习会上的发言材料
- 国企党委关于推动基层党建与生产经营深度融合工作情况的报告材料
- 副书记在2025年工作务虚会上的发言材料2篇