天嵌科技出品qt程序开发完全手册之24小时超级版本_第1页
天嵌科技出品qt程序开发完全手册之24小时超级版本_第2页
天嵌科技出品qt程序开发完全手册之24小时超级版本_第3页
天嵌科技出品qt程序开发完全手册之24小时超级版本_第4页
天嵌科技出品qt程序开发完全手册之24小时超级版本_第5页
已阅读5页,还剩147页未读 继续免费阅读

下载本文档

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

文档简介

基于SKY2440/TQ2440Qt/Embeded用程序开发完全用程序开发完全手(上(V2.22010年06月06 :本手册归属广州天嵌计算机科技(以下简称“天嵌科技”)所有,并保留。非经天嵌科技同意(形式,任何单位及个人不得擅自摘录本手册部分或全部内容,违者()公司将其。所谓“授人以鱼不如授人以渔”,在天嵌科技的中,希望做到让客户熊掌与鱼兼得。天嵌科技在本时正是天嵌科技贯的。首先不会只供一堆枯的,无法入发发Lnuxt应用程序的目的。本基于广州天嵌计算机科技SKY2440TQ2440Qt应用程序开发的操作步骤进行为了让本能够尽快同大家见面,本分为上下两个部分,上部分以开发流程和实例开发为Qt开发手册的上部分,手册的下部分也将很快和大家见制台来操作开发板的Linux,而没法使用LCD对开发板进行操作感到很无奈呢?本将会带您进入Linux是不是很酷?好,赶快加入的LinuxGUI的开发--Qt的应用程序开发吧! 注重方法和方向,它会您如何掌握一个Qt应用程序的开发流程、应用程序如何和Linux驱动结合、应用程序如何实现开机自动运 您Qt的开发,在后面的章节中 的下中提供并进行源码分析。同时在涉及某些Qt的 不是Qt源码分析,而是 大家开发Qt的方法;相信本手册能给您开启Qt应用程序开发的这扇门,带领您进入Qt应用程序开发的广阔天地。但是将来您想要有大发展还需要您的这里有个希望也是请求,当您根据本手册学会了Qt的应用程序的开发后,请您告诉您身边的朋友和同事,您是广州天嵌计算机科技的用户;同时也请您能够把您做出来的Qt的相关程序或解决方法写成建议的文档放到的“ 方面也是对工程师所付出的艰辛劳动的一点回报。在这里天嵌科技的全体员工先说声谢谢了。您的支持是无限前进的动力。选择天嵌科技的ARM9学习板--TQ2440,是您的睿智。 坚持做最好最有价值的TQ2440开发板,也坚持写最适合广大客户的2440开发 本上部分六个章节,第一章讲解一些关于Qt的概念和区别;第二章讲解Qtopia-2.2.0的移植;第三章到第五章讲解StepbyStepQt应用程序的开发;第六章讲解Qt4的移植和使用。Qt应用程序的开发流程,实现如何在PCLinuxQt应用程序,实现仿真以及如何移植Qt到arm-linux系统中。在实例开发的章节中的第一小节,都会用于分析如何实现要开发的Qt程序的实现思路,然后再在后面的章节中完成实际的开发。请注意:源码分析时,只讲这部C语言的开发,至少会简单的C++语言的开发。 更新暨更正内容列在本手册中彻底的删掉了Qtopia-1.7.0的讲解,将第六章中的Qtopia-2.2.0Qtopia-1.7.0的,在第六张专门用于讲解Qt4的移植和使用 为EABI-4.3.3的编译器了,目前 版本的4.3.3的交叉编译器为20091210安装方法见本手册的相关章节或TQ2440使用手册或Linux移植手册的相关章节。地址是 src/EABI-4.3.3EmbedSky20091210.rar 为EABI-4.3.3的编译器了,目前 版本的4.3.3的交叉编译器为20091210安装方法见本手册的相关章节或TQ2440使用手册或Linux移植手册的相关章节。在本手册中使用的 。....................................................................................................................................................................2前 更新暨更正内容列 第一章Qt的几个相关概 Qt的区 Qt的版本介 Qt4版 各个版本的区 Qte开 介 第二章建立Qtopia-2.2.0的开发平 准备工 编译Qtopia- 编译PC版本的Qtopia- PC仿真Qtopia- 编译ARM版本的Qtopia- 制作包含Qtopia-2.2.0的文件系 制作Qtopia的运 添加Qtopia到文件系统 单独运行qt程 第三章第一个Qt应用程序的开发流 建立Qt的项目文 产生源代 添加main.cpp文 产生*.pro文 生成Makefile文 制作启动 制作桌面图 修 .cpp文 编译并仿 移植到SKY2440/TQ2440开发 学习后 第四章开发网络设置程 设计思 制作界 生成源 添加main.cpp文 4.5添加各个响应函数的内 得到Qtopia的可执行文 制作程序和配置文 测 实验后 第五章其它QT测试程序的开 蜂鸣器的测试程序的开 设计思 制作测试程序界 添加响应函数的内 测 LED灯测试程序的开 设计思 制作测试程序界 添加响应函数的内 其他操 测 其他的介 按键测试程 串口测试程 RTC设置程 第六章建立Qt4的开发平 Qt4和QtCreator的获 编译PC版本的 编译ARM版本的 QtCreator的使 Qt4应用程序的制 建立源 创建项 获取项目文件和Makefile文 编译程 Qt4.5的仿 Qt4的文件系统的制 附录1Qtopia-2.2.0的相 的内 setX86_QpeEnv的内 test_x86的内 arm-qtopia-2.2.0_build的内 setARM_QpeEnv的内 附录2Qt-4.5的相关.....................................................................................................................................x86_qt4.5_build的内 arm_qt4.5_build的内 setARM_env的内容 第一章Qt在学习Qt开发之前, 先来区分几个概念,这几个概念也是开发板中提供的Qt的相关源码包和目 理解Qt。必须知道的一点:QtC++应用程序开发框架,因为它的APIQt的概念:Qt是泛指Qt的所有版本的图像界面库,比如Qt/X11,QtWindowsQtMac等。由于Qt最早是在Linux中随着KDE流行开来的,所以通常所说的Qt都是指的用于Linux/UnixQt/X11。后面会讲到Qt2、Qt3Qt4,2、34是指的Qt的版本号。Qt/Embeded的概念:它是用于Linux系统Qt版本,Qt/Embeded也简QteQt/E(以下使用Qte表示。Qte去掉了XLib的依赖而直接工作在Framebuffer上,虽然它是Qt的版本,但是它不是Qt/X11的子集,它有部分机制(比如QCOP等)就不能用于Qt/X11中。Qtopia是一个基Qte的类似桌面系统的应用环境,包含有PDAPhone版本。请注意是基于,Qtopia的应用程序。Qtopia最高版本是Qtopia-2.2.0,在这之后就没有再推出过免费的Qtopia了。QtopiaCore:可以认为是刚刚讲到的Qte,虽然名字中含有Qtopia,不过它的实质还是刚刚讲到的QteQt4开始把QtopiaCoreQtopia的产品线中了,但实质上QtopiaCore还是基础类库,相当于Qte。 /qtopia/source/qtopia-free-src- progentmakeQt4 /qt/source/qt-embedded-linux-opensource-src-如 其它的版本,可以使用 /qt/source/然后选择您所需要版 qtopia-2.2.0QtopiaPDAQt4中是没有qtopia的,我们移植Qt4时,是不会产生Qtopia的。获取源码包之后 打开源码包,看一下里面的文件结构中是不包含 的 结构如下 Qte的库之后,可以编译这些测试程序出来测试Qt4Qt4Qt2的区别:QteQt4Qtopia-2.2.0Qte的版本差别外,还存在是否有QPE程序的差别,QPE程序实现的功能就是提供一个类似Windows桌面的功能,在Qt4中不存在这样的程序。Qte开 uicXML格式的xxx.ui文件转换为xxx.hxxx.cpp在PC上面开发qt程序时,主要使用它来进行仿真。Qtopia-2.2.0以首先要建立x86的Qt的平台。4.3.3_EmbedSky_20091210.tar.bz2”,在光盘的“Linux资源\Linux平台开发工具包\” #tarxvfjEABI_4.3.3_EmbedSky_20091210.tar.bz2-C#gedit#Pathmanipulationif[`id-u`=0]; pathmunge pathmunge pathmunge 143.343.343.3的基础注意2:当您要切换不同的交叉编译器时,请先修改“/etc/profile”文件,将您要用的交叉编译器罗列到前面讲的红色部分内容,然后将不需要用的交叉编译器的前面加上“#”号 /#Pathmanipulationif[`id-u`=0]; pathmunge pathmunge pathmunge pathmunge/opt/EmbedSky/4.3.3/bin在TQ2440配套光盘中提供有Qtopia-2.2.0的源码,名为:“Qte_20100601.tar.bz2”,在“Linux资源\Qt源 Qte的源码包,解压命令:#tarxvfjQte_20100601.tar.bz2-C/,解压后的目和EmbedSky_apps.tar.bz2源码。arm-qtiopia-2.2.0-konqueror_build:在arm-qtopia-2.2.0_build的基础上增加了konqueror.tar.bz2的编译。setARM_QpeEnv:设置ARM版本的环境变量 setX86_QpeEnv:设置X86版本的环境变量 利用该源码包自行生成x86版本的Makefile文件。test_x86:当PC版本的Qtopia-2.2.0编译成功后,仿真时运行该tslib-1.4.1.tar.bz2以上几个的使用方法,在PC的Linux环境中的终端输入:#./xxx即可,xxx标识前面讲到的6个PCLinux的终端执行命令:#./x86-qtopia-2.2.0-kongqueror_buildQt了。系统,前提是编译Qt所需要的系统库要安装全。2:如果使Fedora10的环境,请参考天嵌科技提供的安装Fedora10。注意4:对于Qt编译过程中出现的错误,多数情况是因为RedHat9没有完全安装导致的(首先请确认5x86arm的均是两个x86的为例,其中名为“x86-qtopia-2.2.0-konqueror_build”的已经包含判断是否运行“x86-qtopia-2.2.0_buildqtopia-2.2.0没有编译,则先运行“x86-qtopia-2.2.0_build”编译成功后再编译web浏览器。PCLinux1:如果您使用的平台是:Redhat9.0(天嵌科技的上面提供有和安装,建议安redhat912GBredhat94.8G的空间;如果使用的是Fedora1016GBFedora107.5GBQt编译时也需要大量的空间;同时天嵌科技在目前提供的的编译中已经实现了自动判断是否出错,如果出错2:经常有qvfb能够运行,而qpe运行时找不到这个命令。这里解释一下:qvfb面说过了是由qt-x11编译出来的;而qpeqtopia中编译出来的,而qtopia编译时又要qt提供qte的qpe命令不存在时,最大的可能是qtredhat9没有完redhat9完全安装就是把一切可能用到的库都安装进去,至于缺少什么库,如果您说明:为了仿真的方便,提供了仿真:test_x86,在中完成了仿真时所需要的配置。SKY2440/TQ2440开发板的Qt的方法,在PC的Linux的终端执行命令:#./arm-qtopia-2.2.0-kongqueror_build,就开始编译ARM版本的Qtopia了。注意2:交叉编译出来的Qt只能在ARM平台运行,也就是说在PC使用qvfb没法仿真的。 《LinuxStep10和Step11:假设制作的文件系统名称是root_qtopia_2.2.0_,同时存放到PCLinux的“/opt/EmbedSky/”: exportsetHOME=/rootexportsetKDEDIR=/opt/kdeexportsetif[-f/sys/devices/virtual/input/input0/uevent]; exportset exportset exportset exportset exportsetexportsetUSER="`id-un`"exportUSERLOGNAMEPS1qtopia修改文件系统的“etc/init.d/rcS”文件,添加内容如下(红色qtopia/bin/hostname-F 下,权限为可执行echoStartQtopia-2.2.0>exportsetHOME=/rootexportsetKDEDIR=/opt/kdeexportsetif[-f/sys/devices/virtual/input/input0/uevent]; exportset exportset exportset exportset exportsetifif[-f/etc/pointercal]; echoonlyusemouse> echo"10101165536" exportsetexportsetif[-f/etc/pointercal]; 上面的“if[-f/sys/devices/virtual/input/input0/uevent”这句话用于判断内核中是否编译了触摸驱动,如果添加触摸驱动则只设置USB鼠标,并且创建一个触摸校验文件告诉qtopia-2.2.0已经完成了触摸校验,linux-的内核中VGA开头的配置单均是没有添加对触上面的“1>/dev/null2>/dev/null”这半句话决定着是否在串口上面打印qtopia的启动信息,有它则不打印qtopia的启动信息,无则打印。“if[-f/etc/pointercal];thenUSB鼠标的客户,在制作文件系统时,在“etc/”下使用vi命令建立一个名为“pointercal”的空文件,用建立好文件后将其到文件系统的“bin/”下,然后设置其权限为可执行文件,使用命令: od+xqtopia 您可以对文件系统下的 下面的字体进行删减,以满足自己的需要,并且从“/opt/EmbedSky/Qte/arm-qtopia-2.2.0/tslib-1.4.1/install/bin/” 从“/opt/EmbedSky/Qte/arm-qtopia-2.2.0/tslib-1.4.1/install/etc/” 下,并且修改ts.conf的内容如下: mentifyouwishtousethelinuxinputlayereventinterfacemodule_rawinput mentifyou'reusingaSharpZaurusSL-5500/SL-5000d#module_rawcollie mentifyou'reusingaSharpZaurusSL-C700/C750/C760/C860#module_rawcorgi mentifyou'reusingadevicewithaUCB1200/1300/1400TSinterface#module_rawucb1x00 mentifyou'reusinganHPiPaqh3600orsimilar#module_rawh3600 mentifyou'reusingaHitachi #module_raw mentifyou'reusinganIBMArcticII#module_rawarctic2modulepthrespmin=1moduledejitterdelta=100modulelinear从“/opt/EmbedSky/Qte/arm-qtopia-2.2.0/tslib-1.4.1/install/lib/” 您可以在文件系统的“root/”中建立名为“s/”的,然后将您的文档比如MP3歌曲什么的放到该下,就可以在开发板启动后的qtopia界面的“s”菜单栏下直接看到对应的文完成了带有qtopia的文件系统,在按照前面讲解的制作Yaffs文件系统的方法,使用mkyaffsimage软件(请注意该工具使用的范围)来制作出Yaffs文件系统。然后烧写到开发板中就可以使用了。1:刚刚制作好的文件系统第一次使用时需要校正触摸,使用tslib校正触摸的方法是:用触摸笔LCD上面的的中心,顺序是左上-》右上-》右下-》左下-》中心,然后校正结束,校正结束后除方法:$rm-f/etc/pointercal。到这里关于Qt移植的最基本的东西讲完了,下面进入开发Qt应用程序的。实现目标能够编写开发Qt的应用程序。这里一点,天嵌科技在中能做到的是引导您学习,您法,最终的学对于需要开机单独运行某个程序(假设为abc)时,可以选择修改qtopia 容替换为“abc-qws”;也可以修改“etc/init.d/rcS”文件,将“qtopia&”修改为“abc-qws1>/dev/null2>/dev/null”。单独运行某个Qt程序时“-qws”参数必须添加。下面分别列出修改qtopia文件和修改rcS文件后的内容:echoStartQtopia-2.2.0>exportsetHOME=/rootexportsetKDEDIR=/opt/kdeexportsetif[-f/sys/devices/virtual/input/input0/uevent]; exportset exportset exportset exportset exportset if[-f/etc/pointercal]; echoonlyusemouse> echo"10101165536" exportsetexportsetif[-f/etc/pointercal]; $QPEDIR/bin/abc-qws>/dev/null2>/dev/null $QPEDIR/bin/abc-qws>/dev/null2>/dev/null对于需要测试某个Qt程序时,直接在开发板的串口终端输入对应的Qt应用程序的名称(假abc)加上“-qws”的参数即可“$abcqws”QtPCLinux,然后首先在终端中输入命令:#sourcesetX86_QpeEnv,完成设置变量的操作,当第一Qt程序实现一个功能,就是按下设置的user按钮后,显示出“xxxxxxxxxx”的打印信息出来;按下close按钮后,退出该应用程序。 说明:bed_apta2”MakeeRM平台的,只需要将其解压后,放到“x86qpa220”解压方法:#tarxvfjEmbedSky_apps.tar.bz2-C/;#mv-fprox86-qtopia-2.2.0;到把这些源码拷贝到PC平台的,而对于ARMARM平台的时已经完成在PC的Linux的“/opt/EmbedSky/Qte/x86_qtopia/pro” 下新建一个名为:“ /”的 在PC的Linux的终端输入命令:#$QTDIR/bin/designer&( 启动Qt的设计器 应的函数。如下图所示,完成user按钮和close按钮的 错的情况,原因可以分析Makefile文件得到。 将刚刚建立的工程转换为源代码,首先建立一个可执 来完成文件的转换,产生*.pro #Makefilefor#Generatedbytmakeat19:47,2009/05/13 Template:app#######Compiler,toolsandCC CFLAGS -pipe-Wall-W-O2-DNOCXXFLAGS=-pipe-DQWS-fno-exceptions-fno-rtti-Wall-W-O2-DNO_DEBUG -I$(QTDIR)/include-I$(QPEDIR)/include LFLAGS= LFLAGS= UIC= tar- #######FilesHEADERS= SOURCES= .cpp OBJECTS= UICDECLS= UICIMPLS= DESKTOP=$(QPEDIR)/image/opt/Qtopia/apps/EmbedSky/ ICON= INTERFACE_DECL_PATH=.#######Implicit.SUFFIXES:.cpp.cxx.cc.C $(CXX)-c$(CXXFLAGS)$(INCPATH)-o$@ $(CXX)-c$(CXXFLAGS)$(INCPATH)-o$@ $(CXX)-c$(CXXFLAGS)$(INCPATH)-o$@$(CXX)-c$(CXXFLAGS)$(INCPATH)-o$@ $(CC)-c$(CFLAGS)$(INCPATH)-o$@#######Buildall:all: cp-f .desktop.pngcp- ):$(UICDECLS)$(OBJECTS) )$(OBJECTS)$(OBJMOC)moc:tmake:Makefile:Makefile: .pro-o.h .pro$(SOURCES)$(HEADERS)$(INTERFACES) -rm-f$(OBJECTS)$(OBJMOC)$(DESKTOP)$(ICON) -rm-f*~)#######Sub-######Combined#######.o: .cppmain.o:main.cpp.h .h: $(UIC) .ui-o .cpp: $(UIC) .ui- .h- .cpp .h-o .o:创建一个桌面启动器(*.desktop)文件,方法如下截Icon选项后跟随的是启动器显示的图标名称(去掉后缀名下面制作桌面图标文件,格式是 为了实现前面讲到的按下user_button按钮,出现预设的打印信息,还需要修改 .cpp的源码内容:**Formimplementationgeneratedfromreadinguifile **Created:ThuMay1412:30:11 by:TheUserInterfaceCompiler**WARNING!Allchangesmadeinthisfilewillbe#include" #include<qlabel.h>#include<qlayout.h>#include<qvariant.h>#include<qtooltip.h>#include<qwhatsthis.h>#include<qimage.h>#include<qpixmap.h> Constructsa whichisachildof'parent',with name'name'andwidgetflagssetto (QWidget* constchar*name,WFlagsfl :QWidget(parent,name,fl{ if(!name setName( " resize(451,305 setCaption(tr( _Qt_Program") userb=newQPushButton(this,"userb" userb->setGeometry(QRect(60,20,100,30) user_b->setText(tr("UserButton") user_t=newQLabel(this,"user_t" user_t->setGeometry(QRect(20,70,188,30) QFont user_t->font() user_t_font.setPointSize(18 user_t_font.setBold(TRUE user_t->setFont(user_t_font user_t->setText(tr("")PixmapLabel1=newQLabel(this,"PixmapLabel1");PixmapLabel1->setGeometry(QRect(260,20,28,98)); PixmapLabel1->setPixmap(image0 close=newQPushButton(this,"close" close->setGeometry(QRect(120,140,80,28) close->setText(tr("Close") //signalsandslots connect(userb,SIGNAL(clicked()),this,SLOT(userbutton()) connect(close,SIGNAL(clicked()),this,SLOT(close())} Destroystheobjectandfreesanyallocated { //noneedtodeletechildwidgets,Qtdoesitallfor} Maineventhandler.Reimplementedtohandle fontbool ::event(QEvent*ev{ boolret=QWidget::event(ev if(ev->type()==QEvent::ApplicationFontChange) QFontusert usert->font() user_t_font.setPointSize(18 user_t->setFont(user_t_font return}void { user_t->setText(tr( o,QtApplication!") qWarning( ::user_button():Notimplementedyet!"}在上面的user_button()函数中添加了对按下user_button按钮响应的功能处理,即按下按钮后,打印出 o,QtApplications!”这句话到主界面中。完成前面的步骤后,在PCLinux的终端输入:#make命令,即可完成编译,编译之后的“”应用程序放在了“/opt/EmbedSky/Qte/x86-qtopia-2.2.0/qtopia/image/opt/Qtopia/bin/”下面,“.png”图标放到“/opt/EmbedSky/Qte/x86-qtopia-2.2.0/qtopia/image/opt/Qtopia/pics/”下面,“.desktop”图标放到“/opt/EmbedSky/Qte/x86-qtopia-2.2.0/qtopia/image/opt/Qtopia/apps/EmbedSky/”下面,如下所示到这里在x86平台的Qt的应用程序就算完成了,要将其运行到 还需要进行3.10章节这个步骤。首先前面制作好的“/”到“/opt/EmbedSky/Qte/arm-qtopia-2.2.0/pro/”下,然后重新打开PCLinux的终端,重新设置环境变量tmakeMakefile文件,修Makefile文注意1:由于 到arm-qtopia-2.2.0/pro/目录之前,请先使用#makeclean命令,清除已经编译生成的obj文件,然后再 ,否则可能出现编译错误, 2:这里使用的tmake工具因为重新设置了环境变量,针对arm$TMAKEPATH之后,应该如#Makefilefor#Generatedbytmakeat12:09,2009/05/25 Template:app#######Compiler,toolsandCC= CFLAGS -pipe-Wall-W-O2-CXXFLAGS=-pipe-DQWS-fno-exceptions-fno-rtti-Wall-W-O2-DNO_DEBUG -I$(QTDIR)/include-I$(QPEDIR)/include LFLAGS= $(SUBLIBS)-L$(QPEDIR)/lib-L$(QTDIR)/lib-lm-lqpe-lqtopia-lqte UIC tar- #######HEADERSSOURCES= .cppHEADERS OBJECTS= INTERFACES= UICDECLS= UICIMPLS= DESKTOP=$(QPEDIR)/image/opt/Qtopia/apps/EmbedSky/ ICON= INTERFACE_DECL_PATH=.#######Implicit.SUFFIXES:.cpp.cxx.cc.C $(CXX)-c$(CXXFLAGS)$(INCPATH)-o$@ $(CXX)-c$(CXXFLAGS)$(INCPATH)-o$@ $(CXX)-c$(CXXFLAGS)$(INCPATH)-o$@ $(CXX)-c$(CXXFLAGS)$(INCPATH)-o$@ $(CC)-c$(CFLAGS)$(INCPATH)-o$@#######Buildall:all: cp- .desktop cp-f .png ):$(UICDECLS)$(OBJECTS))$(OBJECTS)$(OBJMOC)$(LINK)$(LFLAGS)-omoc:tmake: .pro-o .pro$(SOURCES)$(HEADERS)$(INTERFACES) -rm-f$(OBJECTS)$(OBJMOC)$(DESKTOP)$(ICON) -rm-f*~)#######Sub-######Combined####### .cpp.h main.o:main.cpp.h /opt/EmbedSky/Qte/arm-qtopia-.h: $(UIC) .ui-o .cpp: .ui- .h- .o: .o: .cpp .h-o 然后输入“make”命令,即可完成编译,编译结束后,应用程序 ”在“/opt/EmbedSky/Qte/arm-2.2.0/qtopia/image/opt/Qtopia/bin/” 下,桌面图标“ 不方便,所以,这里天嵌科技重新制作一个基于Qt的网络设置程序。的实现方法上,本章节将会实现在Qt中实现读写外部文件,调用系统工具进行操作等。线网wifi而言,使iwconfig设置所要登录的无线网络名称和登录,使用ifconfigrouteIP等参数;对于CDMAGPRS等使用wvdial命令进行拨号。而在Qt界面中呢?可以用点击按钮来执行ifconfig等命令。但是要使用的参数呢?可以通过调用保存通过前面的分析,明确了三件事: 再放置一个close按钮,效果如下图所示:Configure栏目先ButtonGroup工具,因为马上要用到乒乓开关(RadioButton),必须将其ButtonGroup中才能实现乒乓开关功能,然后再放置数个RadioButtonClose按钮,效果如下图所然后设置Wifi栏目、IP栏目和DNS/MAC栏目,方法和NetWork栏目相同,下面分别是它们三个栏先实验中的ui2cpp到netset 下,然后修改ui2cpp,修改后的ui2cpp内容如下:(红$QTDIR/bin/uic-onetset.h$QTDIR/bin/uic-onetset.cpp-implnetset.h$QTDIR/bin/mocnetset.h-o 实验中的main.cpp文件到 下,然后修改main.cpp,修改后的main.cpp内容如下(红色部分为修改内容 1#include 2#include 第二行:这里用到的头文件在“/opt/EmbedSky/Qte/arm-qtopia-2.2.0/qt2/src/kernel/”下的,这个头文件对应的帮助文件在“/opt/EmbedSky/Qte/arm-qtopia-2.2.0/qt2/doc/html/”下的同名文件(后缀名第三行:这里包含的头文件在“/opt/EmbedSky/Qte/arm-qtopia-2.2.0/qtopia/src/libraries/qtopia/”下,这个头文件对应的帮助文件在“/opt/EmbedSky/Qte/arm-qtopia-2.2.0/qtopia/doc/html/”下的同名文件(后文件中,它实现:产生主窗口,而其中的NAME是应用程序的执行名字,IMPLEMENTATION是应用程序的窗口类。在本实例中提供的窗口类名称为:netsetup,而执行名字我定义为netset,请注意区别。用exit()或quit())有的这些操作由QPEApplication处理,应用程序窗口如果要关闭,应该调用close()/op/Ebedk/e/aqtopa20qpdoc/tl”qpappantl/op/Ebed/te/aqtopa-220qp/cbaeqpaqpeappcocpp(红色部分为修改内容 1 2**Formimplementationgeneratedfromreadinguifile34**Created:TueMay1919:29:14 by:TheUserInterfaceCompiler**WARNING!Allchangesmadeinthisfilewillbe 8 #include<qgroupbox.h>#include<qlabel.h>#include<qlineedit.h>#include<qpushbutton.h>#include<qradiobutton.h>#include<qtabwidget.h>#include<qlayout.h>#include<qvariant.h>#include<qtooltip.h>#include<qwhatsthis.h>#include<qimage.h>#include<qpixmap.h>#include"stdio.h"#include"stdlib.h"#include"string.h"#include"sys/stat.h"#include<fcntl.h>#include<qdir.h> Constructsanetsetupwhichisachildof'parent',with name'name'andwidgetflagssetto constchar*name,WFlagsfl:QWidget(parent,name,fl{ if(!name setName("netsetup" resize(382,258 setCaption(tr("EmbedSkyNetwork")); tab=newQTabWidget(this,"tab" tab->setGeometry(QRect(0,0,320,200) netinfo=newQWidget(tab,"netinfo");logo1=newQLabel(netinfo,"logo1"logo1->setGeometry(QRect(280,30,28,98)Network_info=newQGroupBox(netinfo,"Network_info"Network_info->setGeometry(QRect(6,0,256,160)Network_info->setTitle(tr("NetworkInfo"));NetMask_T=newQLabel(Network_info,"NetMask_T"NetMask_T->setGeometry(QRect(12,48,58,20)IPAddrT=newQLabel(Networkinfo,"IPAddrT"IPAddrT->setGeometry(QRect(12,22,58,20)DNS_T=newQLabel(Network_info,"DNS_T"DNS_T->setGeometry(QRect(12,100,58,20)MAC_T=newQLabel(Network_info,"MAC_T"MAC_T->setGeometry(QRect(12,126,58,20)Gateway_T=newQLabel(Network_info,"Gateway_T"Gateway_T->setGeometry(QRect(12,74,58,20)ip_info=newQLineEdit(Network_info,"ip_info"ipinfo->setEnabled(FALSEip_info->setGeometry(QRect(78,22,166,20)maskinfo=newQLineEdit(Network_info,"mask_info"maskinfo->setEnabled(FALSEmask_info->setGeometry(QRect(78,48,166,20)gateway_info=newQLineEdit(Network_info,"gateway_info"gateway_info->setGeometry(QRect(78,74,166,20)dns_info=newQLineEdit(Network_info,"dns_info"dns_info->setGeometry(QRect(78,100,166,20) mac_info=newQLineEdit(Network_info,"mac_info" mac_info->setGeometry(QRect(78,126,166,20)close1=newclose1=newQPushButton(netinfo,"close1");close1->setGeometry(QRect(261,150,48, configure=newQWidget(tab,"configure"); close2=newQPushButton(configure,"close2" close2->setGeometry(QRect(262,150,48,18)); configure_group=newQButtonGroup(configure,"configure_group"configure_group->setGeometry(QRect(10,10,280,130)autoip=newQRadioButton(configure_group,"autoip"autoip->setGeometry(QRect(21,21,210,19)autoip->setText(tr("ConfigureIPautomatically(DHCP)"));wificonfig=newQRadioButton(configuregroup,"wificonfig"wificonfig->setGeometry(QRect(21,71,210,19)cdmaconfig=newQRadioButton(configure_group,"cdmaconfig"cdmaconfig->setGeometry(QRect(21,96,210,19)cdmaconfig->setText(tr("ConfigureCDMA/GPRS"));logo2=newQLabel(configure_group,"logo2"logo2->setGeometry(QRect(240,20,28,98)userip=newQRadioButton(configure_group,"userip"userip->setGeometry(QRect(21,46,210,19)userip->setText(tr("ConfigureLocalIPmanually") wifi=newQWidget(tab,"wifi");logo3=newQLabel(wifi,"logo3"logo3->setGeometry(QRect(270,10,28,98)set_1=newQPushButton(wifi,"set_1"set_1->setGeometry(QRect(260,115,48,18) close3=newQPushButton(wifi,"close3" close3->setGeometry(QRect(260,145,48,18)); close3->setText(tr("Close")); wifi_set=newQGroupBox(wifi,"wifi_set" wifi_set->setGeometry(QRect(10,10,238,145)); wifi_set->setTitle(tr("WirelessSet")); PassWord_T=newQLabel(wifi_set,"PassWord_T"PassWord_T->setText(PassWord_T->setText(tr("PassWord:")PassWordT->setGeometry(QRect(10,50,59,23) NetNameT=newQLabel(wifiset,"NetNameT" NetName_T->setGeometry(QRect(10,20,59,23) netname=newQLineEdit(wifi_set,"netname"netname->setGeometry(QRect(80,20,150,23)password=newQLineEdit(wifi_set,"password"password->setGeometry(QRect(80,50,150,23)tab->insertTab(wifi,tr("Wifi")); tcpip=newQWidget(tab,"tcpip");logo4=newQLabel(tcpip,"logo4"logo4->setGeometry(QRect(270,10,28,98)set2=newQPushButton(tcpip,"set2"set2->setGeometry(QRect(260,115,48,18)set_2->setText(tr("Set"));close4=newQPushButton(tcpip,"close4"close4->setGeometry(QRect(260,145,48,18)close4->setText(tr("Close"));setIP_info=newQGroupBox(tcpip,"setIP_info"setIP_info->setGeometry(QRect(10,10,239,146)setIP_info->setTitle(tr("SetIP"));ipaddr=newQLabel(setIP_info,"ipaddr"ipaddr->setGeometry(QRect(10,20,58,20)ipaddr->setText(tr("IPAddr:"));netmask=newQLabel(setIP_info,"netmask"netmask->setGeometry(QRect(10,48,58,20)netmask->setText(tr("NetMask:"));gatewayt=newQLabel(setIPinfo,"gatewayt"gatewayt->setGeometry(QRect(10,74,58,20)gateway_t->setText(tr("Gateway:")); ip=newQLineEdit(setIP_info,"ip" ip->setGeometry(QRect(78,20,156,20) mask=newQLineEdit(setIP_info,"mask"); mask->setGeometry(QRect(78,48,156,20)); gateway=newQLineEdit(setIP_info,"gateway" gateway->setGeometry(QRect(78,74,156,20)); tab->insertTab(tcpip,tr("IP")); dns_mac=newQWidget(tab,"dns_mac");logo5->setScaledContents(logo5->setScaledContents(TRUElogo5->setGeometry(QRect(270,10,28,98)logo5=newQLabel(dnsmac,"logo5" set_3=newQPushButton(dns_mac,"set_3" set_3->setGeometry(QRect(260,115,48,18) set_3->setText(tr("Set") close5=newQPushButton(dns_mac,"close5" close5->setGeometry(QRect(260,145,48,18) close5->setText(tr("Close") dns_mac_set=newQGroupBox(dns_mac,"dns_mac_set" dns_mac_set->setGeometry(QRect(10,10,240,141) dns_mac_set->setTitle(tr("SetDNS/MAC") dns_t=newQLabel(dns_mac_set,"dns_t");dns_t->setGeometry(QRect(10,20,58,20)dns=newQLineEdit(dnsmacset,"dns");dns->setGeometry(QRect(78,20,156,20));mac_t=newQLabel(dns_mac_set,"mac_t");mac_t->setGeometry(QRect(10,48,58,20));mac_t->setText(tr("MAC:"));mac=newQLineEdit(dns_mac_set,"mac");mac->setGeometry(QRect(78,48,156,20));tab->insertTab(dns_mac,tr("DNS/MAC")//signalsandslotsconnect(close1,SIGNAL(clicked()),this,SLOT(close()));connect(autoip,SIGNAL(clicked()),this,SLOT(autosetip()));connect(userip,SIGNAL(clicked()),this,SLOT(usersetip()));connect(wificonfig,SIGNAL(clicked()),this,SLOT(usewifi()));connect(cdmaconfig,SIGNAL(clicked()),this,SLOT(usecdma()));connect(close2,SIGNAL(clicked()),this,SLOT(close()));connect(close3,SIGNAL(clicked()),this,SLOT(close()));connect(close4,SIGNAL(clicked()),this,SLOT(close()));connect(close5,SIGNAL(clicked()),this,SLOT(close()));connect(set3,SIGNAL(clicked()),this,SLOT(setipinfo()));connect(set_2,SIGNAL(clicked()),this,SLOT(setipinfo()));connect(set_1,SIGNAL(clicked()),this,SLOT(setwifi())); //tab setTabOrder(tab,ip_info setTabOrder(ip_info,mask_info setTabOrder(mask_info,gateway_info setTabOrder(gateway_info,dns_info setTabOrder(dns_info,mac_info setTabOrder(mac_info,close1 setTabOrder(close1,autoip setTabOrder(autoip,userip setTabOrder(userip,wificonfig setTabOrder(cdmaconfig,close2setTabOrder(close2,netnamesetTabOrder(netname,passwordsetTabOrder(password,set1setTabOrder(close3,ipsetTabOrder(ip,masksetTabOrder(mask,gatewaysetTabOrder(close4,dnssetTabOrder(mac,set_3setTabOrder(set_3,close5 tab->setTabEnabled(tcpip,0); tab->setTabEnabled(wifi,0); 294}296 Destroystheobjectandfreesanyallocated{ //oneedodeletehidwidgets,tdoestllforus302}QStringQStringvoidnetsetup::setNetConfigItem(constQString*pstr,intn{ for(inti=0;i<n;i++ if(!(pstr+ ) qDebug("l[%d]:%s",i,(pstr+i)->latin1()); intpos=(pstr+i)->find('='); unsignedintlen=(pstr+i)->length(); ls[i]=(pstr+i)->left((unsignedint)pos); rs[i]=(pstr+i)->right(len-(unsignedint)pos-1); qDebug("ls[%d]:%s",i,ls[i].latin1() qDebug("rs[%d]:%s",i,rs[i].latin1()); if(ls[i]=="IPADDR"){ ip_info->setText(rs[i].latin1()); }elseif(ls[i]=="NETMASK")itselfetCmak=;325 (1) }elseif(ls[i]=="GATEWAY") gateway_info->setText(rs[i].latin1()); ==}elseif(ls[i]=="NETNAME"{macinfo->setText(rs[i].latin1()itselfNetConfig.mac=}elseif(ls[i]=="MAC")itselfNetConfig.password= }elseifitselfNetConfig.password= if(!(pstr+ ) qDebug("l[%d]:%s",0,(pstr+0)->latin1() intpos=(pstr+0)->find('' unsignedintlen=(pstr+0)- ls[0]=(pstr+0)->left((unsignedint)pos rs[0]=(pstr+0)->right(len-(unsignedint)pos-1 if(ls[0]=="nameserver") itselfNetConfig.dns= dnsinfo->setText(rs[0].latin1() constchar**lineusealittle,easilyappears void{intQDir::setCurrent("/etc/"QFilewificf("wifi.conf"ret=wificf.open(IO_ReadOnly);if(ret){qDebug("Readyread:open/etc/wifi.confsuccess!");QTextStreamstream(&wificf);//constchar**line=newconstchar*[12];intn=0;while(!stream.atEnd(){str[n]= }else}elseqDebug("Readyread:open/etc/wifi.conffailure!" QFilencf("net.conf" ret=ncf.open(IO_ReadOnlyif(ret)qDebug("Readyread:open/etc/net.conftosuccess"QTextStreamstream(&ncf//constchar**line=newconstchar*intn=while(!stream.atEnd(){str[n]= 399setNetConfigItem(str,n);400ncf.close(); }else402qDebug("Readyread:open/etc/net.conffailure!");403ncf.close(); ret=dnscf.open(IO_ReadOnlyif(ret)qDebug("Readyread:open/etc/resolv.conftosuccess"//constchar**line=newconstchar*intn=while(!stream.atEnd(){str[n]= setNetConfigItem(str,n}elseqDebug("Readyread:open/etc/resolv.conffailure!" 425427 ThemembersofitselfNetConfighaspointedtoQString <<-outputtoobjectthatstream pointing430431 432 433 434 435voidnetsetup::writeNetConfigFile(char436intQDir::setCurrent("/etc/"if(wtype=={QFilenettypecf("nettype.conf"ret=nettypecf.open(IO_WriteOnlyif(ret)qDebug("Readywrite:open/etc/nettype.confsuccess!" QTextStreamstream(&nettypecf QStringstrif(itselfNetConfig.usecdma==stream<<"CDMAUSE"<<"="<<"1"<<stream<<"CDMAUSE"<<"="<<"0"<<if(itselfNetCtype==stream<<"NETTYPE"<<"="<<"1"elseif(itselfNetCtype==stream<<"NETTYPE"<<"="<<"2"}elseqDebug("Readywrite:open/etc/nettype.conffailure!" elseif(wtype=={QFilencf("net.conf"ret=ncf.open(IO_WriteOnlyif(ret)qDebug("Readywrite:open/etc/net.confsuccess!"QTextStreamstream(&ncfstr=ip-itselfNetConfig.ipaddr=str=mask-itselfNetCmask=str=gateway-itselfNetConfig.gateway=str=mac- stream<<"IPADDR"<<"="<<itselfNetConfig.ipaddr<< stream<<"NETMASK"<<"="<<itselfNetCmask<< stream<<"GATEWAY"<<"="<<itselfNetConfig.gateway<< stream<<"MAC"<<"="<<itselfNetConfig.mac<< }else485qDebug("Readywrite:open/etc/net.conffailure!");486ncf.close(); ret=dnscf.open(IO_WriteOnly if(ret) qDebug("Readywrite:open/etc/resolv.confsuccess!");493QTextStreamstream(&dnscf);494QStringstr=dns-495itselfNetConfig.dns=str.latin1(); stream<<"nameserver"<<""<<itselfNetConfig.dns<< }else500qDebug("Readywrite:open/etc/resolv.conffailure!");501dnscf.close();}}elseif(wtype=={ QFilewificf("wifi.conf" ret=wificf.open(IO_WriteOnly if(ret)509qDebug("Readywrite:open/etc/wifi.confsuccess!");510QTextStreamstream(&wificf); QStringstr 525

str=netname- itselfNetCname= str=password- itselfNetConfig.password=stream<<"NETNAME"<<"="<<itselfNetCname<<endl;stream<<"PASSWORD"<<"="<<itselfNetConfig.password<<endl;}elseqDebug("Readywrite:open/etc/wifi.conffailure!");}527void528 tab->setTabEnabled(tcpip,0 tab->setTabEnabled(wifi,0)

温馨提示

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

评论

0/150

提交评论