版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、嵌入式应用程序设计第7章 Qt图形编程,2,第1章 搭建嵌入式Linux开发环境 第2章 嵌入式文件I/O编程 第3章 嵌入式Linux多任务编程 第4章 嵌入式Linux进程间通行 第5章 嵌入式Linux多线程编程 第6章 嵌入式Linux网络编程 第7章 Qt图形编程 第8章 嵌入式Linux设备驱动编程 第9章 Qt聊天项目设计,课程安排:,3,7.1 嵌入式GUI简介 7.2 Qt/Embedded开发入门 7.3 实验内容 7.4 小结 7.5 思考与练习,本章课程:,4,目前的桌面机操作系统大多有着美观、操作方便、功能齐全的GUI(图形用户界面),例如KDE或者GNOME。GUI
2、(图形用户界面)是指计算机与其使用者之间的对话接口,可以说,GUI是当今计算机技术的重大成就。它的存在为使用者提供了友好便利的界面,并大大地方便了非专业用户的使用,使得人们从繁琐的命令中解脱出来,可以通过窗口、菜单方便地进行操作。 在嵌入式系统中,GUI的地位也越来越重要,但是不同于桌面机系统,嵌入式GUI要求简单、直观、可靠、占用资源小且反应快速,以适应系统硬件资源有限的条件。另外,由于嵌入式系统硬件本身的特殊性,嵌入式GUI应具备高度可移植性与可裁减性,以适应不同的硬件条件和使用需求。,7.1 嵌入式GUI简介,5,嵌入式GUI特点 体积小; 运行时耗用系统资源小; 上层接口与硬件无关,高
3、度可移植; 高可靠性; 在某些应用场合应具备实时性。,7.1 嵌入式GUI简介,6,7.1.1 Qt/Embedded Qt/Embedded是Trolltech公司(目前已被Nokia收购)为嵌入式系统开发的Qt版本。从Qt 4.1版本开始,Qt/Embedded改名为Qtopia Core,又从Qt 4.4.1版本开始,Qtopia Core又改名为Qt for Embedded Linux.,7.1 嵌入式GUI简介,7,7.1.1 Qt/Embedded Qt/Embedded的优缺点:,7.1 嵌入式GUI简介,8,7.1.2 MiniGUI MniGUI由魏永明先生和众多志愿者开发
4、,是面向实时嵌入式系统的轻量级图形用户界面支持系统。自1999年初遵循GPL条款发布第一个版本以来,MiniGUI已广泛应用于手持信息终端、机顶盒、工业控制系统及工业仪表、便携式多媒体播放器、查询终端等产品和领域。目前,MiniGUI已成为跨操作系统、跨硬件平台的图形用户界面支持系统,可在Linux/uClinux、VxWorks、eCos、uC/OS-II、pSOS、ThreadX、Nucleus、OSE等操作系统以及Win32平台上运行,已验证的硬件平台包括ix86、ARM、PowerPC、MIPS、DragonBall、ColdFire等等。MiniGUI V2.0为基于嵌入式Linux
5、的高端嵌入式设备提供了完整的多进程支持,从而将MiniGUI从中端市场带到了高端市场。最新的MiniGUI V3.0则是继2.0之后的一个重要增强,增加了如外观渲染器技术、双向文本支持、透明控件、独立滚动条控件、UPF字体和位图字体等新的特性。,7.1 嵌入式GUI简介,9,7.1.2 Microwindow、Tiny X等 它由魏永明先生和众多志愿者开发,是面向实时嵌入式系统的轻量级图形用户界面支持系统。自1999年初遵循GPL条款发布第一个版本以来,MiniGUI已广泛应用于手持信息终端、机顶盒、工业控制系统及工业仪表、便携式多媒体播放器、查询终端等产品和领域。目前,MiniGUI已成为跨
6、操作系统、跨硬件平台的图形用户界面支持系统,可在Linux/uClinux、VxWorks、eCos、uC/OS-II、pSOS、ThreadX、Nucleus、OSE等操作系统以及Win32平台上运行,已验证的硬件平台包括ix86、ARM、PowerPC、MIPS、DragonBall、ColdFire等等。MiniGUI V2.0为基于嵌入式Linux的高端嵌入式设备提供了完整的多进程支持,从而将MiniGUI从中端市场带到了高端市场。最新的MiniGUI V3.0则是继2.0之后的一个重要增强,增加了如外观渲染器技术、双向文本支持、透明控件、独立滚动条控件、UPF字体和位图字体等新的特性
7、。,7.1 嵌入式GUI简介,10,7.1.3 Microwindow、Tiny X等 Microwindows Open Source Project成立的宗旨在于针对体积小的装置,建立一套先进的视窗环境,在Linux桌面上通过交叉编译可以很容易地制作出Microwindows的程序。Microwindows能够在没有任何操作系统或其他图形系统的支持下运行,它能对裸显示设备进行直接操作。这样,Microwindows就显得十分小巧,便于移植到各种硬件和软件系统上。 然而Microwindows的免费版本进展一直很慢,几乎处于停顿状态,而且至今为止,国内没有任何一家对Microwindows提
8、供全面技术支持、服务和担保的专业公司。 Tiny X Server是XFree86 Project的一部分,由Keith Pachard发展起来的,而他本身就是XFree86专案的核心成员之一。一般的X Server都过于庞大,因此Keith Packard就以XFree86为基础,精简而成Tiny X Server,它的体积可以小到几百KB,非常适合应用于嵌入式环境。 就纯X Window System搭配Tiny X Server架构来说,其最大的优点就是具有很好的弹性开发机制,并能大大提高开发速度。因为与桌面的X架构相同,因此相对于很多以Qt、GTK+、FLTK等为基础开发的软件可以很容
9、易地移植过来。,7.1 嵌入式GUI简介,11,常见GUI参数比较:,7.1 嵌入式GUI简介,12,7.2.1 Qt/Embedded介绍 架构 Qt/Embedded以原始Qt为基础,并做了许多出色的调整以适用于嵌入式环境。Qt/Embedded通过Qt API与Linux I/O设施直接交互,成为嵌入式Linux端口。同Qt/X11相比,Qt/Embedded很省内存,因为它不需要一个X服务器或是Xlib库,它在底层抛弃了X lib,采用framebuffer(帧缓冲)作为底层图形接口。同时,将外部输入设备抽象为keyboard和mouse输入事件。Qt/Embedde的应用程序可以直接
10、写内核缓冲帧,这避免开发者使用繁琐的Xlib/Server系统。,7.2 Qt/Embedded开发入门,Qt/Embedded与Qt X11 的linux版本的比较,13,7.2.1 Qt/Embedded介绍 Qt/Embedded组件 窗口系统 字体 输入设备机输入法 Qt的开发环境,7.2 Qt/Embedded开发入门,14,7.2.1 Qt/Embedded介绍: Qt的开发环境 Qt/Embedded的开发环境可以取代那些我们熟知的UNIX和Windows开发工具。它提供了几个跨平台的工具使得开发变得迅速和方便,尤其是它的图形设计器。UNIX下的开发者可以在PC机或者工作站使用虚
11、拟缓冲帧,从而可以模仿一个和嵌入式设备的显示终端大小,像素相同的显示环境。 嵌入式设备的应用可以在安装了一个跨平台开发工具链的不同的平台上编译。最通常的做法是在一个UNIX系统上安装跨平台的带有libc库的GNU C+编译器和二进制工具。在开发的许多阶段,一个可替代的做法是使用Qt的桌面版本,7.2 Qt/Embedded开发入门,15,7.2.1 Qt/Embedded介绍: Qt的支撑工具 qmake是一个为编译Qt/Embedded库和应用而提供的Makefile生成器。它能够根据一个工程文件(.pro)产生不同平台下的Makefile文件。qmake支持跨平台开发和影子生成(影子生成是
12、指当工程的源代码共享给网络上的多台机器时,每台机器编译链接这个工程的代码将在不同的子路径下完成,这样就不会覆盖别人的编译链接生成的文件。qmake还易于在不同的配置之间切换。) designer(Qt图形设计器)可以使开发者可视化地设计对话框而不需编写代码。使用Qt图形设计器的布局管理可以生成能平滑改变尺寸的对话框。,7.2 Qt/Embedded开发入门,16,7.2.2 Qt/Embedded信号和插槽机制 机制概述 信号和插槽机制是Qt的核心机制 。信号和插槽是一种高级接口,应用于对象之间的通信,它是Qt的核心特性,也是Qt区别于其他工具包的重要地方。信号和插槽是Qt自行定义的一种通信机
13、制,它独立于标准的C/C+语言,因此要正确的处理信号和插槽,必须借助一个称为moc(Meta Object Compiler)的Qt工具,该工具是一个C+预处理程序,它为高层次的事件处理自动生成所需要的附加代码。,7.2 Qt/Embedded开发入门,17,7.2.2 Qt/Embedded信号和插槽机制 机制概述 对象间信号与槽之间的关系,7.2 Qt/Embedded开发入门,18,7.2.2 Qt/Embedded信号和插槽机制 信号与插槽的实现 Qt的signals关键字指出进入了信号声明区,随后即可声明自己的信号。 示例: signals: void mySignal(); voi
14、d mySignal(int x); void mySignalParam(int x,int y);,7.2 Qt/Embedded开发入门,19,7.2.2 Qt/Embedded信号和插槽机制 信号与插槽的实现 插槽是普通的成员函数,因此与其他的函数一样,它们也有存取权限。插槽的存取权限决定了谁能够与其相关联。同普通的C+成员函数一样,插槽函数也分为3种类型,即public slots、private slots和protected slots。 public slots:在这个区内声明的槽意味着任何对象都可将信号与之相连接。这对于组件编程非常有用,用户可以创建彼此互不了解的对象,将它们
15、的信号与槽进行连接以便信息能够正确地传递。 protected slots:在这个区内声明的槽意味着当前类及其子类可以将信号与之相连接。这适用于那些槽,它们是类实现的一部分,但是其界面接口却面向外部。 private slots:在这个区内声明的槽意味着只有类自己可以将信号与之相连接。这适用于联系非常紧密的类。,7.2 Qt/Embedded开发入门,20,7.2.2 Qt/Embedded信号和插槽机制 信号与插槽的实现 插槽也能够被声明为虚函数,这也是非常有用的。插槽的声明也是在头文件中进行的。 示例: public slots: void mySlot(); void mySlot(in
16、t x); void mySignalParam(int x,int y);,7.2 Qt/Embedded开发入门,21,7.2.2 Qt/Embedded信号和插槽机制 信号与槽关联 通过调用QObject对象的connect()函数可以将某个对象的信号与另外一个对象的插槽函数或信号相关联,当发射者发射信号时,接收者的槽函数或信号将被调用。 函数定义: bool QObject:connect (const QObject * sender, const char * signal,const QObject * receiver, const char * member) static
17、示例: QLabel *label = new QLabel; QScrollBar *scroll = new QScrollBar; QObject:connect(scroll, SIGNAL(valueChanged(int),label, SLOT(setNum(int);,7.2 Qt/Embedded开发入门,22,7.2.2 Qt/Embedded信号和插槽机制 信号与信号关联 class MyWidget : public QWidget public: MyWidget(); . signals: void aSignal(); . private: . QPushButt
18、on *aButton; ; MyWidget:MyWidget() aButton = new QPushButton(this); connect(aButton, SIGNAL(clicked(), SIGNAL(aSignal(); ,7.2 Qt/Embedded开发入门,23,7.2.2 Qt/Embedded信号和插槽机制 信号与信号关联 当信号与槽没有必要继续保持关联时,用户可以使用disconnect()函数来断开连接。 bool QObject:disconnect (const QObject * sender, const char * signal,const Obj
19、ect * receiver, const char * member) static 有3种情况必须使用disconnect()函数: 断开与某个对象相关联的任何对象 断开与某个特定信号的任何关联 断开两个对象之间的关联,7.2 Qt/Embedded开发入门,24,7.2.2 Qt/Embedded信号和插槽机制 信号与信号关联 当信号与槽没有必要继续保持关联时,用户可以使用disconnect()函数来断开连接。 bool QObject:disconnect (const QObject * sender, const char * signal,const Object * rece
20、iver, const char * member) static 有3种情况必须使用disconnect()函数: 断开与某个对象相关联的任何对象 断开与某个特定信号的任何关联 断开两个对象之间的关联,7.2 Qt/Embedded开发入门,25,7.2.3 搭建Qt/Embedded开发环境 安装Qt/X11步骤 解压源码包 运行配置程序 编译Qt源代码 安装Qt 设置环境变量,7.2 Qt/Embedded开发入门,26,7.2.3 搭建Qt/Embedded开发环境 安装Qt/X11步骤 解压源码包 #cd /home/user_name #tar zxvf qt-x11-openso
21、urce-src-4.4.3.tar.gz,7.2 Qt/Embedded开发入门,27,7.2.3 搭建Qt/Embedded开发环境 安装Qt/X11 运行配置程序 #cd qt-x11-opensource-src-4.4.3 #./configure,7.2 Qt/Embedded开发入门,28,7.2.3 搭建Qt/Embedded开发环境 安装Qt/X11 编译Qt源代码 #make 安装Qt #make install,7.2 Qt/Embedded开发入门,29,7.2.3 搭建Qt/Embedded开发环境 安装Qt/X11 设置环境变量 #vi $HOME/.bash_pr
22、ofile export QTDIR=/usr/local/Trolltech/Qt-4.4.3 export PATH=$QTDIR/bin:$PATH export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH #source $HOME/.bash_profile,7.2 Qt/Embedded开发入门,30,7.2.3 搭建Qt/Embedded开发环境 安装Qt/Embedded 开发环境 主机系统:Ubuntu 8.10 编译器版本:gcc/g+ 4.1.3;arm-linux-gcc/g+ 3.4.5 内核源码:linux-2.6.26.
23、5 目标平台:s3c2410 安装步骤 解压源码包 运行配置程序 编译Qt/Embedded源代码 安装Qt/Embedded 设置环境变量 复制库文件 为开发板设置环境变量,7.2 Qt/Embedded开发入门,31,7.2.3 搭建Qt/Embedded开发环境 安装Qt/Embedded 解压源码包 #cd /home/user_name #tar zxvf qt-embedded-linux-opensource-src-4.4.3.tar.gz,7.2 Qt/Embedded开发入门,32,7.2.3 搭建Qt/Embedded开发环境 安装Qt/Embedded 运行配置程序 #
24、cd qt-embedded-linux-opensource-src-4.4.3 #./configure embedded arm,7.2 Qt/Embedded开发入门,33,7.2.3 搭建Qt/Embedded开发环境 安装Qt/Embedded 编译Qt/Embedded源代码 #make 安装Qt/Embedded #make install,7.2 Qt/Embedded开发入门,34,7.2.3 搭建Qt/Embedded开发环境 安装Qt/Embedded 设置环境变量 为了更方便的使用Qt/Embedded提供的各种工具,同Qt/X11一样,需要对用户的环境变量进行设置。
25、如果前面已经把Qt/X11的目录加入到PATH,那么在开发Qt/Embedded程序时,最好保证将Qt/Embedded的目录加在前面,因为现在使用的都是Qt/Embedded中的工具。 复制库文件 #cp /usr/local/Trolltech/QtEmbedded-4.4.3/lib/libQt* /rootfs/home/qt/lib 为开发板设置环境变量,7.2 Qt/Embedded开发入门,35,7.2.3 搭建Qt/Embedded开发环境 安装Qt/Embedded 为开发板设置环境变量 在开发板根文件系统的/bin目录下建立一个脚本文件qpe.sh,用来设置环境变量。 #c
26、d /rootfs/bin #vi qpe.sh #!/bin/sh export QTDIR=/home/qt export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH,7.2 Qt/Embedded开发入门,36,7.2.4 Qt/Embedded窗口部件 Qt提供了一整套的窗口部件。它们组合起来可用于创建用户界面的可视元素。按钮、菜单、滚动条、消息框和应用程序窗口都是窗口部件的实例。 窗口部件是QWidget或其子类的实例,用户自定义的窗口通过子类化得到。,7.2 Qt/Embedded开发入门,37,7.2.4 Qt/Embedded窗口部件
27、 Hello窗口示例 #include #include int main(int argc, char *argv) QApplication app(argc, argv); QLabel *label = new QLabel(Hello Qt!); hello-show(); return app.exec(); ,7.2 Qt/Embedded开发入门,38,7.2.4 Qt/Embedded窗口部件 常见窗口组合,7.2 Qt/Embedded开发入门,39,7.2.4 Qt/Embedded窗口部件 自定义窗口 钟表部件是一个能显示当前时间并自动更新的LCD。一个冒号分隔符随秒数
28、的流逝而闪烁,7.2 Qt/Embedded开发入门,40,7.2.4 Qt/Embedded窗口部件 自定义窗口 实现: clock.h #include class Clock:public QLCDNumber public: Clock(QWidget *parent=0); protected: void timerEvent(QTimerEvent *event); private: void showTime(); bool showingColon; ;,7.2 Qt/Embedded开发入门,41,7.2.4 Qt/Embedded窗口部件 自定义窗口 实现: clock.c
29、pp #include #include clock.h Clock:Clock(QWidget *parent):QLCDNumber(parent),showingColon(true) showTime(); startTimer(1000); void Clock:timerEvent(QTimerEvent *) showTime(); ,7.2 Qt/Embedded开发入门,42,7.2.4 Qt/Embedded窗口部件 void Clock:showTime() QString timer=QTime:currentTime().toString().left(5); if
30、(!showingColon) time2= ; display(time); showingColon=!showingColon; ,7.2 Qt/Embedded开发入门,43,7.2.4 Qt/Embedded窗口部件 自定义窗口 实现: main.cpp #include #include clock.h int main(int argc,char *argv) QApplication app(argc,argv); Clock *clock=new Clock; clock-show(); return app.exec(); ,7.2 Qt/Embedded开发入门,44,7
31、.2.5 Qt/Embedded图形界面编程 主窗口类 QMainWindow类提供了一个典型应用程序的主窗口框架。 示例: QTextEdit *editor = new QTextEdit(mainWindow); mainWindow-setCentralWidget(editor);,7.2 Qt/Embedded开发入门,45,7.2.5 Qt/Embedded图形界面编程 菜单类 QMenu类以垂直列表的方式显示菜单项,它可以是单个的(例如上下文相关菜单),可以以菜单栏的方式出现,或者是别的弹出式菜单的子菜单出现。 示例: QMenu *menu_F = new QMenu(,7.
32、2 Qt/Embedded开发入门,46,7.2.5 Qt/Embedded图形界面编程 工具栏 QToolButton类实现了具有一个图标,一个3D框架和一个可选标签的工具栏。 旁述 提示栏 actNew - setStatusTip(open a file); 这是什么 actNew - setWhatsThis(open);,7.2 Qt/Embedded开发入门,47,7.2.5 Qt/Embedded图形界面编程 动作 应用程序通常提供几种不同的方式来执行特定的动作。比如,许多应用程序通过菜单(Flie-Save),工具栏(像一个软盘的按钮)和快捷键(Ctrl+S)来提供“Save”
33、动作。QAction类封装了“动作”这个概念。它允许程序员在某个地方定义一个动作。 示例: QMenu *menu_F = new QMenu(,7.2 Qt/Embedded开发入门,48,7.2.5 Qt/Embedded对话框设置 布局 内建布局管理器 Qt提供了3种用于布局管理的类:QHBoxLayout,QVBox-Layout和QGridLayout。 QHBoxLayout 布局管理把窗体按照水平方向从左至右排成一行。 QVBoxLayout布局管理把窗体按照垂直方向从上至下排成一列。 QGridLayout布局管理以网格的方式来排列窗体,一个窗体可以占据多个网格。,7.2 Qt
34、/Embedded开发入门,49,7.2.5 Qt/Embedded对话框设置 布局 三种布局管理器类示意图,7.2 Qt/Embedded开发入门,50,7.2.5 Qt/Embedded对话框设置 布局 如何微调布局 设置一些延伸项目或间隔项目,延伸或间隔项目会填充空余的布局空间。 改变子部件的尺寸策略。通过调用QWidget:setSizePolicy(),程序员可以仔细调整子部件的缩放行为。子部件可以设置为扩展、收缩、保持原大小等状态。 改变子部件的建议大小。QWidget:sizeHint()和QWidget:minimumSizeHint()会根据内容返回部件的首选尺寸和最小首选尺寸。内建部件提供了合适
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 孕期视力保护与护理
- 多发伤合并颅脑损伤的护理要点
- 护理专业护理法规
- 外科护理操作规范
- 护理护理团队建设
- 护理科技:3D打印技术在假肢与矫形器中的应用
- 喉癌患者的营养支持护理
- 生育津贴领取条件申请书
- 幼儿园活动说课稿教案7篇
- 护理社区护理微课课件
- 舆情管理培训课件
- 人教版三年级下册数学-应用题专项练习分类及答案
- 建筑劳务有限公司安全生产管理制度
- 特殊困难老年人基本信息登记表
- 【MOOC】食品化学-中国海洋大学 中国大学慕课MOOC答案
- 人教版六年级上册解方程练习300道及答案
- GB/T 17630-2024土工合成材料动态穿孔试验落锥法
- 危险化学品安全生产规章制度和岗位操作规程的目录清单
- 供应商供货质量保障措施
- 路侧智慧停车管理泊车解决方案
- 江西师大附中2022-2023学年强基计划模拟考试第一部分物理试题卷含解析
评论
0/150
提交评论