版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2次课MeeGo开发流程与开发基础
第2次课MeeGo开发流程与开发基础
1内容嵌入式应用开发流程嵌入式应用开发环境嵌入式应用开发流程嵌入式开发工具链MeeGo的开发工具链宿主机与仿真机环境配置QT知识
Qt介绍Qt安装基于QT的HelloWorld示例程序Qt中主要类的介绍Qt的信号槽机制Qt中主要控件介绍内容嵌入式应用开发流程2一、嵌入式应用开发流程嵌入式应用开发环境交叉开发编程语言嵌入式应用开发流程嵌入式开发工具链一、嵌入式应用开发流程嵌入式应用开发环境3
交叉开发通用计算机的软件开发一般都是以本地(Native)编译或开发的方式进行,嵌入式系统一般不支持本地环境开发,其软件开发通常采用交叉(Cross)开发的方式。交叉开发环境建立在宿主机(Host)上,宿主机又称开发机,一般是一台通用计算机,如PC。对应嵌入式系统称为目标(Target)机。目标机指各式各样的嵌入式设备,例如手机、掌上电脑等;或者是嵌入式厂商提供的一套专用于开发的评估板(evaluationboard),所以又称开发板;甚至是基于软件的模拟器。开发时使用宿主机上的交叉编译、汇编和链接工具形成可在目标机上执行的二进制代码,然后把可执行文件下载到目标机上运行。嵌入式系统开发过程中不仅编译(包括链接等步骤)采用交叉的方式,调试也常采用交叉的方式。 交叉开发通用计算机的软件开发一般都是以本地(Native)4交叉开发采用交叉开发的原因主要原因在于目标机上往往无法进行有效的本地编译。目标机硬件本身在开发过程中还不能使用或还不够稳定;目标机平台上缺乏完整的本地编译工具、环境;目标机系统本身性能不够导致编译太慢。嵌入式系统的软件编译,与Windows开发不一样,不仅要编译应用程序,还要编译相应的依赖库、操作系统内核等。所以一次完整的编译非常费时。而从硬件角度,决定编译速度的主要因素是CPU速度、内存容量和文件系统I/O速度。而这些方面在嵌入式系统上往往都要比PC差很多。这样会造成目标机系统上进行本地编译效率低下。综合以上多方面因素的考虑,嵌入式系统开发一般都采用交叉开发方式,如交叉编译(包括交叉链接)、交叉调试等。交叉开发采用交叉开发的原因5交叉开发宿主机和目标机的连接一般通过串口、并口、USB或以太网等连接线进行连接。交叉开发过程在宿主机上会安装用于嵌入式软件开发的一系列工具集,例如代码编辑工具、编译器、连接器、调试工具、软件配置管理工具等。开发者在宿主机一端完成代码编写和调试。交叉开发宿主机和目标机的连接6
交叉开发宿主机和目标机的差异体系结构的不同。宿主机和目标机通常是异构的。宿主机一般采用x86体系结构,但是目标机的体系结构则可能非x86的,如是ARM、MIPS、PowerPC等各式各样。处理能力不同。通常宿主机的处理速度、存储容量等会远远大于目标机。运行的操作系统不同。宿主机一般运行通用操作系统,而目标机通常运行各种嵌入式操作系统。输入输出方式不同。相对宿主机,目标机的输入输出功能可能比较单一。 交叉开发宿主机和目标机的差异7编程语言本书采用的主要语言由于C/C++拥有便于底层编程等诸多优点,目前C/C++为大多数嵌入式系统开发的首选语言。考虑到现实的发展状况,我们在后续章节的应用开发中首选语言也是C/C++。编程语言本书采用的主要语言8嵌入式应用开发流程典型的开发流程示意图编码阶段构建阶段部署阶段调优阶段嵌入式应用开发流程典型的开发流程示意图编码阶段构建阶段部署阶9嵌入式应用开发流程
开发流程主要分为如下几个阶段:1.编码阶段编码阶段是软件开发的开始,其任务是编写软件的源代码代码,使用的工具是各种编辑器。2.构建阶段构建阶段的任务是把代码转化成可以在嵌入式硬件上可执行程序的过程。此阶段包括包括编译,链接、定址和打包等步骤。3.部署阶段部署是把可执行的运行时映像或可执行文件部署到嵌入式设备上,让嵌入式设备在系统上电后可以启动并加载开发者编写的代码。4.调优阶段(调试、优化阶段)此阶段主要是对软件进行调试和性能优化。调试:即使再有经验的软件工程师,要编写完全没有错误的程序也是不可能的。嵌入式软件调试的效率都比较低,因为即使改动一行代码,都可能需要把编译、链接、重定位、烧写、下载等步骤完整走一遍,这也是调优阶段最显著的特点。快速地定位到问题可以节省大量的时间。嵌入式应用开发流程开发流程主要分为如下几个阶段:10嵌入式应用开发流程4.调优阶段(调试、优化阶段)优化对于软件产品最低目标是能正确的运行,还需要优化,优化目标主要包括是速度性能、功耗性能、空间性能等方面,达到运行更快,更节能,占用空间更小等目的。借助工具分析程序代码,精确分析性能瓶颈,据此引导和建议开发者进行改进,此过程常称为代码剖析(codeprofiling),对应的工具常常称为剖析器(profiler)或性能分析器(performanceanalyzer)、Intel的VTune。嵌入式应用开发流程4.调优阶段(调试、优化阶段)11典型的开发工具链工具链的概念在嵌入式软件开发的各个阶段都相应的工具帮助用户来完成其工作,这些工具形成与开发流程对应的工具链(Toolchain),又称工具集。典型的开发工具链工具链的概念12开发阶段功能描述典型工具例子编辑编辑程序的源代码Vi、Emacs、Windows记事本编译、链接将源程序编译、链接成可执行的二进制文件gcc、icc烧写把可执行的二进制程序烧写到嵌入式系统内部的ROM或Flash中,以便系统开机即运行。JFlash、SJflash调试在程序运行的时候动态地跟踪程序的运行状态。查看程序的执行情况,以找出程序错误的原因。gdb、idb、KernelDebugger优化分析程序性能,帮助开发者建立运行更快,更节能,占用空间更小程序gprof、VTune测试帮助测试人员自动寻找程序中存在的错误,减少人力花费CETK验证验证程序逻辑上的正确性和常见错误,特别是对某些难于测试和调试的环境ApplicationVerifier模拟/仿真模拟和仿真嵌入式软硬件运行环境,便于开发者开发和调试VmWare、DeviceEmulator嵌入式软件开发典型工具开发阶段功能描述典型工具例子编辑编辑程序的源代码Vi、Ema13典型的开发工具链Moblin平台下的工具集在Linux、Moblin平台下最有名的工具集是GNU和Intel两家。由于GNU工具集的跨平台、开放性、使用广、与其他工具兼容等特点,使得其成为嵌入式应用开发的首选工具.GNU工具链GNU的开发工具都是免费的,遵循GPL协议,任何人都可以从网上获取。同样GNU也为嵌入式系统、x86系统下的软件开发提供了完整的工具链。这些工具包含编译器、汇编器、链接器、调试工具等。这些工具它们可以以命令行形式单独运行,也可以集成到Eclipse等集成开发环境中。功能组件说明编辑Vi、Emacs、Ed等文本编辑器,用于编辑源代码编译、链接gcc一组多种编程语言的编译器调试gdb调试器优化gprof分析程序性能,帮助开发者建立运行更快的程序项目管理make自动管理软件编译系统构建autotools构建项目所需的材料和文件典型的开发工具链Moblin平台下的工具集功能组件说明编辑V14典型的开发工具链GNU工具链生成目标文件的几种途径方法一:使用gcc命令分别编译、链接各源代码文件,生成可执行的目标文件。方法二:用户编写makefile等配置文件,然后用make一步生成可执行的目标文件。方法三:使用系统构建自动工具autotools制作makefile等配置文件,然后用make一步生成可执行的目标文件。典型的开发工具链GNU工具链生成目标文件的几种途径15二、MeeGo的开发工具链交叉开发:宿主机:生成目标可执行文件和调试的机器,一般是一台PC目标机:MeeGo运行平台,手机、上网本或者仿真器(qemu)MeeGo交叉开发的实际环境二、MeeGo的开发工具链交叉开发:MeeGo交叉开发的实际16MeeGo交叉开发的仿真环境仿真仿真的情景仿真(1)仿真(2)二、MeeGo的开发工具链MeeGo交叉开发的仿真环境仿真仿真的情景仿真(1)仿真(217几个术语1、QEMUMeeGo的虚拟机(emulator)仿真环境之一或者叫仿真器。2、Xephyr(/SDK/Docs/1.1/MeeGo_SDK_with_Xephyr)Xephyr是一种运行Linux下的MeeGo仿真器。3、MADDEMADDE(MeeGoApplicationDevelopandDebugEnvironment(background))isatoolthatassistsinthedownloadandinstallationoftheTarget.(MeeGo应用开发与调试环境)是一个帮助下载与安装目标机的工具。4、mad-admin"mad-admin"istheMADDEcommand-linetool.YoucaninstallmultipleTargetsandswitcheasilybetweentheminQtCreator(describedlater).——我的理解:mad-admin是一个安装MADDE和查看其安装信息的命令行工具。5、xhost+accesscontroldisabled,clientscanconnectfromanyhost:开放全部用户和IP地址用户远程使用Xserver的权限:几个术语1、QEMU18二、MeeGo的开发工具链3、宿主机Qt开发工具链:$ls-l/opt/meego/meego-sdk-qt/bin1、InstallingtheMeeGoSDK——安装对应CPU架构的编译工具链(1)$sudoapt-getinstallmeego-sdk2、InstallMeeGoTarget——安装对应CPU架构的编译工具链(2)$sudomad-admincreate-fmeego-netbook-ia32-1.1用来下载下载meego-core-ia32-madde-sysroot-1.1-fs.tar.bz2CreateaMeeGotargetusingMADDE二、MeeGo的开发工具链3、宿主机Qt开发工具链:1、In19三、宿主机与仿真机环境配置2、配置QTCreator1、打开上网本仿真器(目标机)$madremote-rmeego-netbook-ia32-qemu-1.1.20101031.2037-sda-runtimepoweron登录到目标机里面去:$sshmeego@–p6666进入目标机(不管是仿真器还是实际机都要执行如下步骤),运行如下命令:$xhost+3、配置工程的build环境4、编译生成MeeGo目标文件在QTCreator环境里面打开一个.pro工程文件5、选择目标机Run环境6、部署运行与停止运行三、宿主机与仿真机环境配置2、配置QTCreator1、打20四、QT介绍Qt介绍Qt安装基于QT的HelloWorld示例程序Qt中主要类的介绍Qt的信号槽机制Qt中主要控件介绍21四、QT介绍Qt介绍2121Qt介绍Qt是跨平台的应用程序和UI框架,包括跨平台类库集成开发环境跨平台IDE一次性开发可在不同桌面和嵌入式操作系统部署22Qt介绍Qt是跨平台的应用程序和UI框架,包括2222Qt特征一面向对象Qt具有模块设计和注重软件构件或元素的可重用性的特点构件支持Qt提供信号signal和槽slot的概念,支持对象之间在彼此不知道对方的情况下合作,使得Qt适合构件编程友好的联机帮助Qt提供了大量的联机参考文件23Qt特征一面向对象2323Qt特征二便利性Qt是跨平台的GUI工具包,对编程者隐藏了处理不同窗口系统时的潜在问题国际化Qt为本地化应用提供了完全的支持,所有用户界面文本都可以基于消息翻译表被翻译成各国语言24Qt特征二便利性2424Qt特征三丰富的API函数Qt为开发者提供了大量的函数可用户化外观Qt支持主题,基于Qt的应用程序能够在Windows外观,Motif外观以及其他一些用户外观主题之间切换完整的组件工具Qt编程的基本模块叫做组件,Qt含有用来创建专业外观用户界面需要的所有组建25Qt特征三丰富的API函数2525Qt介绍WhousesQt?WritecodeoncetotargetmultipleplatformsCreateamazinguserexperienceDomorewithlessandfasterBlendwebandnativecodeinasingleapplication26Qt介绍WhousesQt?2626QtSDKQtSDK27QtSDKQtSDK2727Qt中主要的类介绍QObject QObject类是所有能够处理signal,slot和事件的Qt对象的基类,原型如下:QObject::QObject(Qobject*parent=0,constchar*name=0) 在上面的函数中,如果parent为0则构造一个无父的对象;如果对象是一个组件,则它会成为顶层窗口。28Qt中主要的类介绍QObject2828Qt中主要的类介绍2.QApplicationQApplication类负责GUI应用程序的控制流和主要的设置,它包括主事件循环体,负责处理和调度所有来自窗口系统和其他资源的事件处理应用程序的开始,结束以及会话管理QApplication是QObject类的子类29Qt中主要的类介绍2.QApplication2929Qt中主要的类介绍3.QwidgetQWidget是所有用户接口对象的基类,继承了QObject类的属性组件是用户界面的单元组成部分,接收鼠标,键盘和从其它窗口系统来的事件QWidget类有很多成员函数,但一般不直接使用,而通过子类继承来使用其函数功能QWidget是QObject类的子类30Qt中主要的类介绍3.Qwidget3030信号和槽信号和槽机制是Qt的一个主要特征,是Qt与其它工具包最不相同的部分。在图形用户界面编程中,经常会出现窗口的一个部件发生的变化会被通知给另一个部件。Qt采用信号和槽实现对象部件之间的通信31信号和槽信号和槽机制是Qt的一个主要特征,是Qt与其它工具包31信号和槽的声明一 在Qt程序设计中,包含signals和slot的类都要加上Q_OBJECT的定义。下面给出一个在类中定义signal和slot的例子classStudent:publicQobject{
Q_OBJECT public: Student(){myMark=0;} intgetMark()const{returnmyMark;}
publicslots: voidsetMark(intnewMark);
signals: voidmarkChanged(intnewMark); private: intmyMark;}32信号和槽的声明一 在Qt程序设计中,包含signals和sl32信号和槽的声明二Signal的发出一般在事件的处理函数中,利用emit发出signal,下面的例子中在事件处理结束后发出signal
voidStudent::setMark(intnewMark){ if(newMark!=myMark){ myMark=newMark;
emitmarkChanged(myMark); }}33信号和槽的声明二Signal的发出一般在事件的处理函33信号和槽的连接一 在signal和slot声明以后,需要使用connect()函数将它们连接起来。Connect()函数属于QObject类的成员函数,能够连接signal和slot,也能够连signal和signal。函数原型如下
boolconnect(constQObject*sender,constchar*signal,constQObject*receiver,constchar*slot)其中第一个和第三个参数指出signal和slot属于的对象或组件34信号和槽的连接一 在signal和slot声明以后,需要使用34信号和槽的连接二 使用connect()函数进行连接的时候,还需要用到SIGNAL()和SLOT()两个宏,使用方法如下:
QLabel*label=newQLabel; QScrollBar*scroll=newQScrollBar; QObject::connect(scroll,SIGNAL(valueChanged(int)),label,SLOT(setNum(int)));35信号和槽的连接二 使用connect()函数进行连接的时候,35信号和槽的连接方式一同一个信号连接到多个槽
connect(slider,SIGNAL(valueChanged(int)),spinBox,SLOT(setValue(int))); connect(slider,SIGNAL(valueChanged(int)),this,SLOT(updateStatusBarIndicator(int)));多个信号连接到同一个槽
Connect(lcd,SIGNAL(overflow()),this,SLOT(handleMathError()));Connect(calculator,SIGNAL(divisionByZero()),this,SLOT(handleMathError()));36信号和槽的连接方式一同一个信号连接到多个槽3636信号和槽的连接方式二一个信号连接到另外一个信号
connect(lineEdit,SIGNAL(textChanged(constQstring&)),this,SLOT(updateRecord(constQstring&)))取消一个连接
disconnect(lcd,SIGNAL(overflow()),this,SLOT(handleMathError())); 取消一个连接不是很常用,因为Qt会在一个对象被删除后自动取消这个对象所包含的所有连接37信号和槽的连接方式二一个信号连接到另外一个信号3737Qt安装Qt下载/downloads38Qt安装Qt下载38Qt安装下载安装文件Qt_SDK_Lin32_offline_v1_1_beta_en.run,在linux上安装步骤如下:1.添加执行权限chmodu+xQt_SDK_Lin32_offline_v1_1_beta_en.run2.运行安装文件./Qt_SDK_Lin32_offline_v1_1_beta_en.run3.添加环境变量将Qt安装目录下的bin目录加入到环境变量PATH中39Qt安装下载安装文件Qt_SDK_Lin32_offline39HelloWorld程序实例创建目录mkdir/examples/hello创建源文件touchhello.cpp编写源文件vihello.cpp40HelloWorld程序实例创建目录mkdir/exa40HelloWorld程序实例切换到hello目录cd/examples/hello创建平台独立的工程文件projectfileqmake–project创建平台独立的Makefile文件qmake编译工程make运行程序./hello41HelloWorld程序实例切换到hello目录cd41Qt对话框对话框是一种特殊的窗口,一般用来提供反馈信息或从用户获取输入。给用户提供了同应用程序进行交互的方式42Qt对话框对话框是一种特殊的窗口,一般用来提供反馈信息或从用42Qt对话框模态对话框最普遍的对话框。在未消失前用户不能够与同一个应用程序的其他窗口进行交互,直到该对话框关闭。非模态对话框当对话框打开的同时,用户还可与同一应用程序的其他窗口进行交互。43Qt对话框模态对话框4343Qt对话框Qt对话框的类层次结构图44Qt对话框Qt对话框的类层次结构图4444几种Qt内置对话框介绍颜色对话框QColorDialog,允许用户选择设置颜色错误对话框QErrorDialog,显示错误信息文件对话框QFileDialog,允许用户选择一个或多个文件或目录字体对话框QFontDialog,允许用户选择、设置字体输入对话框QInputDialog,允许用户输入文本信息页设置对话框QPageSetupDialog,可配置与打印相关的页面设置进度对话框QProgressDialog,指示出一项操作的工作进度,而且提示用户该操作是否停滞打印对话框QPrintDialog,配置打印机相关选项45几种Qt内置对话框介绍颜色对话框QColorDialog,允45几种Qt内置对话框介绍颜色对话框QColorDialog,允许用户选择设置颜色错误对话框QErrorDialog,显示错误信息文件对话框QFileDialog,允许用户选择一个或多个文件或目录字体对话框QFontDialog,允许用户选择、设置字体输入对话框QInputDialog,允许用户输入文本信息页设置对话框QPageSetupDialog,可配置与打印相关的页面设置进度对话框QProgressDialog,指示出一项操作的工作进度,而且提示用户该操作是否停滞打印对话框QPrintDialog,配置打印机相关选项46几种Qt内置对话框介绍颜色对话框QColorDialog,允46查找对话框示例通过一个简单的查找对话框的实现了解Qt中对话框的创建过程,布局管理,信号和槽机制以及一些简单控件的使用47查找对话框示例通过一个简单的查找对话框的实现了解Qt中对话框47查找对话框示例头文件finddialog.h1#ifndefFINDDIALOG_H2#defineFINDDIALOG_H3#include<QDialog>4classQCheckBox;5classQLabel;6classQLineEdit;7classQPushButton;8classFindDialog:publicQDialog9{ 10Q_OBJECT11public: 12FindDialog(QWidget*parent=0);48查找对话框示例头文件finddialog.h4848查找对话框示例13signals: 14voidfindNext(constQString&str,Qt::CaseSensitivitycs); 15voidfindPrevious(constQString&str,Qt::CaseSensitivitycs);16privateslots: 17voidfindClicked(); 18voidenableFindButton(constQString&text);19private: 20QLabel*label; 21QLineEdit*lineEdit; 22QCheckBox*caseCheckBox; 23QCheckBox*backwardCheckBox; 24QPushButton*findButton; 25QPushButton*closeButton;26};27#endif
49查找对话框示例13signals:4949查找对话框示例12行FindDialog的构造函数是典型的Qt窗口部件类的定义方式。Parent参数指定了父窗口部件。该参数默认值是一个空指针,意味着该对话框没有父对象。13行开始的signal部分声明了当用户单击Find按钮时对话框发出的两个信号。50查找对话框示例12行FindDialog的构造函数是典型的Q50查找对话框示例1#include<QtGui>2#include"finddialog.h"3FindDialog::FindDialog(QWidget*parent)4:QDialog(parent)5{6label=newQLabel(tr("Find&what:"));7lineEdit=newQLineEdit;8label->setBuddy(lineEdit);9caseCheckBox=newQCheckBox(tr("Match&case"));10backwardCheckBox=newQCheckBox(tr("Search&backward"));11findButton=newQPushButton(tr("&Find"));12findButton->setDefault(true);13findButton->setEnabled(false);14closeButton=newQPushButton(tr("Close"));51查找对话框示例1#include<QtGui>5151查找对话框示例15connect(lineEdit,SIGNAL(textChanged(constQString&)),16this,SLOT(enableFindButton(constQString&)));17connect(findButton,SIGNAL(clicked()),18this,SLOT(findClicked()));19connect(closeButton,SIGNAL(clicked()),20this,SLOT(close()));
52查找对话框示例15connect(lineEdit,SI52查找对话框示例通过connect函数实现了信号和槽的连接只要行编辑器中的文本发生变化,就会调用私有槽enableFindButton当用户单击Find按钮时,会调用findClicked私有槽当用户单击Close时,对话框关闭53查找对话框示例通过connect函数实现了信号和槽的连接5353查找对话框示例21QHBoxLayout*topLeftLayout=newQHBoxLayout;22topLeftLayout->addWidget(label);23topLeftLayout->addWidget(lineEdit);24QVBoxLayout*leftLayout=newQVBoxLayout;25leftLayout->addLayout(topLeftLayout);26leftLayout->addWidget(caseCheckBox);27leftLayout->addWidget(backwardCheckBox);28QVBoxLayout*rightLayout=newQVBoxLayout;29rightLayout->addWidget(findButton);30rightLayout->addWidget(closeButton);31rightLayout->addStretch();32QHBoxLayout*mainLayout=newQHBoxLayout;33mainLayout->addLayout(leftLayout);34mainLayout->addLayout(rightLayout);35setLayout(mainLayout);36setWindowTitle(tr("Find"));37setFixedHeight(sizeHint().height());38}
54查找对话框示例21QHBoxLayout*topLeft54查找对话框示例Qt提供了布局管理器布局子窗口部件通过QHBoxLayout,QVBoxLayout和QGridLayout这三个布局的不同嵌套组合,就可以构建出相当复杂的对话框。55查找对话框示例Qt提供了布局管理器布局子窗口部件5555查找对话框示例39voidFindDialog::findClicked()40{41QStringtext=lineEdit->text();42Qt::CaseSensitivitycs= 43caseCheckBox->isChecked()?Qt::CaseSensitive:Qt::CaseInsensitive; 44if(backwardCheckBox->isChecked()){ 45emitfindPrevious(text,cs); 46}else{ 47emitfindNext(text,cs); 48}49}50voidFindDialog::enableFindButton(constQString&text)51{ 52findButton->setEnabled(!text.isEmpty());53}
56查找对话框示例39voidFindDialog::fin56查找对话框示例以上两个函数是对话框中用到的槽当用户单击Find按钮时,就会调用findClicked槽。而该槽会发射findPrevious或findNext信号,这取决于Searchbackward选项的取值只要用户改变了行编辑器中的文本,就会调用enableFindButton槽。如果在行编辑器中有文本,该槽就会启用Find按钮,否则它会禁用Find按钮57查找对话框示例以上两个函数是对话框中用到的槽5757查找对话框示例创建main.cpp文件测试FindDialog窗口部件1#include<QApplication>2#include"finddialog.h"3intmain(intargc,char*argv[])4{ 5QApplicationapp(argc,argv); 6FindDialog*dialog=newFindDialog; 7dialog->show(); 8returnapp.exec();9}
58查找对话框示例创建main.cpp文件测试FindDialo58Qt主窗口介绍应用程序的主窗口提供了用于构建应用程序用户界面的框架主窗口一般包括菜单栏,工具栏,状态栏,中央窗口部件等子控件在Qt中,通过子类化QMainWindow可以创建一个应用程序的主窗口59Qt主窗口介绍应用程序的主窗口提供了用于构建应用程序用户界面59Qt主窗口介绍60Qt主窗口介绍6060Qt主窗口介绍下面通过一个简单的代码分析了解Qt中主窗口的创建过程实现主窗口的源代码分别放在mainwindow.h和mainwindow.cpp中61Qt主窗口介绍下面通过一个简单的代码分析了解Qt中主窗口的创61Qt主窗口介绍Mainwindow.hclassMainWindow:publicQMainWindow{Q_OBJECTpublic:MainWindow(QWidget*parent=0);~MainWindow();privateslots:voidnewFile();voidopenFile();voidcut();voidcopy();private:voidcreateActions();voidcreateMenus();voidcreateStatusBar();voidcreateToolsBar();62Qt主窗口介绍Mainwindow.h6262Qt主窗口介绍private:QMenu*fileMenu;QMenu*editMenu;QAction*newAction;QAction*openAction;QAction*cutAction;QAction*copyAction;QToolBar*fileToolBar;QToolBar*editToolBar;};63Qt主窗口介绍private:6363Qt主窗口介绍在头文件中,将MainWindow类定义为QMainWindow的子类。像File->New这样的菜单项,在MainWindow中被实现为私有槽64Qt主窗口介绍在头文件中,将MainWindow类定义为QM64Qt主窗口介绍mainwindow.cppMainWindow::MainWindow(QWidget*parent):QMainWindow(parent){createActions();createMenus();createToolsBar();createStatusBar();}MainWindow类的构造函数,通过调用类的私有函数createActions();createMenus();createToolsBar();createStatusBar();分别创建主窗口的菜单栏,工具栏和状态栏65Qt主窗口介绍mainwindow.cpp6565菜单栏和工具栏Qt通过动作的概念简化了菜单和工具栏的编程一个动作action就是一个可以添加到任意数量的菜单和工具栏上的项创建菜单和工具栏一般包括如下步骤:创建并设置动作创建菜单并把动作添加到菜单上创建工具栏并把动作添加到工具栏上66菜单栏和工具栏Qt通过动作的概念简化了菜单和工具栏的编程6666菜单栏和工具栏创建动作voidMainWindow::createActions(){//actionsinfileMenunewAction=newQAction(tr("&New"),this);connect(newAction,SIGNAL(triggered()),this,SLOT(newFile()));openAction=newQAction(tr("&Open"),this);connect(openAction,SIGNAL(triggered()),this,SLOT(openFile()));//actionsineditMenucutAction=newQAction(tr("&Cut"),this);connect(cutAction,SIGNAL(triggered()),this,SLOT(cut()));copyAction=newQAction(tr("&Copy"),this);connect(copyAction,SIGNAL(triggered()),this,SLOT(copy()));}67菜单栏和工具栏创建动作6767菜单栏和工具栏创建菜单并将动作添加到菜单上voidMainWindow::createMenus(){fileMenu=menuBar()->addMenu(tr("&File"));fileMenu->addAction(newAction);fileMenu->addAction(openAction);editMenu=menuBar()->addMenu(tr("&Edit"));editMenu->addAction(cutAction);editMenu->addAction(copyAction);}68菜单栏和工具栏创建菜单并将动作添加到菜单上6868菜单栏和工具栏创建工具栏并将动作添加到工具栏上voidMainWindow::createToolsBar(){fileToolBar=addToolBar(tr("&File"));fileToolBar->addAction(newAction);fileToolBar->addAction(openAction);editToolBar=addToolBar(tr("&Edit"));editToolBar->addAction(cutAction);editToolBar->addAction(copyAction);}69菜单栏和工具栏创建工具栏并将动作添加到工具栏上6969状态栏创建状态栏voidMainWindow::createStatusBar(){locationLabel=newQLabel("XY");statusBar()->addWidget(locationLabel);}70状态栏创建状态栏7070Qt主窗口介绍创建main.cpp文件,测试主窗口的建立intmain(intargc,char*argv[]){QApplicationa(argc,argv);MainWindoww;w.show();returna.exec();}71Qt主窗口介绍创建main.cpp文件,测试主窗口的建立7171第2次课MeeGo开发流程与开发基础
第2次课MeeGo开发流程与开发基础
72内容嵌入式应用开发流程嵌入式应用开发环境嵌入式应用开发流程嵌入式开发工具链MeeGo的开发工具链宿主机与仿真机环境配置QT知识
Qt介绍Qt安装基于QT的HelloWorld示例程序Qt中主要类的介绍Qt的信号槽机制Qt中主要控件介绍内容嵌入式应用开发流程73一、嵌入式应用开发流程嵌入式应用开发环境交叉开发编程语言嵌入式应用开发流程嵌入式开发工具链一、嵌入式应用开发流程嵌入式应用开发环境74
交叉开发通用计算机的软件开发一般都是以本地(Native)编译或开发的方式进行,嵌入式系统一般不支持本地环境开发,其软件开发通常采用交叉(Cross)开发的方式。交叉开发环境建立在宿主机(Host)上,宿主机又称开发机,一般是一台通用计算机,如PC。对应嵌入式系统称为目标(Target)机。目标机指各式各样的嵌入式设备,例如手机、掌上电脑等;或者是嵌入式厂商提供的一套专用于开发的评估板(evaluationboard),所以又称开发板;甚至是基于软件的模拟器。开发时使用宿主机上的交叉编译、汇编和链接工具形成可在目标机上执行的二进制代码,然后把可执行文件下载到目标机上运行。嵌入式系统开发过程中不仅编译(包括链接等步骤)采用交叉的方式,调试也常采用交叉的方式。 交叉开发通用计算机的软件开发一般都是以本地(Native)75交叉开发采用交叉开发的原因主要原因在于目标机上往往无法进行有效的本地编译。目标机硬件本身在开发过程中还不能使用或还不够稳定;目标机平台上缺乏完整的本地编译工具、环境;目标机系统本身性能不够导致编译太慢。嵌入式系统的软件编译,与Windows开发不一样,不仅要编译应用程序,还要编译相应的依赖库、操作系统内核等。所以一次完整的编译非常费时。而从硬件角度,决定编译速度的主要因素是CPU速度、内存容量和文件系统I/O速度。而这些方面在嵌入式系统上往往都要比PC差很多。这样会造成目标机系统上进行本地编译效率低下。综合以上多方面因素的考虑,嵌入式系统开发一般都采用交叉开发方式,如交叉编译(包括交叉链接)、交叉调试等。交叉开发采用交叉开发的原因76交叉开发宿主机和目标机的连接一般通过串口、并口、USB或以太网等连接线进行连接。交叉开发过程在宿主机上会安装用于嵌入式软件开发的一系列工具集,例如代码编辑工具、编译器、连接器、调试工具、软件配置管理工具等。开发者在宿主机一端完成代码编写和调试。交叉开发宿主机和目标机的连接77
交叉开发宿主机和目标机的差异体系结构的不同。宿主机和目标机通常是异构的。宿主机一般采用x86体系结构,但是目标机的体系结构则可能非x86的,如是ARM、MIPS、PowerPC等各式各样。处理能力不同。通常宿主机的处理速度、存储容量等会远远大于目标机。运行的操作系统不同。宿主机一般运行通用操作系统,而目标机通常运行各种嵌入式操作系统。输入输出方式不同。相对宿主机,目标机的输入输出功能可能比较单一。 交叉开发宿主机和目标机的差异78编程语言本书采用的主要语言由于C/C++拥有便于底层编程等诸多优点,目前C/C++为大多数嵌入式系统开发的首选语言。考虑到现实的发展状况,我们在后续章节的应用开发中首选语言也是C/C++。编程语言本书采用的主要语言79嵌入式应用开发流程典型的开发流程示意图编码阶段构建阶段部署阶段调优阶段嵌入式应用开发流程典型的开发流程示意图编码阶段构建阶段部署阶80嵌入式应用开发流程
开发流程主要分为如下几个阶段:1.编码阶段编码阶段是软件开发的开始,其任务是编写软件的源代码代码,使用的工具是各种编辑器。2.构建阶段构建阶段的任务是把代码转化成可以在嵌入式硬件上可执行程序的过程。此阶段包括包括编译,链接、定址和打包等步骤。3.部署阶段部署是把可执行的运行时映像或可执行文件部署到嵌入式设备上,让嵌入式设备在系统上电后可以启动并加载开发者编写的代码。4.调优阶段(调试、优化阶段)此阶段主要是对软件进行调试和性能优化。调试:即使再有经验的软件工程师,要编写完全没有错误的程序也是不可能的。嵌入式软件调试的效率都比较低,因为即使改动一行代码,都可能需要把编译、链接、重定位、烧写、下载等步骤完整走一遍,这也是调优阶段最显著的特点。快速地定位到问题可以节省大量的时间。嵌入式应用开发流程开发流程主要分为如下几个阶段:81嵌入式应用开发流程4.调优阶段(调试、优化阶段)优化对于软件产品最低目标是能正确的运行,还需要优化,优化目标主要包括是速度性能、功耗性能、空间性能等方面,达到运行更快,更节能,占用空间更小等目的。借助工具分析程序代码,精确分析性能瓶颈,据此引导和建议开发者进行改进,此过程常称为代码剖析(codeprofiling),对应的工具常常称为剖析器(profiler)或性能分析器(performanceanalyzer)、Intel的VTune。嵌入式应用开发流程4.调优阶段(调试、优化阶段)82典型的开发工具链工具链的概念在嵌入式软件开发的各个阶段都相应的工具帮助用户来完成其工作,这些工具形成与开发流程对应的工具链(Toolchain),又称工具集。典型的开发工具链工具链的概念83开发阶段功能描述典型工具例子编辑编辑程序的源代码Vi、Emacs、Windows记事本编译、链接将源程序编译、链接成可执行的二进制文件gcc、icc烧写把可执行的二进制程序烧写到嵌入式系统内部的ROM或Flash中,以便系统开机即运行。JFlash、SJflash调试在程序运行的时候动态地跟踪程序的运行状态。查看程序的执行情况,以找出程序错误的原因。gdb、idb、KernelDebugger优化分析程序性能,帮助开发者建立运行更快,更节能,占用空间更小程序gprof、VTune测试帮助测试人员自动寻找程序中存在的错误,减少人力花费CETK验证验证程序逻辑上的正确性和常见错误,特别是对某些难于测试和调试的环境ApplicationVerifier模拟/仿真模拟和仿真嵌入式软硬件运行环境,便于开发者开发和调试VmWare、DeviceEmulator嵌入式软件开发典型工具开发阶段功能描述典型工具例子编辑编辑程序的源代码Vi、Ema84典型的开发工具链Moblin平台下的工具集在Linux、Moblin平台下最有名的工具集是GNU和Intel两家。由于GNU工具集的跨平台、开放性、使用广、与其他工具兼容等特点,使得其成为嵌入式应用开发的首选工具.GNU工具链GNU的开发工具都是免费的,遵循GPL协议,任何人都可以从网上获取。同样GNU也为嵌入式系统、x86系统下的软件开发提供了完整的工具链。这些工具包含编译器、汇编器、链接器、调试工具等。这些工具它们可以以命令行形式单独运行,也可以集成到Eclipse等集成开发环境中。功能组件说明编辑Vi、Emacs、Ed等文本编辑器,用于编辑源代码编译、链接gcc一组多种编程语言的编译器调试gdb调试器优化gprof分析程序性能,帮助开发者建立运行更快的程序项目管理make自动管理软件编译系统构建autotools构建项目所需的材料和文件典型的开发工具链Moblin平台下的工具集功能组件说明编辑V85典型的开发工具链GNU工具链生成目标文件的几种途径方法一:使用gcc命令分别编译、链接各源代码文件,生成可执行的目标文件。方法二:用户编写makefile等配置文件,然后用make一步生成可执行的目标文件。方法三:使用系统构建自动工具autotools制作makefile等配置文件,然后用make一步生成可执行的目标文件。典型的开发工具链GNU工具链生成目标文件的几种途径86二、MeeGo的开发工具链交叉开发:宿主机:生成目标可执行文件和调试的机器,一般是一台PC目标机:MeeGo运行平台,手机、上网本或者仿真器(qemu)MeeGo交叉开发的实际环境二、MeeGo的开发工具链交叉开发:MeeGo交叉开发的实际87MeeGo交叉开发的仿真环境仿真仿真的情景仿真(1)仿真(2)二、MeeGo的开发工具链MeeGo交叉开发的仿真环境仿真仿真的情景仿真(1)仿真(288几个术语1、QEMUMeeGo的虚拟机(emulator)仿真环境之一或者叫仿真器。2、Xephyr(/SDK/Docs/1.1/MeeGo_SDK_with_Xephyr)Xephyr是一种运行Linux下的MeeGo仿真器。3、MADDEMADDE(MeeGoApplicationDevelopandDebugEnvironment(background))isatoolthatassistsinthedownloadandinstallationoftheTarget.(MeeGo应用开发与调试环境)是一个帮助下载与安装目标机的工具。4、mad-admin"mad-admin"istheMADDEcommand-linetool.YoucaninstallmultipleTargetsandswitcheasilybetweentheminQtCreator(describedlater).——我的理解:mad-admin是一个安装MADDE和查看其安装信息的命令行工具。5、xhost+accesscontroldisabled,clientscanconnectfromanyhost:开放全部用户和IP地址用户远程使用Xserver的权限:几个术语1、QEMU89二、MeeGo的开发工具链3、宿主机Qt开发工具链:$ls-l/opt/meego/meego-sdk-qt/bin1、InstallingtheMeeGoSDK——安装对应CPU架构的编译工具链(1)$sudoapt-getinstallmeego-sdk2、InstallMeeGoTarget——安装对应CPU架构的编译工具链(2)$sudomad-admincreate-fmeego-netbook-ia32-1.1用来下载下载meego-core-ia32-madde-sysroot-1.1-fs.tar.bz2CreateaMeeGotargetusingMADDE二、MeeGo的开发工具链3、宿主机Qt开发工具链:1、In90三、宿主机与仿真机环境配置2、配置QTCreator1、打开上网本仿真器(目标机)$madremote-rmeego-netbook-ia32-qemu-1.1.20101031.2037-sda-runtimepoweron登录到目标机里面去:$sshmeego@–p6666进入目标机(不管是仿真器还是实际机都要执行如下步骤),运行如下命令:$xhost+3、配置工程的build环境4、编译生成MeeGo目标文件在QTCreator环境里面打开一个.pro工程文件5、选择目标机Run环境6、部署运行与停止运行三、宿主机与仿真机环境配置2、配置QTCreator1、打91四、QT介绍Qt介绍Qt安装基于QT的HelloWorld示例程序Qt中主要类的介绍Qt的信号槽机制Qt中主要控件介绍92四、QT介绍Qt介绍2192Qt介绍Qt是跨平台的应用程序和UI框架,包括跨平台类库集成开发环境跨平台IDE一次性开发可在不同桌面和嵌入式操作系统部署93Qt介绍Qt是跨平台的应用程序和UI框架,包括2293Qt特征一面向对象Qt具有模块设计和注重软件构件或元素的可重用性的特点构件支持Qt提供信号signal和槽slot的概念,支持对象之间在彼此不知道对方的情况下合作,使得Qt适合构件编程友好的联机帮助Qt提供了大量的联机参考文件94Qt特征一面向对象2394Qt特征二便利性Qt是跨平台的GUI工具包,对编程者隐藏了处理不同窗口系统时的潜在问题国际化Qt为本地化应用提供了完全的支持,所有用户界面文本都可以基于消息翻译表被翻译成各国语言95Qt特征二便利性2495Qt特征三丰富的API函数Qt为开发者提供了大量的函数可用户化外观Qt支持主题,基于Qt的应用程序能够在Windows外观,Motif外观以及其他一些用户外观主题之间切换完整的组件工具Qt编程的基本模块叫做组件,Qt含有用来创建专业外观用户界面需要的所有组建96Qt特征三丰富的API函数2596Qt介绍WhousesQt?WritecodeoncetotargetmultipleplatformsCreateamazinguserexperienceDomorewithlessandfasterBlendwebandnativecodeinasingleapplication97Qt介绍WhousesQt?2697QtSDKQtSDK98QtSDKQtSDK2798Qt中主要的类介绍QObject QObject类是所有能够处理signal,slot和事件的Qt对象的基类,原型如下:QObject::QObject(Qobject*parent=0,constchar*name=0) 在上面的函数中,如果parent为0则构造一个无父的对象;如果对象是一个组件,则它会成为顶层窗口。99Qt中主要的类介绍QObject2899Qt中主要的类介绍2.QApplicationQApplication类负责GUI应用程序的控制流和主要的设置,它包括主事件循环体,负责处理和调度所有来自窗口系统和其他资源的事件处理应用程序的开始,结束以及会话管理QApplication是QObject类的子类100Qt中主要的类介绍2.QApplication29100Qt中主要的类介绍3.QwidgetQWidget是所有用户接口对象的基类,继承了QObject类的属性组件是用户界面的单元组成部分,接收鼠标,键盘和从其它窗口系统来的事件QWidget类有很多成员函数,但一般不直接使用,而通过子类继承来使用其函数功能QWidget是QObject类的子类101Qt中主要的类介绍3.Qwidget30101信号和槽信号和槽机制是Qt的一个主要特征,是Qt与其它工具包最不相同的部分。在图形用户界面编程中,经常会出现窗口的一个部件发生的变化会被通知给另一个部件。Qt采用信号和槽实现对象部件之间的通信102信号和槽信号和槽机制是Qt的一个主要特征,是Qt与其它工具包102信号和槽的声明一 在Qt程序设计中,包含signals和slot的类都要加上Q_OBJECT的定义。下面给出一个在类中定义signal和slot的例子classStudent:publicQobject{
Q_OBJECT public: Student(){myMark=0;} intgetMark()const{returnmyMark;}
publicslots: voidsetMark(intnewMark);
signals: voidmarkChanged(intnewMark); private: intmyMark;}103信号和槽的声明一 在Qt程序设计中,包含signals和sl103信号和槽的声明二Signal的发出一般在事件的处理函数中,利用emit发出signal,下面的例子中在事件处理结束后发出signal
voidStudent::setMark(intnewMark){ if(newMark!=myMark){ myMark=newMark;
emitmarkChanged(myMark); }}104信号和槽的声明二Signal的发出一般在事件的处理函104信号和槽的连接一 在signal和slot声明以后,需要使用connect()函数将它们连接起来。Connect()函数属于QObject类的成员函数,能够连接signal和slot,也能够连signal和signal。函数原型如下
boolconnect(constQObject*sender,constchar*signal,constQObject*receiver,constchar*slot)其中第一个和第三个参数指出signal和slot属于的对象或组件105信号和槽的连接一 在signal和slot声明以后,需要使用105信号和槽的连接二 使用connect()函数进行连接的时候,还需要用到SIGNAL()和SLOT()两个宏,使用方法如下:
QLabel*label=newQLabel; QScrollBar*scroll=newQScrollBar; QObject::connect(scroll,SIGNAL(valueChanged(int)),label,SLOT(setNum(int)));106信号和槽的连接二 使用connect()函数进行连接的时候,106信号和槽的连接方式一同一个信号连接到多个槽
connect(slider,SIGNAL(valueChanged(int)),spinBox,SLOT(setValue(int))); connect(slider,SIGNAL(valueChanged(int)),this,SLOT(updateStatusBarIndicator(int)));多个信号连接到同一个槽
Connect(lcd,SIGNAL(overflow()),this,SLOT(handleMathError()));Connect(calculator,SIGNAL(divisionByZero()),this,SLOT(handleMathError()));107信号和槽的连接方式一同一个信号连接到多个槽36107信号和槽的连接方式二一个信号连接到另外一个信号
connect(lineEdit,SIGNAL(textChanged(constQstring&)),this,SLOT(updateRecord(constQstring&)))取消一个连接
disconnect(lcd,SIGNAL(overflow()),this,SLOT(handleMathError())); 取消一个连接不是很常用,因为Qt会在一个对象被删除后自动取消这个对象所包含的所有连接108信号和槽的连接方式二一个信号连接到另外一个信号37108Qt安装Qt下载/downloads109Qt安装Qt下载109Qt安装下载安装文件Qt_SDK_Lin32_offline_v1_1_beta_en.run,在linux上安装步骤如下:1.添加执行权限chmodu+xQt_SDK_Lin32_offline_v1_1_beta_en.run2.运行安装文件./Qt_SDK_Lin32_offline_v1_1_beta_en.run3.添加环境变量将Qt安装目录下的bin目录加入到环境变量PATH中110Qt安装下载安装文件Qt_SDK_Lin32_offline110HelloWorld程序实例创建目录mkdir/examples/hello创建源文件touchhello.cpp编写源文件vihello.cpp111HelloWorld程序实例创建目录mkdir/exa111HelloWorld程序实例切换到hello目录cd/examples/hello创建平台独立的工程文件projectfileqmake–project创建平台独立的Makefile文件qmake编译工程make运行程序./hello112HelloWorld程序实例切换到hello目录cd112Qt对话框对话框是一种特殊的窗口,一般用来提供反馈信息或从用户获取输入。给用户提供了同应用程序进行交互的方式113Qt对话框对话框是一种特殊的窗口,一般用来提供反馈信息或从用113Qt对话框模态对话框最普遍的对话框。在未消失前用户不能够与同一个应用程序的其他窗口进行交互,直到该对话框关闭。非模态对话框当对话框打开的同时,用户还可与同一应用程序的其他窗口进行交互。114Qt对话框模态对话框43114Qt对话框Qt对话框的类层次结构图115Qt对话框Qt对话框的类层次结构图44115几种Qt内置对话框介绍颜色对话框QColorDialog,允许用户选择设置颜色错误对话框QErrorDialog,显示错误信息文件对话框QFileDialog,允许用户选择一个或多个文件或目录字体对话框QFontDialog,允许用户选择、设置字体输入对话框QInputDialog,允许用户输入文本信息页设置对话框QPageSetupDialog,可配置与打印相关的页面设置进度对话框QProgressDialog,指示出一项操作的工作进度,而且提示用户该操作是否停滞打印对话框QPrintDialog,配置打印机相关选项116几种Qt内置对话框介绍颜色对话框QColorDialog,允116几种Qt内置对话框介绍颜色对话框QColorDialog,允许用户选择设置颜色错误对话框QErrorDialog,显示错误信息文件对话框QFileDialog,允许用户选择一个或多个文件或目录字体对话框QFontDialog,允许用户选择、设置字体输入对话框QInputDialog,允许用户输入文本信息页设置对话框QPageSetupDialog,可配置与打印相关的页面设置进度对话框QProgressDialog,指示出一项操作的工作进度,而且提示用户该操作是否停滞打印对话框QPrintDialog,配置打印机相关选项117几种Qt内置对话框介绍颜色对话框QColorDialog,允117查找对话框示例通过一个简单的查找对话框的实现了解Qt中对话框的创建过程,布局管理,信号和槽机制以及一些简单控件的使用118查找对话框示例通过一个简单的查找对话框的实现了解Qt中对话框118查找对话框示例头文件finddialog.h1#ifndefFINDDIALOG_H2#defineFINDDIALOG_H3#include<QDialog>4classQCheckBox;5classQLabel;6classQLineEdit;7classQPushButton;8classFindDialog:publicQDialog
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年承德客运从业资格证考试模拟考试
- 吉首大学《妇幼保健学》2021-2022学年第一学期期末试卷
- 吉首大学《企业预算管理》2021-2022学年第一学期期末试卷
- 吉林艺术学院《数字摄影》2021-2022学年第一学期期末试卷
- 店铺砸墙协议书范文范本
- 吉林师范大学《中国思想史》2021-2022学年第一学期期末试卷
- 潮汕生意合作协议书范文范本
- 2022年国家公务员考试《申论》试题真题(行政执法)及答案解析
- 2022年公务员多省联考《申论》真题(广西A卷)及答案解析
- 个人合伙人合同协议书范文模板
- 须弥(短篇小说)
- 旋风除尘器设计与计算
- 《装配基础知识培训》
- 出口退税的具体计算方法及出口报价技巧
- PCB镀层与SMT焊接
- Unit 1 This is my new friend. Lesson 5 课件
- 2019年青年英才培养计划项目申报表
- 剪纸教学课件53489.ppt
- 芳香油的提取
- 劳动法讲解PPT-定稿..完整版
- 企业人才测评发展中心建设方案
评论
0/150
提交评论