前言:
内容参考《操作系统实践-基于Linux应用与内核编程》一书的示例代码和教材内容,所做的读书笔记。本文记录再这里按照书中示例做一遍代码编程实践加深对操作系统的理解。
引用:
《操作系统实践-基于Linux应用与内核编程》
作者:房胜、李旭健、黄玲、李哲
出版社:清华大学出版社
资源:
教材资源
链接: https://caiyun.139.com/m/i?1A5Ch36dl1whD 提取码:jdQe
课件和电子资料源码
链接: https://caiyun.139.com/m/i?1A5CvEKY07Uzs 提取码:xyv0
参考链接:
Linux Qt cannot find -lGL错误完美解决方案(亲测有效)
https://blog.51cto.com/yang/2894096QT安装具体图解 https://blog.51cto.com/yang/2894096
Ubuntu 发布 qt 程序(c++)_ubuntu下qt程序发布-CSDN博客
Ubuntu QT程序的发布_qt在ubuntu生成release-CSDN博客
正文:
1. 第8章-利用Qt开发GUI应用程序
到目前为止,所编写的所有程序都是运行在命令行终端上的,用户界面都是文本方式的。这一章学习如何在Linux上利用Qt框架开发具有图形界面的应用程序。Qt是一个跨平台的C++图形用户界面应用程序框架。使用Qt只要一次性开发应用程序,无需重新编写源码,便可以跨不同桌面和嵌入式操作系统部署这些应用程序。Qt Creator 是跨平台Qt IDE(集成开发环境),可单独使用,也可以与Qt库和开发工具组成一套完成的SDK。其中包括:C++代码编辑器,项目和生成管理工具,集成的上下文相关帮助系统,图形化调试器,代码管理和浏览工具。
本章首先介绍Qt及Qt Creator的使用,然后讲解Qt的信号/槽机制以及Qt图形界面设计。通过本章血虚,使读者对于Qt框架下进行应用程序开发的流程有个总体的了解。
本章学习目标
- 掌握Qt/Qt Creator环境下进行应用开发的流程
- 理解并掌握Qt的信号/槽机制
- 学会用Qt Designer进行界面设计
1.1 Qt简介
Qt是一个跨平台的C++图形用户界面应用程序框架,为应用程序开发者构建艺术级的图形用户界面提供了有力的支持。Qt与Windows平台上的MFC是同类型的东西。
1.1.1 Qt的功能与特性
直观的C++类库。模块化Qt C++类库提供了一套丰富的应用程序生成块(block),包含了构建跨平台应用程序所需的全部功能。具有直观,易学,易用及声测会给你好理解,易维护的代码的特点。
跨平台可移植性。使用Qt,只需要一次性开发应用程序,就可以跨不同操作系统进行部署,而无需重新编写代码。
具有跨平台的集成开发环境。Qt Creator是专为Qt开发人员定制的跨平台集成开发环境(IDE),它可以在Windows,Linux/X11和MAC OS X桌面操作系统和移动平台上创建应用程序。
(2)Qt类库
模块化Qt C++类库提供了一套丰富的应用程序生成块,包含了生成高级跨平台应用程序锁需的全部功能。
先进的图形用户界面(GUI)。Qt使用平台支持的本地化图形API,充分利用系统资源并给与应用程序本地化的界面。
多线程。Qt的跨平台多线程功能简化了并行编程,它的同步功能可以更加轻松的利用多核构架。另外基于Qt的信号于槽,可实现跨线程类型安全的对象间通信。
对象间通信。在开发应用程序的过程中,常见的系统崩溃问题的整洁根源是如何在不同的组件之间进行通信。对于该问题,Qt提供了信号(Signal)和槽(Slot)机制。
多媒体框架。Qt使用Phonon多媒体框架为众多多媒体格式提供跨桌面于嵌入式操作系统的回访功能。Phonn可以轻松的讲音频于视频的回放功能加入到Qt应用程序中,并且在每个目标平台上提取多媒体格式与框架。
网络连接。Qt使网络编程更简单,并支持跨平台网络编程。
数据库。Qt帮助程序员将数据库与Qt应用程序无缝集成。Qt支持所有主要的数据库驱动,并可将SQL发送到数据库服务器,或者让Qt SQL类自动生成SQL查询。
1.1.2 Qt Creator
Qt Creator 是为Qt跨平台开发人员量身定制的,轻量级集成开发环境(IDE),支持包括Linux,MAC OS X及Windows在内的多种操作系统。Qt Creator的主要功能如下
为Qt跨平台开发人员量身定制。集成了特定于Qt的功能,如信号于槽(Signals & Slots)图示调试器,对Qt类结构可以一目了然。集成了Qt Designer可视化布局和格式构建器,只需要单击就可以生成和运行Qt项目。
高级代码编辑器。Qt Creator的高级代码编辑器支持编辑C++和QML(JavaScript)上下文相关帮助,代码补全,本机diamante转化及其他功能。
集成用户界面设计器:Qt Creator提供了两个集成的可视化编辑器,用于通过Qt Widget 生成用户界面的 Qt Designer,以及用于通过QML予以按开发动态用户界面的Qt Quick Designer。
项目和编译管理。无论是导入还是创建一个新的项目,Qt Creator都能生成所有必要的文件,包括对crsoss-qmake和Cmake的支持。
桌面和移动平台。Qt Creator支持在桌面系统和移动设备中编译和运行Qt应用程序。通过编译设置,可以在目标平台之间快速切换。
Qt模拟器。Qt模拟器可在目标移动设备相似的环境中对移动设备的Qt应用程序进行测试。
1.2 Qt的安装和启动
Qt的安装方式有两种,一是采用SDK的安装方式,SDK中默认集成了Qt Creator和Qt库;而是采用Qt库与Qt Creator分别安装的方式。这里采用第一种方式。
1.2.1 对主机环境的要求
用于Linux 的Qt安装程序假定C++编译器,调试器(debugger),Make以及其他开发工具是由主机操作系统提供的。另外,构建图形Qt应用(graphical Qt application)要求安装OpenGL库和头文件。多数Linux默认情况下不会安装上述内容,不必担心,安装他们其实很简单,在Ubuntu下可以通过下面命令来安装Qt应用开发的基本需求。
1.2.2 安装Qt
参考如下 如下博文链接,下载Linux Unbuntu x86-64 位Qt 5.14.2 安装包。
QT安装具体图解https://blog.51cto.com/yang/2894096
按照博文提示,到如下链接下载Qt安装包,因为本文使用的X86-64 Unbuntu Linux虚拟机,所以下载Linux安装包。
https://download.qt.io/archive/qt/5.14/5.14.2/
下载安装包之后,进入下载目录执行安装,执行安装
安装时会弹出图形安装界面,按照提示执行安装,
安装Qt需要输入注册Qt账号,如果没有就注册一个Qt账号,输入Qt账号密码后继续安装
这里需要做一些选择。(须需要选择所有"Qt 5.14.2下的子勾选框,除Android外暂时还不需要编写安卓应用)。
之后执行下一步,Qt Creator 安装完成
1.2.3 Qt Creator 的界面组成
启动Qt Creator,其界面组成如下图所示,主要包括主窗口区,菜单栏,模式选择器,常用按钮,定位器和输出面板等。在这里只简单介绍一下的它们的功能,至于它们的具体使用方法,等到真正用到的时候再逐步掌握。
模式选择器
Qt Creator分为7个模式:欢迎,编辑,设计,调试,项目,分析和帮助,分别有左侧的7个图标进行切换,对应的快捷键是Ctrl + 数字1~7。
- 欢迎模式。在这里可以看到一些入门教程,开发项目列表,Qt提供的示例程序,也可以创建或打开一些项目。
- 编辑模式。主要用以管理项目文件,编辑程序代码。
- 设计模式。主要用于设计图形界面,进行部件属性的设置,信号和槽的设置等。
- 调试模式。用于程序的调试,包含设置断点,单步运行,调试过程监视等。
- 项目模式。用于对项目的构建设置,运行设置,编辑器设置等。
- 分析模式。用于代码分析
- 帮助模式。其包括Qt和Qt Creator的各种帮助信息。
常用按钮
器包括目标选择器(Target selector),运行(Run),调试(debug)和构建(Build all)等4个按钮。其中目标选择器用以选择平台,编译项目的哪个版本(Debug版本或release版本);运行按钮用以项目的构建和运行,调试按钮用以进入调试模式,构建全部按钮可以构建所有打开的项目。
定位器(Locator)
定位器用于快速定位项目,文件,类,方法,帮助文档及文件系统。
输出面板
其中包含了构建问题,搜索结果,应用程序输出和编译输出等。
1.3 用Qt Creator完成一个GUI项目
本节用Qt Creator来完成一个图形用户界面(GUI)的项目,其功能就是显示一个字符串“Hello World”。尽管简单,但却包含了一个应用程序的基本要素。通过这个项目,旨在让读者掌握Qt项目的建立,编译,运行和发布的整个过程。
1.3 .1选择项目模版
单击欢迎中的New Project按钮(或通过文件菜单中的新建文件或项目命令,或者Ctrl+N组合)打开新项目(New Project)对话框,首先看到的是项目模板的选择。这里选择"Qt Widgets Application(Qt部件应用)选项,然后点击Choose按钮。
1.3 .2设置项目信息
接下来是设置项目名称和项目路径,将其分别设置为QtHello和/home/os/QtProjects(注意这里项目名和路径名都不能包含中文)。
单击下一步按钮进入工具选择(Kit Selection),这里用以指定项目所使用的编译器,调试器等工具,同事包含了醒目调试(Debug)和发布(Release)的输出路径,这些都不必修改保持默认设置即可。
在接下来的类信息中,用以设置要创建源代码文件的基本类信息,这里将类名修改为WinHello,会发现相应的头文件,源文件和界面文件的文件名都自动生成了,保持默认设置即可。
1.3.3 界面设计
双击项目文件列表中的界面文件 Winhello.ui ,此时进入了设计模式,设计模式下的界面包括了如下几个部分:
- 主设计区。用来设计应用程序界面以及设置各个部件的属性。
- 部件列表窗口(Widget Box)。这里是常用的标准组件,可以直接拖放到程序界面上
- 对象查看器(Object Inspector)。这里列出了界面上所有部件的对象名称和父类,其树形结构表示了部件之间的从属关系。
- 属性编辑器(Property Editor)。用以显示,编辑当前选中部件的属性,如大小,位置等
- 动作(Action)编辑器和信号和/槽编辑器。关于它的作用会在信号和/槽之后详细介绍
- 快捷按钮区。这里是设计中常用功能的快捷按钮
现在,从部件列表窗口将Push Button(按钮)部件拖动到设计区界面上,双击它进入编辑状态,输入"Hello Linux"。
至此,这个项目的设计工作就算完成了,没有写任何程序代码。
程序运行。点击下方的“运行”按钮(或者Ctrl+R组合键)即可运行程序。
前面运行的其实是Debug版本的程序,发布的时候要使用Release。单击“运行”按钮开始编译运行。此时会发现工程目录下的Release目录中游客可执行文件QtHello。
需要Release版本,可以点击“目标选择器”选择 "Relase",之后点击运行。在工程目录下就会有可执行文件QtHello。
1.4 信号和槽
信号/槽作为Qt核心机制在Qt变成中有着广泛的应用。本节介绍信号和槽的概念,以及使用方法及在实际使用过程中应注意的一些问题。
1.4.1信号和槽的概念
首先考虑一个事件驱动程序的原理:一个应用程序的GUI通常包含菜单,工具栏,文本框,按钮等元素,这些元素统称为GUI部件。当用户与某个部件交互时,例如单击按钮,向文本框输入文本等,该部件会发出信号(clicked,text_changed),如果程序员将该信号连接到某个信号处理函数,那么当信号发出时就会调用相应的信号处理函数进行处理(如弹出一个对话框或者对输入的文本进行合法性检查)。在Qt中,这个信号处理函数就叫槽。
可以简单的理解为,当特定事件发生的时候,信号被发出,而一个槽就是一个函数,用于对特定信号响应。任意信号都可以连接任意或多个槽,或跨多个线程。
Qt代码并不是真正的C++代码。Qt专门定义两个伪关键字 signals 和 slots,分别用来标识程序代码中的信号和槽。这有利于代码的可读性和可维护性,可以根据需要方便的定义信号和相应的槽,并把两者连接起来,事件驱动处理就算完成了。有标准C++编程经验的人都会有这么一个感受:Qt的信号-槽比标准C++中的消息处理机制更加简单明了。但是,事实上Qt的代码最终会转化为标准C++代码来执行。Qt的代码要经过一个预处理(pre-pre process):搜索关键字并用标准C++代码替换它们。当然这个过程对于程序员来说是透明的。
在Qt中使用信号和槽有以下一些限制
- 信号和槽所属的类必须是QObject的派生类
- 如果使用多重继承,QObject必须在类列表中第一个出现
- 类的声明中必须出现 Q_OBJECT 语句。
- 信号不能再模板中使用。
- 函数指针不能作为信号和槽的参数。
- 信号和槽不能被覆盖和提升为public方法
1.2 .2 用信号-槽机制响应GUI事件
在上一节的QtHello项目中,当用户单击主窗口上的按钮时没有任何反应。现在在这个项目上应用信号-槽机制,是的用户单击按钮时有所响应。
使用Qt Creator打开QtHello项目。在编辑模式下双击图形界面 winhello.ui ,此时会自动切换到设计模式。然后在按钮部件上右击并选择快捷菜单中的“转到槽”命令,如下图所示。
在弹出的“转到槽”对话框中选择 clicked()信号并单击确定按钮。这时会跳转到编辑模式winhello.cpp的 on_pushButton_clicked()函数处,这个就是自动生成的槽,它的声明已经在winhello.h中自动生成。只需要编写函数体即可,在函数体重添加以下两行代码
QDialog *dlg = new Dialog(this);
dlg->show()
这个创建一个对话框对象dlg,然后让其显示,这里的 this 参数表明这个对话框的父窗口是 MainWindow 。注意:winhello.cpp 中还需要添加头文件包含 #include <QDialog>。
运行这个项目,每当点击按钮时就会弹出一个对话框,如下图所示。
这里的信号 clicked 是按钮部件固有的,槽 on_pushButton_clicked 也是自动生成的,另外,背后还有一个信号和槽的关联。在自定义类中,只要它的基类是 QObject,就可以自定义信号和槽,并需要显式的通过 QObject 类的静态方法 connect 将信号和槽关联起来。一个信号可以和关联多个槽,一个槽也可以关联多个信号。一旦关联,就可以在代码的任何地方调用 emit 还发射信号。
- signals 信号
- slots 槽
- QObject基类
- QObject类的静态方法 connect,把信号和槽关联起来
- emit 发射信号
1.2 .2信号和槽的进一步说明
1. 信号和槽的关联方式
a) 默认关联
Qt 提供了一种默认信号-槽对应方式。将槽的名称定义为 "on_部件名称_信号名称(参数列表)的”形式,例如 QtHello 项目中的 “on_pushButton_clicked()”。当定义了这样的槽之后,Qt会自动将该槽与界面部件的信号相关联。当触发了相关事件之后这个槽将会被触发。
b)显式关联
另一种方式是显式地调用 QObject::connect 函数来关联信号和槽。语法格式为:
connect(发出信号的部件,SIGNAL(信号函数的原型),响应信号的的对象,SLOT(槽函数原型));
2. 信号-槽与普通成员函数的区别
它们只是定义的区域不通而已。信号函数需要声明在头文件的signals关键字后面,无需实现。而槽则要定义在 public/private slots 关键字后面。槽的实现与正常函数一样,也像普通函数那样可以被直接调用,当然调用权限与slots前面的范围控制关键在 (puglic/private)有关系。
3. 几点说明
a)一个信号可以多次使用connect函数与多个槽关联,信号触发后这些槽不能保证调用顺序,但都会执行一遍。
b)多个信号可以关联到同一个槽
c)信号之间可以互相关联。语法格式为:
connect(对象1,SIGNAL(信号函数原型),对象2,SIGNAL(信号函数原型));
当第一个信号触发时,另一个信号也会触发。
d)使用disconnect函数移除信号-槽的关联
e)信号与槽的参数必须顺序一致,类型相同。如果信号的参数比槽的参数多,多余的参数被忽略;反之报错。
f)信号-槽机制不仅仅限于界面开发,普通的类也可以声明信号和槽,并建立关联。触发信号的语法格式为:
emit 信号名称(实参列表);
实验3:信号-槽机制
创建一个基于对话框的项目(基类选择QDiag),项目名称取为QSignalSlot。然后添加一个对话框,并基于信号-槽的关联实现对话框的打开,关闭等操作,理解并掌握信号-槽机制(参见电子资源“源代码/ch08/exp3/QSignalSlot”)。
参考链接:QT 新建弹框步骤 Dialog, 按钮文字修改_qt添加dialog-CSDN博客
a) 创建父窗口QDialog
b)添加子窗口QDiaglog
鼠标点击项目,在弹出的菜单里选择“Add New...”,选择添加 New C++ Class
选择“QT设计师界面类”
选择 Qdiaglog
选择子QDialog的名称
添加完成子对话框"qdlgchild"
创建成功,现在工程中有"QSignalSlot"中有两个QDiag设计UI类可以设计
点击"qdig.ui"对父对话框进行设计
点击"qdigchild.ui"对子对话框进行设计
修改父对话框中的“QPushButton”的槽函数,点击父对话框中按钮时,打开子对话框
修改父对话框的槽函数 on_pushButton_clicked,创建一个子对话框对象,然后执行子对话框对象 show函数显示子对话框。
执行结果
1.5 Qt设计师
Qt的另一个突出优点是它在GUI设计方面的卓越性。它提供了一个GUI设计开发程序Qt Designed(Qt设计师),可以很方便的通过鼠标拖拽的方式绘制界面。使用Qt Designer,开发人员可以创建对话框样式的应用程序,有可以创建带有菜单,工具栏以及其他标准组件的“主窗口”样式的应用程序。
1.5.1 简介
Qt Designer 已经被集成到Qt Creator中,当Qt Creator切换到设计模式时就启动了 Qt Designer。
用Qt Designer绘制界面程序会保存在界面文件(ui)文件中。ui文件的一个核心方式就是 setupUi,它接收一个QWidget *参数或QMainWindows*参数。这个方法会自动在传入的QWidget或QMainWindow上根据设计师绘制的界面创建可视化部件。
可以通过前面的QtHello项目看一下ui文件如何被利用的。在这个项目中,当定义主窗口类(WinHello)时,创建了一个私有成员ui指针,在构造时新创建(new)一个设计好的界面,并使用ui指向它。在构造函数中调用了ui的 setupUi 方法将主窗口 WinHello 传给了 ui (ui -> setupUi(this))。这时已经可以在WinHello中显示绘制的界面了。在此后的程序中,可以使用 ui->部件名称 的方式来引用界面中的可视化部件。
至此,显示已经没有问题了,还需要设置界面元素的信号-槽关联,使之可以响应时间,信号-槽关联的知识见上节。
1.5.2 Qt设计师的功能
由于篇幅所限,这里只简单介绍一下Qt设计师提供的功能和主要的GUI部件。
a) Qt Designer的界面布局
启动Qt Designer并打开掐面的QtHello项目,双击打开界面文件进入设计模式(启动Qt Designer)。
Qt Designer主要由部件盒,对象查看器,属性编辑器,动作编辑器和信号-槽编辑器组成,界面中间是设计的窗体。
b)部件盒
部件盒是Qt Designer为使用者提供的窗口部件的集合,其中的部件种类因Qt版本不同可能会略有差异,通常有 Layouts,Spaces,Buttons,Items Widgets,Item Widgets,Containers,Input Widgets,Display Widgets等大类。
使用部件盒的方式是选中某一个部件,将它拖放到要设计的窗体上,然后释放鼠标,这样就在界面设计器上添加了这个部件。
c)属性编辑器
将部件放好之后,涂擦会给你需要对各部件的属性进行设置。单击界面上的某一个部件,然后就可以在属性编辑器里设置它的属性了。
d)对象查看器(Object Inspector)
对象查看器用来查看和设置窗体中各个对象及属性。通常与属性编辑器撇和使用,一般是在设置好界面元素后,在对象查看器中查阅各个元素的分布以及总体的布局情况,然后选中某个窗口部件,切换到属性编辑器中编辑它的属性。
Qt Designer的其它部件如动作编辑器,信号-槽编辑器等,将在第10章结合实例来介绍。
本章小结
Qt最突出的特点就是信号-槽机制和卓越的图形界面设计功能。本章吧重点放在了这两部分。另外,在Linux下安装Qt不像在Windows下那么简单,本章详细介绍了Qt环境的安装和启动。
关于Qt的强大功能还有很多,但由于篇幅限制,本章只介绍了其中很小一部分。本章旨在使读者对于Qt框架下进行应用程序开发的流程有个总体的了解,同时把Qt工具推荐给读者。当然,本章也是为第10章做的必要准备。
练习
应用程序原型设计:用Qt设计师设计一个学生城西管理界面,要求有成绩列表以及添加,编辑,删除,查询等操作界面,并利用信号-槽实现窗口的打开,关闭等操作。