已阅读5页,还剩44页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
北京博创兴业科技有限公司 Qt编程 Qt简介 Linux GUI GTK+(C)Qt(C+) GNOMEGPEKDEOPIE/Qtopia 主流的Linux窗口系统 PC 嵌入式 Qt概述 Qt是Trolltech公司的标志性产品,是一个跨平台的C+ 图形用户界面(GUI)工具包 Qt 应用程序接口与工具兼容于所有支持平台,让开发 员们掌握一个应用程序接口,便可执行与平台非相关的 应用开发与配置 Qt/Windows (Windows XP, 2000, NT 4, Me/98) Qt/Mac (Mac OS X) Qt/X11 (Linux, Solaris, HP-UX, IRIX, AIX等) Qt/Embeded (嵌入式平台) Qt对不同平台的专门API进行了专门的封装(文件处理 ,网络等) Qt免费版本基于GPL协议,意味着我们可以用Qt库编写 程序,并且免费发布自己的GPL软件。 Qt/Embedded及Qtopia介绍 Qt/Embedded(Qt/E)是Qt面向嵌入式应用的简化版 本,大部分Qt的应用程序可以经过简单的编译与重设窗 口大小移植到Qt/E。 Qtopia是基于Qt/E库开发的一个嵌入式窗口系统和应用 程序集,广泛用于PDA等掌上设备。 整个GUI系统的构建需要对Qt/E、Qtopia依次分别编译 ,然后有机地整合在一起。Qt/E为Qtopia提供了底层支 持,GUI系统的图形库窗口组建都由Qt/E实现。 我们可以在Trolltech公司的ftp站点下载到这些工具包的 源代码。 Qt特征 引入一种用于无缝对象通讯的被称为信号和槽的非常强大的机制 可查询和可设计的属性, 强大的事件和事件过滤器, 根据上下文进行国际化的字符串翻译, 完善的时间间隔驱动的计时器使得在一个事件驱动的图形界面程 序中很好地集成许多任务成为可能。 以一种自然的方式组织对象所有权的分层次和可查询的对象树。 被守护的指针,QGuardedPtr,当参考对象被破坏时,可以自动 地设置为无效,不像正常的C+指针在它们的对象被破坏的时候变 成了“摇摆指针”。 Qt编程核心技术 Qt编程核心技术 Qt对象模型 u元对象系统 u信号和槽 u属性 QObject类 u对象树 u事件处理 元对象系统 是一个C+扩展,使得Qt更适合真正的组件 GUI编程 使用元编译器moc产生能被标准C+编译器访 问的附加C+代码 带有moc预编译器的C+基本上提供了面向对 象的C的灵活性或类似于Java的运行环境,并 保持了C+的执行效率和扩展性 实现功能 对象间通信的信号/槽机制 运行时的类型信息 动态属性系统 信号和槽(1/2) 所有的GUI程序必须有某种机制响应用户动作 并执行处理代码。 命令行程序的做法:暂停执行,等待用户输入,然 后采用switch语句等机制使程序根据输入不同而分支 执行。 但GUI程序必须不断地响应用户输入,因为它还需要 不断地更新窗口区域。 现代窗口系统由事件和事件监听器系统来解决 这个问题。其思想是: 用户的每次动作都触发一个事件,程序员只需 要编写监听事件及事件触发时应该执行的代码 。 在GTK+中,使用信号和回调函数的机制。 信号和槽(2/2) 在Qt程序中,利用信号(signal)和槽(slot) 机制进行对象间的通信 当对象状态发生改变的时候,发出signal通知所 有的slot接收signal,尽管它并不知道哪些函数 定义了slot,而slot也同样不知道要接收怎样的 signal signal和slot机制真正实现了封装的概念,slot 除了接收signal之外和其它的成员函数没有什么 不同,而且signal和slot之间也不是一一对应的 。 事件驱动原理 一个GUI可以由菜单、工具栏、按钮、输入框 和其它许多统称为窗口组件的GUI元素组成。 当用户与窗口组件交互时,例如点击一个菜单 项或者在输入框中输入文字,窗口部件将发出 一个命名信号,例如clicked、text_changed。 然后程序会对用户的动作做出响应,例如保存 文档或退出应用程序。Qt通过把信号连接到称 为槽的函数来实现这个机制。 事件驱动的实现 QApplication:exec() QApplication :enter_loop() QApplication :processNextEvent() QApplication : sendPostedEvents(); QWSDisplay :getEvent() QApplication :qwsProcessEvent() QWSServer :processEventQueue() 事件循环 Signal和Slot的声明(1/2) Qt定义了两个伪关键字signals和slots来标识代码中类 的信号和槽。 下面是一个声明了信号和槽的类的例子。 class Student : public QObject Q_OBJECT public: Student() myMark = 0; int mark() const return myMark; private slots: void setMark(int newMark); signals: void markChanged(int newMark); private: int myMark; ; Signal和Slot的声明(2/2) 常见的窗口组件通常已经在Qt库中实现了对用户的动作 作出相应信号的发出的过程。如用户按下一个按钮后, 命名为clicked的信号就会发出。 当然我们也可以自定义信号,并在适当的时候发出这个 信号。要发出一个信号,只需在代码的某处调用emit。 如: void Student:setMark(int newMark) if (newMark!= myMark) myMark = newMark; emit markChanged(myMark); Signal和Slot的连接(1/2) 在signal和slot声明以后,需要使用connect()函 数将它们连接起来。 connect()函数属于QObject类的成员函数,它能够连 接signal和slot,也可以用来连接signal和signal,函数 原形如下: bool QObject:connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * member ) static 其中第一个和第三个参数分别指出signal和 slot是属于那个对象或组件。 Signal和Slot的连接(2/2) 在使用connect()函数进行来接的时候,还需要用到 SIGNAL()和SLOT()这两个宏,使用方法如下: QLabel *label = new QLabel; QScrollBar *scroll = new QScrollBar; QObject:connect( scroll,SIGNAL(valueChanged(int), label, SLOT(setNum(int) ); Signal和Slot的连接方式 取消Signal和Slot连接 取消Signal和Slot连接 disconnect(lcd,SIGNAL(overflow(),this, SLOT(handleMathError(); 取消连接不是很常用,因为Qt会在一个对象被删除后自 动取消这个对象所包含的所有的连接 属性 属性也是一个类的成员 在类声明中用宏Q_PROPERTY来声明 只能在继承于QObject的子类中声明 设置和得到属性的成员函数如下: QObject:setProperty() QMetaObject:propertyNames() QMetaObject:property () QObject类 QObject是Qt类体系的唯一基类,是Qt各种功能的源头 活水,就象MFC中的CObject和Dephi中的TObject connect():提供信号槽机制 对象树:QObject在对象树中组织它们自己。当你以另外一个对象 作为父对象来创建一个QObject时,它就被添加到父对象的 children() 列表中,并且当父对象被删除的时候,它也会被删除。 这种机制很好的适合了图形用户界面应用对象的需要。 事件:事件是由窗口系统或qt本身对各种事务的反应而产生的。当 用户按下、释放一个键或鼠标按钮,一个键盘或鼠标事件被产生 ;当窗口第一次显示,一个绘图事件产生,从而告知最新的可见 窗口需要重绘自身。大多数事件是由于响应用户的动作而产生的 ,但还有一些,比如定时器等,是由系统独立产生的。 QApplication QApplication和QWidget都是QObject类的子类 QApplication类负责GUI应用程序的控制流和主要的设 置,它包括主事件循环体,负责处理和调度所有来自窗 口系统和其他资源的事件,并且处理应用程序的开始、 结束以及会话管理,还包括系统和应用程序方面的设置 。对于一个应用程序来说,建立此类的对象是必不可少 的 QWidget QWidget类是所有用户接口对象的基类,它继承了 QObject类的属性。组件是用户界面的单元组成部分, 它接收鼠标、键盘和其它从窗口系统来的事件,并把它 自己绘制在盘屏幕上 QWidget类有很多成员函数,但一般不直接使用,而是 通过子类继承来使用其函数功能。如,QPushButton、 QlistBox等都是它的子类 一个完整的Qt程序的例子 1 #include 2 #include 3 int main(int argc, char *argv) 4 5 QApplication app (argc, argv); 6 QLabel *hello = new QLabel(“Hello Qt/Embedded!“, 0); 7 app.setMainWidget(hello); 8 hello-show(); 9 return app.exec(); 10 Qt 开发环境的建立 建立X86平台PC机的Qt开发环境(一) 我们在这里移植了qt-embedded-2.3.10和免费PDA版 本的qtopia-free-2.1.1图形界面。Qtopia的版本要和 Qt/embedded的版本兼容,否则在编译链接的时候会 出现错误。 为了调试方便,在PC机上编译x86版本的Qt/E及 Qtopia ,在PC机的linux操作系统模拟目标板进行应 用程序的开发。因为Qt-x11提供了一个虚拟帧缓冲 qvfb (qt virtual frame buffer),可以用来模拟一个嵌 入式目标板,开发的GUI应用程序就可以在qvfb上运行 从而进行测试。在PC机上通过测试后,最后再把应用 程序交叉编译,下载、运行在真正的目标设备上。 建立X86平台PC机的Qt开发环境(二) 解压缩并设置环境变量 安装tmake cd /pxa270Qt tar xzf tmake-1.13.tar.gz export TMAKEDIR=$PWD/tmake-1.13 安装Qt 2.3.2 tar xzf qt-x11-2.3.2.tar.gz export QT2DIR=$PWD/qt-2.3.2 安装Qt/E 2.3.10 tar xzf qt-embedded-2.3.10-free.tar.gz export QTEDIR=$PWD/qt-2.3.10 建立X86平台PC机的Qt开发环境(三) 编译Qt 2.3.2 cd $QT2DIR export TMAKEPATH=$TMAKEDIR/lib/linux-g+ export QTDIR=$QT2DIR export PATH=$QTDIR/bin:$PATH export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH echo yes|./configure -no-xft make mkdir $QTEDIR/bin cp bin/uic $QTEDIR/bin/ 建立X86平台PC机的Qt开发环境(四) 编译qvfb export TMAKEPATH=$TMAKEDIR/lib/linux-g+ export QTDIR=$QT2DIR export PATH=$QTDIR/bin:$TMAKEDIR/bin:$PATH export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH cd $QTEDIR/tools/qvfb tmake -o Makefile make mv qvfb $QTEDIR/bin/ 建立X86平台PC机的Qt开发环境(五) 编译Qt/E 2.3.10 cd $QTEDIR export TMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g+ export QTDIR=$QTEDIR export PATH=$QTDIR/bin:$PATH export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH cp $QPEDIR/qconfig-qpe.h src/tools/ ./configure -no-xft -qvfb -depths 4,8,16,32 make 建立X86平台PC机的Qt开发环境(六) 在qvfb上显示Qt程序 cd $QTEDIR/examples/launcher export QTDIR=$QTEDIR export PATH=$QTEDIR/bin:$PATH export LD_LIBRARY_PATH=$QTEDIR/lib:$QT2DIR/lib:$LD_LIBRARY_PATH qvfb -width 640 -height 480 & sleep 10 ./launcher -qws 建立X86平台PC机的Qt开发环境(七) 编译Qtopia2.1.1 cd $QPEDIR export QTDIR=$QTEDIR export LD_LIBRARY_PATH=$QPEDIR/lib:$QTEDIR/lib:$LD_LIBRARY_PATH export PATH=$QPEDIR/bin:$PATH ./configure -edition pda -no-qtopiadesktop -displaysize 640x480 make make install 建立X86平台PC机的Qt开发环境(八) 在qvfb上显示Qtopia桌面 编辑qtopia.sh并保存在$QPEDIR/img/opt/Qtopia目录下,运行即可 #!/bin/sh export QTDIR=$PWD export QPEDIR=$QTDIR export KDEDIR=$QTDIR export TSLIB_TSDEVICE=/dev/input/event1 export LD_LIBRARY_PATH=$QPEDIR/lib export QWS_SIZE=640x480 export QWS_MOUSE_PROTO= “TPanel:/dev/input/event2 USB“ export PATH=$PATH:$QPEDIR/bin qvfb -width 640 -height 480 -depth 16 -nocursor& sleep 5 qpe 为ARM平台建立Qt开发环境(一) 上次实验我们在PC机上建立了Qt/E+Qtopia的模拟环 境,而我们的Qtopia桌面和应用程序最终还是要在ARM 开发板上运行的,所以这次我们要先建立Qt的交叉开发 环境,再交叉编译和运行Qt/Qtopia应用程序 为ARM平台建立Qt开发环境(二) 在Trolltech公司的网站上可以下载Qt/Embedded、 Qtopia的免费版本, 所需源码包如下: e2fsprogs-libs-1.37.tar.gzext2文件系统工具包 libjpeg-iwmmxt.tar.bz2jpeg解码库jpeg-6b tslib.tar.gz触摸屏工具包 tmake-1.13.tar.gztmake工具,编译Qtopia需要使 用 qt-2.3.2. tar.gzQt/X11-2.3.2, 需要使用其中的工具 qt-x11-free-3.3.4. tar.bz2Qt/X11-3.3.4,需要使用其中的工具 qt-2.3.10. tar.gzQt/Embedded 2.3.10 qtopia-free-2.1.1. tar.bz2Qtopia 2.1.1 为ARM平台建立Qt开发环境(三) 与PC机的X86平台安装Qt/E+Qtopia开发环境类似, 不 同的地方是这里还使用了几个另外的库,按照下面的顺 序编译注意:可参考qtopia-free-2.1.1自带的文档中的 Building Qtopia from Source 一章。 (1)解压缩源码包 (2)设置环境变量 (3)编译 jpeg-6b库 (4)编译e2fsprogs-libs库 (5)编译 tslib库 (6)编译Qt 2.3.2 (7)编译Qt/Embedded (8)编译 Qtopia 为ARM平台建立Qt开发环境(四) 在本次实验中,脚本文件buildqtopia.sh已为大家做好 了以上几步,我们可以将它复制到源代码目录,直接运 行该文件进行编译。大家可以分析buildqtopia.sh内容 ,掌握编译的步骤。 执行完buildqtopia.sh后,编译好的Qtopia位于 qtopia-free-2.1.1/img/opt/Qtopia目录下 根据开发板的配置建立Q
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年深圳中考数学复习分类汇编:填空中档重点题(二)解析版
- 2026年深圳中考数学复习分类汇编之解答中档题型:圆的计算与证明(解析版)
- 医学流行病学答辩缺失数据处理教学课件
- 医学慢阻肺合并认知障碍干预案例分析课件
- 《JBT 6271-1992 半喂入联合收割机技术条件》(2026年)实施指南
- 《JBT 6188.3-1992 16mm 槽系组合夹具紧固件 长方头槽用螺栓》(2026年)实施指南
- 沼气生产工复测考核试卷含答案
- 旅游定制服务师操作规程考核试卷含答案
- 2025人教版八年级数学上册 三角形全等的判定(第5课时)教案
- 电力电容器心体加工工创新思维考核试卷含答案
- 火龙罐联合耳穴压豆治疗失眠个案护理
- 病理切片制作技术-课件
- 2023版思想道德与法治专题1 担当复兴大任 成就时代新人
- 某县接受省义务教育质量监测的情况反馈报告
- GB/T 6074-1995板式链、端接头及槽轮
- GB/T 13871.1-2007密封元件为弹性体材料的旋转轴唇形密封圈第1部分:基本尺寸和公差
- 小学英语逆向教学设计策划课件
- 食品原料、食品添加剂、食品相关产品进货查验记录台账
- 洁净车间管理培训课件
- 荣誉证书模板范例可修改
- 糖尿病治疗-三重奏到八重奏课件
评论
0/150
提交评论