QtEmbedded嵌入式图形开发_第1页
QtEmbedded嵌入式图形开发_第2页
QtEmbedded嵌入式图形开发_第3页
QtEmbedded嵌入式图形开发_第4页
QtEmbedded嵌入式图形开发_第5页
已阅读5页,还剩73页未读 继续免费阅读

下载本文档

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

文档简介

第9章QtEmbedded嵌入式图形开发

9.1Qt/Embedded嵌入式图形开发根底9.2Qtopia虚拟平台及在S3C2410s开发板上移植第9章Qt/Embedded嵌入式图形开发

9.1Qt/Embedded嵌入式图形开发根底1.挪威TrollTech公司:Qtopia和Qt2.Qt作为Linux桌面环境KDE的根底3.Qt的类库等价于MFC的开发库4.Qt可以支持现有的多种操作系统平台5.Qtopia环境包括一个程序发布器和一套支持应用程序开发的程序和库9.1.1Qt/Embedded概述

1.Qt的体系结构Qt为所支持平台提供底层API;(2)Qt是一个“模拟的〞多平台工具包,包括各种部件;(3)有Qt/Embedded与Qt/X11的两个Linux版本;(4)Qt/Embedded提供了完整的窗口环境,可以直接写入Linux的帧缓存。(5)Qt/Embedded去掉了对X效劳器的依赖,而且运行起来比基于X11的Linux设备更快、更省内存。2.窗口系统(1)一个Qt/Embedded窗口系统包含了一个或多个进程,其中的一个进程可作为效劳器,这个效劳进程会分配客户显示区域,以及产生鼠标和键盘事件。(2)一个Qt/Embedded窗口系统包含了一个或多个进程,其中的一个进程可作为效劳器,这个效劳进程会分配客户显示区域,以及产生鼠标和键盘事件。(3)任何程序都可以在命令行上加上“-qws〞的选项来把它作为一个效劳器运行。(4)客户与效劳器之间的通信使用共享内存的方法实现,通信量应该保持最小。(5)Qtopia提供了4种输入法:笔迹识别器、图形化的标准键盘、Unicode键盘和基于字典方式提取的键。(6)Qt/Embedded支持4种不同的字体格式:TrueType〔TTF〕、PostscriptTypel、位图发布字体〔BDF〕和Qt的预呈现〔Pre-rendered〕字体〔QPF〕。9.1.2创立Qt/Embedded开发环境Qt主要包括了以下开发工具:Qt设计器——可视化地设计视窗;Qt语言学家,lupdate和lrelease——翻译应用程序使之能够进入国际市场;Qt助手——快速地发现你所需要的帮助;Tmake——由简单的与平台无关的工程文件生成Makefile;qembed——转换数据,比方把图片转还为C++代码;qvfb——“虚拟帧缓冲〞,在桌面上运行和测试嵌入式应用程序;makeqpf——为嵌入式设备提供预先做好的字体;moc——元对象编译器;uic——用户界面编译器,用于把Qt设计器设计的窗体转换成为C++头文件和源文件;qtconfig——一个基于Unix的Qt配置工具;构建Qt/Embedded开发环境所使用的常用软件包。tmake-1.13.tar.gz——〔tmake工具安装包〕qt-embedded-2.3.10-free.tar.gz——〔qt-embedded安装包〕qt-x11-2.3.2.tar.gz——〔qt-x11安装包〕qtopia-free-2.1.1.tar.gz——〔qtopia-free安装包〕把这四个软件包下载到提前建立的x86-qtopia目录下。为防止版本的不同所造成的冲突,选择软件包时需要注意一些根本原那么,因为qt-x11安装包的两个工具uic和designer产生的源文件会与qt-embedded库一起被编译链接,本着向前兼容的原那么,qt-x11安装包的版本必须比qt-embedded安装包的版本旧。假定上面四个安装包文件拷贝到/root/2410sQt目录下,以下是构建Qt/Embedded平台的最根本的开发环境的步骤。第一步,解压安装包并设置环境变量1.安装Tmakecd/root/2410sQttar–xzftmake-1.13.tar.gzexportTMAKEDIR=$PWD/tmake-1.132.安装cd/root/2410sQttar–xzfqt-x11-2.3.2.tar.gz3.安装Qt/Embeddedcd/root/2410sQttar–xzfqt-embedded-2.3.10-free.tar.gz环境变量的设置是非常重要的,它关系到能否正确的安装及编译这些安装包,下面介绍一下这些环境变量:TMAKEDIR:指向用于编译Qt/Embedded的Tmake工具QT2DIR:指向Qt-X112.3.2的文件夹QTEDIR:指向Qt-Embedded2.3.10的文件夹第二步,编译Qt/Embedded。cd$QT2DIRexportTMAKEPATH=$TMAKEDIR/lib/linux-g++exportQTDIR=$QT2DIRexportPATH=$QTDIR/bin:$PATHexportLD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH./configure-no-xftmakemkdir$QTEDIR/bincpbin/uic$QTEDIR/bin/./configure是对Qt进行配置,它包括很多项选择项,例如可以通过添加“-no-opengl〞等,如果想要进一步了解可以通过键入./configure--help来获得更多的帮助信息。编译完成后需要将生成的/bin/uic复制到$QTEDIR下新创立的目录bin中,因为在随后编译Qt/Embedded的时候会用到这个工具。2.BuildQvfbexportTMAKEPATH=$TMAKEDIR/lib/linux-g++exportQTDIR=$QT2DIRexportPATH=$QTDIR/bin:$PATHexportLD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATHcd$QTEDIR/tools/qvfbtmake-oMakefilemakemvqvfb$QTEDIR/bin/这一步buildqvfb并建立了从Qt/Embedded2.3.10到Qt2.3.2的静态库的链接。其中qvfb工具用来生成Virtualframebuffer,利用这个工具,可以模拟在开发板上的显示情况,如果在Virtualframebuffer中运行没有问题的话,可以直接通过交叉编译在开发板上运行。3.BuildQt/Embeddedcd$QTEDIRexportTMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g++exportQTDIR=$QTEDIRexportPATH=$QTDIR/bin:$PATHexportLD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH./configure-no-xft-qvfb-depths4,8,16,32make在配置./configure中-qvfb用来支持Virtualframebuffer,-depths4,8,16,32支持4位,8位,16位,32位的显示深度,此外还可以添加如-syestem-jpeg和-gif来提供对jpeg和gif的支持。配置系统同时还支持对特定平台系统选项的添加,但一般来讲,但凡支持framebuffer的Linux系统都可以使用“linux-generic-g++〞平台。详细的配置信息可以通过运行./configure--help命令来查看。第三步,通过运行Qt/Embedded自带的范例验证上面各工具软件包是否安装成功。范例程序是/root/2410sQt/qt-2.3.10/examples/launcher,运行步骤如下:●在宿主机〔本机〕的framebuffer上运行:cd$QTEDIR/examples/launcher●在Virtualframebuffer上运行:exportQTDIR=$QTEDIRexportPATH=$QTEDIR/bin:$PATHexportLD_LIBRARY_PATH=$QTEDIR/lib:$QT2DIR/lib:$LD_LIBRARY_PATHcd$QTEDIR/examples/launcherqvfb-width640-height480&sleep10./launcher-qws运行结果如图9.4所示:图9.4Qt/EmbeddedDemo程序

9.1.3Qt设计器简介

1.信号与槽信号与槽提供了对象间通信的机制。Qt的信号与槽机制那么不同,Qt的窗口在事件发生后会激发信号。例如,当一个按钮被单击时会激发clicked信号。程序员通过创立一个函数〔称做一个槽〕并调用connect()函数来连接信号,这样就可以将信号与槽连接起来。信号与槽机制不需要类之间相互知道细节,这使得开发代码可高度重用的类变得更加容易。因为这种机制是类型平安的,类型错误被当成警告并且不会引起崩溃。信号与槽连接的示意图如图9.5所示。如果一个退出按钮的clicked()信号被连接到一个应用程序的退出函数quit()槽,用户就可以单击退出键来终止这个应用程序。代码可以这样写:connect(button.SIGNAL(clicked()),qApp,SLOT(quit()));在Qt程序执行期间,是可以随时增加或撤销信号与槽的连接的。它是类型平安的,可以重载或重新实现,并且可以在类的public、protected或private区出现。图9.5信号与槽连接的示意图

例9.1:信号与槽连接的一个实例。如果要使用信号与槽机制,一个类必须继承QObject或它的一个子类,并且在定义这个类时包含Q_OBJECT宏。信号在signals区间里声明,而槽可以在publicslots,protectedslots或privateslots区间声明。以下是子类化QObject的一个定义信号与槽机制的类:classBankAccount:publicQObject{Q_OBJECTpublic:BankAccount(){curBalance=0;}intbalance()const{returncurBalance;}publicslots:voidsetBalance(intnewBalance);signals:voidbalanceChanged(intnewBalance);private:intcurBalance;};以下是槽函数setBalance()的定义:voidBankAccount::setBalance(intnewBalance){if(newBalance!=curBalance){curBalance=newBalance;emitbalanceChanged(curBalance);}}其中,语句emitbalanceChanged(curBalance)作用是当curBalance的值改变时,将新的curBalance值作为参数去激活信号balanceChanged()。关键字emit跟信号和槽一样是Qt提供的,会被C++预处理器转换成标准的C++代码。2.元对象编译器〔1〕元对象代码中的信号/槽机制、属性Qt工具包中有元对象编译器〔MetaObjectCompiler,moc〕。moc读取程序头文件并产生必要的支持信号与槽机制的代码。qmake产生的Makefiles会将moc自动参加进去,开发者无需编辑甚至无需查看这些产生的代码。元对象编译器读取一个C++源文件,假设发现其中的一个或多个类的声明中含有Q_OBJECT宏,它就会给这个使用Q_OBJECT宏的类生成另外一个包含元对象代码的C++源文件。尤其是,元对象代码对信号/槽机制、运行时类型信息和动态属性系统是需要的。一个被元对象编译器生成的C++源文件必须和这个类的实现一起被编译和连接〔或者它被包含到〔#include〕这个类的源文件中〕。如果用qmake来生成你的Makefile文件,当需要的时候,编译规那么中需要包含调用元对象编译器,所以你不需要直接使用元对象编译器。元对象编译器很典型地和包含下面这样情况的类声明的输入文件一起使用:classMyClass:publicQObject{Q_OBJECTpublic:

MyClass(QObject*parent=0,constchar*name=0);~MyClass();signals:voidmySignal();publicslots:voidmySlot();};

除了上述提到的信号和槽,元对象编译器还将实现对象属性。例9.2:下一个例子是元对象编译器实现对象属性。Q_PROPERTY宏声明了一个对象属性,而Q_ENUMS声明在这个类中的属性系统中可用的枚举类型的一个列表。在这种特殊的情况下,我们声明了一个枚举类型属性Priority,也被称为“priority〞,并且读函数为priority(),写函数为setPriority()。classMyClass:publicQObject{Q_OBJECTQ_PROPERTY(PrioritypriorityREADpriorityWRITEsetPriority)Q_ENUMS(Priority)public:MyClass(QObject*parent=0,constchar*name=0);~MyClass();enumPriority{High,Low,VeryHigh,VeryLow};voidsetPriority(Priority);Prioritypriority()const;};〔2〕Makefile中自动使用元对象编译器的方法建议自动使用元对象编译器。在你的程序的Makefile文件中参加一些规那么,make就会在需要的时候运行元对象编译器和处理元对象编译器的输出。建议使用Trolltech的自由makefile生成工具qmake,来生成你的Makefile。这个工具可以识别方法一和方法二风格的源文件,并建立一个可以做所有必要的元对象编译操作的Makefile。另一方面,如果想自己建立Makefile,下面是如何包含元对象编译操作的一些提示。对于在头文件中声明了Q_OBJECT宏的类,如果使用GNU的make的话,这是一个很有用的makefile规那么:moc_%.cpp:%.hmoc$<-o$@如果你想更方便地写makefile,你可以按下面的格式写单独的规那么:moc_NAME.cpp:NAME.hmoc$<-o$@必须记住要把moc_NAME.cpp添加到你的SOURCES〔你可以用你喜欢的名字替代〕变量中并且把moc_NAME.o或者moc_NAME.obj添加到你的OBJECTS变量中。〔当我们给我们的C++源文件命名为.cpp时,元对象编译器并不留意,所以只要你喜欢,你可以使用.C、.cc、.CC、.cxx或者甚至.c++。〕对于在实现文件〔.cpp文件〕中声明Q_OBJECT的类,建议使用下面的makefile规那么:NAME.o:NAME.mocNAME.moc:NAME.cppmoc-i$<-o$@这将会保证make程序会在编译NAME.cpp之前运行元对象编译器。然后你可以把#include"NAME.moc"放在NAME.cpp的末尾,这样在这个文件中的所有的类声明被完全地知道。〔3〕调用元对象编译器moc这里是元对象编译器moc所支持地命令行选项:-ofile——将输出写到file而不是标准输出。-f——强制在输出文件中生成#include声明。-i——不在输出文件中生成#include声明。-nw——不产生任何警告。不建议使用。-ldbg——把大量的lex调试信息写到标准输出。-ppath——使元对象编译器生成的〔如果有生成的〕#include声明的文件名称中预先考虑到path/。-qpath——使元对象编译器在生成的文件中的qt#include文件的名称中预先考虑到path/。3.Qt常用部件及简单应用

Qt中有3个主要的基类:QObject、QTimer和QWidget。窗口部件是QWidget或其子类的实例,自定义的部件那么通过子类继承得来,继承关系如图9.6所示。(1)根本部件例9.3:下面的程序代码是一个简单的HelloWorld例子。它只包含建立和运行Qt应用程序所需要的最少的代码。#include<qapplication.h>#include<qpushbutton.h>intmain(intargc,char**argv){QApplicationa(argc,argv);图9.7例9.3程序的快照

QPushButtonhello("Helloworld!",0);hello.resize(100,30);a.SetMainWidget(&hello);hello.show();returna.exec();}

例9.4:下面的程序代码是一个调用退出的例子。图9.8是程序的快照。程序代码如下。#include<qapplication.h>#include<qpushbutton.h>#include<qfont.h>intmain(intargc,char**argv)图9.8例9.4程序的快照{QApplicationa(argc,argv);QPushButtonquit("Quit",0);quit.resize(75,30);quit.setFont(QFont("Times",18,QFont::Bold));QObject::connect(&quit,SIGNAL(clicked()),&a,SLOT(quit()));a.setMainWidget(&quit);quit.show();returna.exec();}

例9.5:下面的程序代码是一个自定义窗口部件的例子。

Clock在clock.h中这样定义:#include<qlcdnumber.h>classClock:publicQLCDNumber{public:图9.9数字钟部件Clock(QWidget*parent=0,constchar*name=0);protected:voidtimerEvent(QTimerEvent*event);private:voidshowTime();boolshowingColon;};clock.h中声明的函数在clock.cpp中实现:#include<qdatetime.h>#include"clock.h"Clock::Clock(QWidget*parent,constchar*name):QLCDNumber(parent,name),showingColon(true){showTime();startTimer(1000);}voidClock::timerEvent(QTimerEvent*){showTime();}voidClock::showTime(){QStringtimer=QTime::currentTime().toString().left(5);if(!showingColon)time[2]='';display(time);showingColon=!showingColon;}文件clock.h和clock.cpp完整地声明并实现了Clock部件,这个部件可立即投入使用。#include<qapplication.h>#include"clock.h"intmain(intargc,char**argv){QApplicationapp(argc,argv);Clock*clock=newClock;app.setMainWidget(clock);clock->show();returnapp.exec();}(2)图形图象部件类

〔3〕主窗口及菜单部件下面是对图9.10所示的主窗口及菜单的主要程序代码作简要介绍。QMainWindow*mw=newQMainWindow;QTextEdit*edit=newQTextEdit(mw,"editor");图9.10主窗口及菜单图edit->setFocus();mw->setCaption("MainWindow");mw->setCentralWidget(edit);mw->show();

图9.10主窗口及菜单图

如果我们已经直接创立了一个QMainWindow实例,我们可以很容易地通过传递QMainWindow实例代替作为父对象的this指针来添加菜单项和工具条。QPopupMenu*help=newQPopupMenu(this);menuBar()->insertItem("&Help",help);help->insertItem("&About",this,SLOT(about()),Key_F1);这里我们添加了有一个菜单项的新菜单。这个菜单已经被插入QMainWindow默认提供的并且可以通过menuBar()函数访问的菜单条。当这个菜单项被点击时,这个槽被调用。QToolBar*fileTools=newQToolBar(this,"fileoperations");fileTools->setLabel("FileOperations");QToolButton*fileOpen=newQToolButton(openIcon,"OpenFile",QString::null,this,SLOT(choose()),fileTools,"openfile");e=newQTextEdit(this,"editor");e->setFocus();setCentralWidget(e);statusBar()->message("Ready",2000);创立完菜单和工具条,我们创立一个大的中央窗口部件的实例,给它焦点并且把它设置为主窗口的中央窗口部件。在这个实例中,我们也已经通过statusBar()函数设置好了状态条,显示初始信息两秒。注意你可以添加其它的窗口部件到状态条重,例如标签,来显示更多的状态信息。通常我们想让一个工具条按钮和一个菜单项同步。例如,如果用户点击“加粗〞工具条按钮,我们希望“加粗〞菜单项被选中。这种同步可以通过创立操作并且把它们添加到工具条和菜单上来自动实现。QAction*fileOpenAction;fileOpenAction=newQAction("OpenFile",QPixmap(fileopen),"&Open",CTRL+Key_O,this,"open");connect(fileOpenAction,SIGNAL(activated()),this,SLOT(choose()));这里我们创立了一个有图标的操作,这个图标要用在这个操作所被添加到的菜单和工具条中。我们也给定这个操作一个菜单名称“&Open〞和一个键盘快捷键。我们已经建立的这个连接在用户点击这个菜单项或者这个工具条按钮时将会被使用。QPopupMenu*file=newQPopupMenu(this);menuBar()->insertItem(“&File〞,file);fileOpenAction->addTo(file);上面这局部提取显示一个弹出菜单的创立。我们把这个菜单添加到QMainWindow的菜单条中并且添加我们的操作。QToolBar*fileTools=newQToolBar(this,"fileoperations");fileTools->setLabel("FileOperations");fileOpenAction->addTo(fileTools);这里我们创立一个作为QMainWindow的子对象的工具条并且把我们的操作添加到这个工具条中。主窗口的菜单条默认是固定的〔在上面〕。如果你想有一个可移动的菜单条,创立一个QMenuBar作为一个在它自己可移动的锚接窗口中可伸展的窗口部件并且限制这个锚接窗口只在Top或Bottom锚接区域存在:QToolBar*tb=newQToolBar(this);addDockWindow(tb,tr("Menubar"),Top,FALSE);QMenuBar*mb=newQMenuBar(tb);mb->setFrameStyle(QFrame::NoFrame);tb->setStretchableWidget(mb);setDockEnabled(tb,Left,FALSE);setDockEnabled(tb,Right,FALSE);有多个锚接窗口的应用程序可以选择为了以后〔例如,在下个对话中〕恢复当前的锚接窗口布局来把它们保存起来。你可以通过使用QMainWindow的流操作符来做到这点。为了保存所有锚接窗口的布局和位置,请这样做:QFilef(filename);if(f.open(IO_WriteOnly)){QTextStreamts(&f);ts<<*mainWindow;f.close();}为了恢复锚接窗口的位置和大小〔通常是当应用程序再次开始〕,请这样做:QFilef(filename);if(f.open(IO_ReadOnly)){QTextStreamts(&f);ts>>*mainWindow;f.close();}(4)布局

Qt提供了3种布局管理器的类:QHBoxLayout、VBoxLayout和QgridLayout。QHBoxLayout将其管理的部件组织在一个从左到右的水平行上。QVBoxLayout将其管理的部件组织在一个从上到下的垂直列上。QGridLayout将其管理的部件组织在一些网格单元中。QWidget::sizeHint()和QWidget::minimumSizeHint()会根据内容返回部件的首选尺寸和最小首选尺寸。

4.Qt设计器界面

在Qt/Embedded的安装目录的../下,安装了Qt/X112.3.2中自带的v1.1版的QtDesigner。因此,只需键入./designer(回车),即可启动Qt设计器设计,如图9.11所示。

9.1.4QtDesigner实例及Qt/E的交叉编译

我们编写的窗体主要包括下面几个部件:一个CheckBox,一个PushButton,一个Silder,一个dial,一个LCDNumber,一个ProgressBar;要实现的功能是点击PushButton会选中CheckBox;拖动Silder同时,Dial、LCDNumber和ProgressBar会随其发生变化。

在QtDesigner的开发环境的开发过程如下:

〔1〕启动QtDesigner,即./designer(回车),在File采单下选New,再在出现的新建对话框下选Form后,弹出如图9.12的对话框。〔2〕创立和初始化子部件利用QtDesigner的菜单或工具栏上的按钮把本例窗体中所需的部件放入窗体内,并在属性栏中对各部件的属性按要求设置。

图9.12QtDesignerV1.1

〔3〕设置子部件的布局在布置部件时,先设置Tab键的次序,我们可以不必要非常准确的放好每个部件的位置,因为Qt设计器自带的layout功能回自动帮我们实现。将全部部件都选中,使用Layout|inaGird网格布局。具体的如图9.13和图9.14所示。

图9.13布局部件图9.14使用Layout布局管理后

〔4〕建立信号与插槽的连接建立连接要用到connectSingal/Solts〔F3〕按钮,点击后只要用鼠标连接两个部件就可以建立它们之间的连接。建立两个部件的之间的连接图3.15所示。连接建立以后会自动出现如图3.16所示编辑连接〔EditConnection〕的对话框:依次建立各个部件之间的连接后,可以通过点击Edit|Connections来查看各个部件的连接情况,还可以通过点击Edit菜单来对连接进行修改。图3.17所示了连接关系。图3.15建立两个部件的连接

图3.16编辑连接对话框

图3.17连接关系图

Qt取消了传统的“编译、连接和运行〞的方式,直接提供了Preview功能,图3.18所示的是对应Preview菜单下QtDesigner的不同风格的显示等。图3.18QtDesigner的不同风格

〔5〕生成窗体类的源文件使用Qt提供的uic工具可以方便的通过这个文件来生成.h文件和.cpp文件,假设我们将上面的窗体保存为win.ui,那么具体操作如下:uic–owin.hwin.uiuic–owin.cpp-implwin.hwin.ui完成了这两个命令后,我们会发现在我们的当前目录中会有win.h与win.cpp两个文件,只有这两个文件程序还是不能运行的,我们还需要再创立一个main.cpp文件。〔6〕编写主函数main〔〕我们使用vi编辑器手工编写这个文件。vimain.cpp具体代码如下:#include"win.h"#include<qapplication.h>intmain(intargc,char**argv){QApplicationa(argc,argv);Form1form;form.setCaption("Form");a.setMainWidget(&win);form.show();returna.exec();}〔7〕生成工程文件每一个Qt程序都对应着一个工程文件,因为tmake工具要借此工程生成相应的Makefile文件。生成工程文件需要使用progen工具,它的位置在$TMAKEDIR/bin下,使用progen生成工程文件的方法如下:progen–tapp.t–o生成的这个工程文件是可以被修改的,可以编辑里面的头文件、源文件等内容。因此需要先做些pro相关介绍。.pro文件非常简单,有固定的格式,可以随意添加或删减各个选项。设置一个选项如下:HEADERS=gui.hxml.hurl.h如果选项不能在一行内写完的话,可以使用‘\’来分割它,例如:HEADERS=gui.hxml.hurl.h由于工程文件使用空白来分割各个元素,所以不能将带有空格的元素用在工程文件中。但是对INCLUDEPATH选项不同,它使用“;〞来分割元素,也可以包含代空格的元素,例如:INCLUDEPATH=C:\ProgramFiles\DBLib\Include;C:\qt\include针对本工程的文件为:TEMPLATE =appCONFIG +=qtwarn_onreleaseHEADERS =progressbar.hSOURCES =main.cppprogressbar.cppTARGET =progressbarDEPENDPATH=../../includeREQUIRES=large-config工程文件中描述产生了makefile文件的配置模板是app.t,配置选项是“qtwarn_onrelease〞。●配置模板。tmake发行版本中makefile有app.t、lib.t和subdirs.t3个模板。应用程序模板〔app.t〕用来创立生成发布使用程序的makefile,此模板支持以下选项。HEADERS源头文件;SOURCES原程序文件;TARGET目标文件;DESTDIR放置目标文件的目录;DEFINES告知C预处理编译器翻开“-D〞选项;INCLUDEPATH设置库文件路径〔-I选项〕;DEPENDPATH设置相关搜索路径;DEF_FILEWINDOWS专用:链接一个.def文件;RC_FILEWINDOWS专用:使用.rc文件〔编译为.res〕;RES_FILEWINDOWS专用:链接.res文件。●Makefile配置选项。配置选项可以用在app.t和lib.t中,它们用来指示使用什么编译选项和连接什么库文件。控制编译选项用来选择编译类型:release用来生成最优化编译〔用于发布的软件〕,如果选了“debug〞,此选项忽略;debug调试时使用该选项,翻开debug功能;warn_on翻开警告选项,产生比正常情况下多的警告。如果选了“warn_off〞,此选项忽略;warn_off关闭警告选项。控制程序/库文件类型:qt如果是生成qt程序,翻开它〔该选项是默认支持的〕;opengl编译OPENGL时使用;thread用来支持线程;X11用来支持X11;windows支持WINDOWS;console对象是WINDOWS下的控制台程序;dll生成动态连接库时使用;staticlib生成静态连接库时使用。举个例子,假设我们的progressbar程序需要qt和opengl支持,并且还要翻开debug,那么我们的配置就该是这样的:TEMPLATE=appCONFIG

=qtopengldebugHEADERS

=progressbar.hSOURCES

=progressbar.cppmain.cppTARGET

=progressbar8〕生成makefiletmake是一个很好用的生成和管理makefile的工具,它是由Trolltech公司自行开发的。tmake将我们从烦琐的生成makefile的过程中解脱出来,只要很简单的步骤就可以生成makefile了。tmake的使用方法如下:tmake[选项]projectfilesorprojectsettings选项:-eexpr执行perl表达式,忽略模板文件;-nodepend不产生关联信息;-ofile指定输出文件〔常用〕;-tfile制定模板文件〔覆盖工程文件中的模板变量〕;-unix强制使用UNIX模式;-v翻开debug和warn_on选项;-win32强制使用win32模式。默认的工程文件后缀名为“.pro〞,默认的模板文件后缀为“.t〞。如果用户不指定它们的话,tmake会自动为用户加上。在使用tmake工具前,必须确定使用的编译器和查看相应的环境变量是否正确。选定编译器:假设要编译在宿主机上运行的Qt程序,编译器应该为“linux-x86-g++〞;假设要编译在目标机〔开发板〕上运行的Qt程序,编译器应该为“linux-arm-g++〞,编译在开发板上运行的Qt程序还需修改tmake配置文件,键入下面命令:vi$TMAKEDIR/lib/qws/linux-arm-g++/tmake.conf将其中“TMAKE_LINK=arm-linux-gcc〞修改为“TMAKE_LINK=arm-linux-g++〞;“TMAKE_LINK_SHLIB=arm-linux-gcc〞修改为“TMAKE_LINK_SHLIB=arm-linux-g++〞。设置或查看环境变量:假设是新进入终端,需要设置Qt环境变量和tmake路径参数,可以建立一个脚本文件,然后运行脚本程序。#my_env.shcd/root/2410sQtexportTMAKEDIR=$PWD/tmake-1.13exportTMAKEPATH=$TMAKEDIR/lib/linux-g++:$TMAKEPATH#exportTMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g++:$TMAKEPATH--(编译在宿主机上运行的Qt程序,本条语句前的注译号“#〞取消)#exportTMAKEPATH=$TMAKEDIR/lib/qws/linux-arm-g++:$TMAKEPATH#--〔编译在开发板上运行的Qt程序本条语句前的注译号“#〞取消〕cd$QT2DIRexportQTDIR=$QT2DIRexportPATH=$QTDIR/bin:$PATHexportLD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATHcd$QTEDIRexportQTDIR=$QTEDIRexportPATH=$QTDIR/bin:$PATHexportLD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH在终端的命令行中输入下面的命令来运行脚本程序:source./my_env.sh完成了上面的环境变量的设置,并用echo命令检查无误以后,就可以使用tmake工具来生成我们需要的Makefile文件,在终端中键入下面的命令:tmake-omakefileprogressbar.pro就自动生成了一个makefile,使用这个makefile编译所编写的程序就可以了。

〔9〕编译链接工程最后在命令行下输入“make〞命令,对整个工程进行编译链接,生成的二进制文件就是progressbar可执行文件。$cdprogressbar$make〔10〕程序运行对生成的二进制文件单独运行:$qvfb-width640-height480&

$progressbar–qws运行结果如图3.19所示。图3.19在Qtopia下运行的progressbar程序9.2Qtopia虚拟平台及在S3C2410s开发板上移植

9.2.1构建本机Qtopia虚拟平台构建本机Qtopia虚拟平台,本书中构建的Qtopia虚拟平台所需的设备和软件是:硬件:PC端主机,UP-NETARM2410-S目标板〔北京博创兴业科技〕;软件:RedhatLinux9.0forPC+minicom+EmbededLinuxfor2410tmake-1.13.tar.gz;qtopia-free-2.1.1.tar.gz;〔注:北京博创提供的qtopia安装包是qtopia-free-source-2.1.1.tar.bz2〕qt-embedded-2.3.10.tar.gz;qt-x11-2.3.2.tar.gz将所需的上面四个文件拷贝到/root/qtopia目录下,在宿主机上建立虚拟的Qtopia环境需要以下几个步骤:1.解压缩安装文件:①解压缩qtopia:tar-jxfqtopiaexportQPEDIR=$PWD/qtopia②解压缩tmake:tar-xzftmake-1.13.tar.gzexportTMAKEDIR=$PWD/tmake-1.13③解压缩Qt/X11:tar-xzfqt-x11-2.3.2.tar.gz④j解压缩Qt/Embedded:tar-xzfqt-embedded-2.3.10-free.tar.gz2.BuildQt/X11:cd$QT2DIRexportTMAKEPATH=$TMAKEDIR/lib/linux-g++exportQTDIR=$QT2DIRexportPATH=$QTDIR/bin:$PATHexportLD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH./configure-no-xft〔注:出现选项后输入yes,后回车,其余选默认〕makemkdir$QTEDIR/bincpbin/uic$QTEDIR/bin/3.BuildQvfb:exportTMAKEPATH=$TMAKEDIR/lib/linux-g++exportQTDIR=$QT2DIRexportPATH=$QTDIR/bin:$PATH:$TMAKEDIR/binexportLD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATHcd$QTEDIR/tools/qvfbtmake-oMakefilemakemvqvfb$QTEDIR/bin/4.Buildlibqte:cd$QTEDIRexportTMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g++exportQTDIR=$QTEDIRexportPATH=$QTDIR/bin:$PATHexportLD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATHcp-f$QPEDIR/src/qt/qconfig-qpe.hsrc/tools/./configure-system-jpeg-no-xft-qconfigqpe-qvfb-depths4,8,16,32makesub-src5.BuildQtopia:cd$QPEDIRexportQTDIR=$QTEDIRexportPATH=$QPEDIR/bin:$PATH./configuremake可以通过“env〞命令来检查下面的环境变量,也可以用下面的方法来检查。echo$QPEDIR/root/qtopia/qtopiaecho$QTDIR/root/qtopiaecho$LD_LIBRARY_PATH/root/qtopia/qtopia-free-2.1.1/lib:/root/qtopiaecho$PATH/root/qtopia/qt-2.3.10/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin出现上面的结果就可以正常的显示Virtualframebuffer,我们可以输入下面的命令即可在Virtualframebuffer中实现Qtopia。Virtualframebuffer下的Qtopia如图3.20所示。图3-20Virtualframebuffer下的

cd$QPEDIR/binqvfb&sleep10./qpe.shQtopia还为我们在Qtopia平台上发布自己的应用程序提供了一个比较简便的方法,要想把我们的应用程序发布到Qtopia平台上,我们需要三个文件:

温馨提示

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

评论

0/150

提交评论