基于qt的校园导航系统的设计与实现毕业设计内容摘要:
发的跨平台 C++图形用户界面 应用程序 开发框架。 它既可以开发 GUI 程序,也可用于开发非 GUI 程序,比如控制台工具和服务器。 Qt 是面向对象 的框架,使用特殊的代码生成扩展(称为元对象编译器 (Meta Object Compiler, moc))以及一些宏,易于扩展,允许组件编程。 2020 年,奇趣科技被 诺基亚 公司收购,QT 也因此成为 诺基亚 旗下的 编程语言 工具。 2020 年, Qt 被 Digia 收购。 2020 年 4 月,跨平台集成开发环境 Qt Creator 正式发布,实现了对于 iOS 的完全支持,新增WinRT、 Beautifier 等插件,废弃了无 Python 接口的 GDB 调试支持,集成了基于 Clang的 C/C++代码模块,并对 Android 支持做出了调整,至此实现了全面支持 iOS、 Android、WP。 Qt Creator 包含了一套用于创建和测试基于 Qt 应用程序的高效工具,包括: 一个高级的 C++代码编辑器 上下文感知帮助系统 可视化调试器 源代码管理 项目和构建管理工具 . 优良的跨平台特性 :Qt 支持下列操作系统 : Microsoft Windows 95/98, Microsoft Windows NT, Linux, Solaris, SunOS, HPUX, Digital UNIX (OSF/1, Tru64), Irix, FreeBSD, BSD/OS, SCO, AIX, OS390, QNX 等等。 面向对象 :Qt 的良好封装机制使得 Qt 的模块化程度非常高,可重用性较好,对于用户开发来说是非常 方便的。 Qt 提供了一种称为 signals/slots 的安全类型来替代 callback,这使得各个元件 之间的协同工作变得十分简单。 QT 实现的结构原理 Qt/Embedded 是 Trolltech 公司开发的面向嵌入式系统的 Qt 版本,与 X11 版本的 Qt 在最大程度上接口兼容,采用帧缓存( framebuffer)作为底层图形接口。 Qt/Embedded 类库完全采用 C++封装,并且有着丰富的控件资源以及较好的可移植性,大范围的 Qt/Embedded API 可用于多种开发项目。 Qt/Embedded 的实现结构 如图 21 所示: 图 21 QT 的实现结构图 Qt/Embedded 的底层图形引擎基于 framebuffer。 Framebuffer 驱动程序的实现分为两个方面:一方面是对 LCD 及其相关部分的初始化,包括画在缓冲区的创建 北京邮电大学毕业论文设计 3 和对 DMA 通道的设置;另外一方面是对画面缓冲区的读写,具体到代码为 read、write、 lseek 等系统调用接口。 至于将画面缓冲区的内容输出到 LCD 显示屏上,则由硬件自动完成。 对于软件来说是透明的。 当对于 DMA 通道和画面缓冲区设置完成后, DMA 开始正常工作,并将缓冲区中的内容不断发送到 LCD 上。 这个过程是基于 DMA 对于 LCD 的不断刷新的。 基于该特性, framebuffer 驱动程序必须将画面缓冲区的存 储空间( 物理空间)重新映射到一个不加高缓存和写缓存的虚拟地址区间中,这样能才保证应用程序通过 mmap 将该缓存映射到用户空间后,对于该画面缓存的写操作能够实时的体现在 LCD 上。 QT 程序是基于 C++编写的,图形用户界面编程同时需要运行效率和高水平的灵活性。 Qt 通过结合 C++的速度为这一领域提供了 Qt 对象模型。 Qt 把下面这些特性添加到了 C++当中: 一种被称为信号和槽的非常强大的机制;可查询和可设计的属性项;强大的事件和事件过滤器;根据上下文进行国际化的字符串翻译;完善的时间间隔驱动的计时器等。 许多 Qt 的特性是 基于 QObject 的继承,通过标准 C++技术实现的。 QApplication 是必须构造的 Qt 主对象,需要在一开始的时候就构造这个对象,并把命令行参数传递给这个对象,每个 Qt 应用程序有且仅有一个 QApplication 对象,该对象必须在做其他事之前创建,这个对象处理一些底层操作,如事件处理、字符串本地化和控制界面外观等。 信号和信号处理函数是 GUI 应用程序用来响应用户输入的基本机制,也是所有 GUI 库的核心特征, Qt 的信号处理机制由信号 (signal)和槽 (slot)构成,它们相当于 GTK+中的信号和回调函数。 在 Qt 中回调函数就叫做槽。 信号和槽用于对象间的通讯 ,它的基本语法为: connect(object1,signal1,object2,slot1)。 QT QWidget 简介 详细描述 QWidget 类是所有用户界面对象的基类。 通俗的来讲, 基本上所有的 UI 类都是由 QWidget Qt 继承出来的,而 QWidget 继承于 QObject, 大家可以查阅 Qt source 即可发现一些微妙的写法,如这篇文章有详细介绍: Qt 库对象数 据的声明和使用 窗口层次 窗口部 件是用户界面的一个原子:它从窗口系统接收鼠标、键盘和其它事件,并且在屏幕上 绘制自己的表现。 每一个窗口部件都是矩形,并且它们按 Z 轴顺序排列的。 一个窗口部件可 以被它的父窗口部件或者它前面的窗口部件盖住一部分。 QDialog 是最普通的顶级窗口。 不被嵌入到一个父窗口部件的窗口部件被叫做顶级窗口部件。 通常情况下, 顶级窗口部件是有框架和标题栏的窗口 (尽管如果使用了一定的窗口部件标记,创建顶级窗口部件时也可能没有这些装饰。 )在 Qt 中, QMainWindow 和和不同的 QDialog 的子类是最普 通的顶级窗口。 一个没有父窗口部件的窗口部件一直是顶级窗口部件。 非顶级 窗口部件是子窗口部件。 它们是它们的父窗口部件中的子窗口。 你通常不能在视觉角度从它 们的父窗口部件中辨别一个子窗口部件。 在 Qt 中的绝大多数其它窗口部件仅仅作为子窗口 部件才是有用的。 (当然把一个按钮作为或者叫做顶级窗口部件也是可能的,但绝大多数人 喜欢把他们的按钮放到其它按钮当中,比如 QDialog。 ) QWidget 有很多成员函数,但是它们中的一些有少量的直接功能:例如, 北京邮电大学毕业论文设计 4 QWidget 有一个字体属性,但是它自己从来不用。 有很多继承它的子类提供了实际的功能,比如 QPushButton、 QListBox 和 QTabDialog 等等。 每一个窗口部件构造函数接受一个或两个标准参数: 1. QWidget *parent = 0 是新窗口部件的父窗口部件。 如果为 0(默认) ,新的窗口部件将是一个顶级窗口部件。 如果不是,它将会使 parent 的一个孩子,并且被 parent 的几何形状所强 迫(除非你指定 WType_TopLevel 作为窗口部件标记)。 QWidget 事件简介 基本事件 : * paintEvent() – 只要窗口部件需要被重绘就被调用。 每个要显示输出的窗口部件必须实 现 它并且不在 paintEvent()之外在屏幕上绘制是明智的。 * resizeEvent() – 当窗口部件被重新定义大小时被调用。 * mousePressEvent() – 当鼠标键被按下时被调用。 有六个鼠标相关事件,但是鼠标按下和 鼠标释放事件是到目前为止最重要的。 当鼠标在窗口部件内或者当它使用 grabMouse()来捕 获鼠标时,它接收鼠标按下事件。 * mouseReleaseEvent() – 当鼠标键被释放时被调用。 当窗口部件已经接收相应的鼠标按下 事件时,它接收鼠标释放事件。 这也就是说如果用户在你的窗口部件内按下鼠标,然后拖着 鼠标到其它某个地方,然后释放,你的窗口部件接收这个释放事件。 这里有一个例外:如果 出现在弹出菜单中,当鼠标键被按下时,这个弹出菜单立即会偷掉这个鼠标事件。 * mouseDoubleClickEvent() – 和它看起来也许不太一样。 如果用户双击,窗口部件接收一个鼠标按下事件(如果他们没有拿牢鼠标,也许会出现一个或两个鼠标移动事件) 、一个鼠标释放事件并且最终是 这个事件。 直到你看到第二次点击是否到来之前, 不能从一个双击中 辨别一个点击。 (这是为什么绝大多数图形用户界面图书建议双击是单击的一个扩展,而不 是一个不同行为的触发的一个原因。 ) 如果你的窗口部件仅仅包含子窗口部件,你也许不需要实现任何一个事件处理器。 如果你想检测在子窗口部件中的鼠标点击,请在父窗口部件的 mousePressEvent()中调用子窗口部件的 hasMouse()函数。 接收键盘的窗口部件需要重新实现一些更多的事件处理器: * keyPressEvent() – 只要键被按下和当键已经被 按下足够长的时间可以自动重复了就被调用。 注意如果 Tab 和 Shift+Tab 键被用在焦点变换机制中,它们仅仅被传递给窗口部件。 为 了强迫那些键被你的窗口部件处理,你必须重新实现 QWidget::event()。 *focusInEvent() – 当窗口部件获得键盘焦点(假设你已经调用 setFocusPolicy()) 时被调用。 写得好的窗口部件意味着它们能按照一种清晰但谨慎的方式来获得键盘焦点。 * focusOutEvent() – 当窗口部件失去键盘焦点时被调用。 一些窗口部件也许需 要实现一些不太普通的事件处理器: * mouseMoveEvent() – 只要当鼠标键被按下时鼠标移动就会被调用。 举例来说, 对于拖动, 这个很有用。 如果你调用 setMouseTracking(TRUE),尽管没有鼠标键被按下,你也会获得鼠 标移动事件。 (注意这个使用鼠标跟踪的应用程序在低下的 X 连接下不是很有用。 (也可以)参考拖放信息。 北京邮电大学毕业论文设计 5 * keyReleaseEvent() – 只要键被释放和当如果这个键是自动重复的并且被按下一段时间时就被调用。 在这种情况下窗口部件接收一个键释放事件并且对于每一 个重复立即有一个键按下事件。 注意如果 Tab 和 Shift+Tab 键被用在焦点变换机制中,它们仅仅被传递给窗口部件。 为了强迫那些键被你的窗口部件处理,你必须重新实现 QWidget::event()。 * wheelEvent() — 当窗口部件拥有焦点时,只要用户转动鼠标滚轮就被调用。 * enterEvent() – 当鼠标进入这个窗口部件屏幕空间时被调用。 * leaveEvent() – 当鼠标离开这个窗口部件的屏幕空间时被调用。 * moveEvent() – 当窗口部件相对于它的父窗口部件已经被移动时被调用。 * closeEvent() – 当用户关闭窗口部件时(或这当 close()被调用时)被调用。 这里还有一些不太明显的事件。 它们在 中被列出并且你需要重新实现 event()来处 理它们。 event()的默认实现处理 Tab 和 Shift+Tab(移动键盘焦点)并且其它绝大多数事件给 上面提到的一个或更多的特定处理器。 Window flag 标识 关于 QWidget 的 flag 的介绍: enum Qt::WindowType flags Qt::WindowFlags 这两个参数参 阅官方文档。 Qt 的 WindowFlags 有很多,实际使用时,若不关心窗口层次的话,大可不比太关心这个。 比如说在 Window 上做应用开发 ,大可只关注: Qt::Dialog, Qt::Tool, Qt::Window 即可。 但 若是做嵌入式开发就得好好看看这个属性,整理好这部分属性,有利于窗口管理。 着重介绍几个重要成员函数 : bool QWidget::close () [slot] 关闭这个窗口部件。 如果窗口部件被关闭,返回真 ,否则返回假。 首先它发送给这个窗口部 件一个 QCloseEvent。 如果它接收这个关闭事件,它就被隐藏了。 QWidget::closeEvent()的默 认实现是接收这个关闭事件。 当最后一个可视的顶级窗口部件被关闭, QApplication::lastWindowClosed()信号被发射。 注意窗口的 enum Qt::WidgetAttribute 属性,窗口默认属性是 Qt::WA_MacOpaqueSizeGrip, 设置上这个属性意味着窗口调用 close()只销毁了 UI 想关, QWidget 内还有很多内存空间没 有释放,需调用 delete 销毁 QWidget。 若需要在调用 close 时一并销毁窗口可以给窗口设 置 Qt::WA_DeleteOnClose 属性。 bool QWidget::event ( QEvent * e ) [虚 保护 ] 这是主事件处理器,它处理事。基于qt的校园导航系统的设计与实现毕业设计
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。
用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。