当前位置:   article > 正文

Qt C++5.9开发指南

qt c++开发指南

 第1章 认识Qt

1.1 Qt简介

1、Qt是一套应用程序开发类库,但与MFC不同,Qt是跨平台开发类库。

2、跨平台意味着只需要编写一次程序,在不同平台上无需改动或只是需要少许改动后再编译,就可以形成不同平台上运行的版本。

1.2 Qt的获取与安装

1.2.1 Qt的许可类型

1.2.2 Qt的版本

1、如果不是为了维护旧版本编写的程序,一定要选用最新版本的Qt进行程序开发

1.2.3 Qt的下载与安装

1、从Qt官网可以下载最新版本的Qt软件。根据开发项目的不同,Qt分为桌面和移动设备应用开发,嵌入式设备开发俩大类不同的安装包。

1.3 Qt Creator初步使用

1.3.1 Qt Creator的界面组成

1.3.2 Qt Creator的设置

1.4 编写一个Hello world程序

1.4.1 新建一个项目

1、Qt Creator可以创建多种项目:

  • Qt Widgets Applocation,支持卓明平台的有图形用户界面的应用程序。GUI的实际完全基于C++语言
  • Qt Console Application,控制台应用程序,无GUI界面
  • Qt Quick Application,创建可部署的Qt Quick 2应用程序。Qt quick是Qt支持的一套GUI开发架构,其界面设计采用QML语言,程序架构采用C++语言。
  • Qt Quick Control 2Application,创建基于Qt Quick Controls 2组件的可部署的Qt Quick 2应用程序。
  • Qt Canvas 3D Application,创建Qt Canvas 3D QML项目,也是基于QML语言的界面设计,支持3D画布

2、在编译工具时,依据选择的工具可以编译生成不同版本的可执行程序

3、创建界面基类,有3中基类可以选择

  • QMainWindow是主串口类,主串口具有主菜单栏、工具栏和状态栏,类似于一般的应用程序的主窗口
  • QWidget是所有具有可视化界面的基类,选择QWidget建的界面对各种界面组件都可以支持
  • Qdialog是对话框类,可建立一个基于对话框的界面

1.4.2 项目文件组成和管理

1、在项目节点下面,分组管理着项目内容的各种资源文件,几个文件及分组分别以下几项

  • *.pro是项目管理文件,包括对一些项目的设置项
  • Header分组,该节点是项目内所有的头文件
  • Source分组:该节点下是项目内的所有C++文件
  • Forms分组:该节点是项目内所有界面文件(*.ui)

1.4.3 项目的编译、调试、运行

1、可以对程序设置断点进行调试,但必须以Debug模式编译

1.5 在Visual Studio里面使用Qt

第 2章 GUI应用程序设计基础

2.1 UI文件设计与运行机制

2.1.1 项目文件组成

1、项目文件目录文件说明

  • *.pro,储存项目设置的文件
  • 主程序入口文件main.cpp,实现main()函数的程序文件
  • 窗体界面文件*.ui,一个XML格式存储的窗体上的员文件及其布局文件
  • widget.h文件是所有窗体类的头文件

2.1.2 项目管理文件

1、项目文件用于记录项目的一些设置,以及项目包含文件的组织管理

2、当添加一个文件到项目,或从项目里面删除一个文件时,项目管理文件里的条目会自动修改

2.1.3 界面文件

1、双击*.ui文件,会打开Qt Designer对窗体进行客制化设计,UI设计其有以下功能区域

  • 组件面板。串口左侧是界面设计组件面板,分为多个组,如Layouts、Buttons等
  • 中间主要区域是待设计的窗体。
  • Signals和Slotes编辑器与Action编辑器位于待设计窗体想法的俩个编辑器。Signals和Slots编辑器用于可视化地进行信号与槽的关联,Acrion编辑器用于可视化设计action
  • 界面和界面设计工具栏。窗口上方的一个工具栏,工具栏上的按钮主要实现布局和界面设计
  • 对象浏览器(Object Inspector),用树状图显示每个组件的对象名称和类名称

2.1.4 主函数文件

1、最后一行a.exec()启动应用程序的执行,开始应用程序的消息循环和事件处理

2.1.5 窗体相关的文件

1、Q_OBJECT是使用Qt信号与槽机制的类必须加入的一个宏

2、ui_widget.h文件主要做以下工作

  • 定义一个类,用于封装可视化设计的界面
  • 自动生成了界面各个组件的类成员变量定义
  • 定义了setupUi()函数,这个用于创建各个界面组件

2.2 可视化UI设计

讲解GUI的常见功能,包括界面设计时布局的管理,程序里如何访问界面组件,以及Qt关键的信号与槽的概念。

2.2.1 实例程序功能)

1、objectName是窗体上创建的组件实例名称,界面上每个组件需要有一个唯一的objectName

2、窗体的objectName就是窗体的类名称,在UI设计器链不要修改窗体的objectName,窗体的实例名称需要在使用窗体的代码里去定义

2.2.2 界面组件布局

1、所谓布局就是界面上组件的排列方式,使用布局可以是组件有规则地分布,并且随着窗体大小变化自动地调整大小和相对位置

2、布局设计

  • 界面组件的层次关系,使用一些容器类,如QgroupBox、QtabWideget、QFram等
  • 布局管理,组件板中有Layouts和Spacers俩个组件面板

  

      

  • UI设计工具栏具备各按钮的功能

 3、伙伴关系(Edit Buddies)是值界面上一个Label和一个组件关联,为了程序运行时,用快捷将快速将输入焦点切换到某个组件上,在标签Text属性设置为(“&N”),表示指定快捷键为N,通过Alt+N就可以切换

2.2.3 信号与槽

1、信号就是在特定情况下,被发射的事件

2、槽就是对信号形影的函数,槽函数可以与一个信号关联,当型号被发射是,关联的槽函数被自动执行

3、信号与槽关联是用QObject::connect()函数实现的,其基本格式connect(sender,SIGNAL(signal()),recevier,SLOT(slot()));

4、当一个信号与多个槽函数关联是,槽函数按照建立连接时的书序依次执行

2.2.4 可视化生成槽函数原型和框架

1、UI设计效果为生效待确认

2.3 代码化UI设计

 1、由于界面设计的底层其实都是由C++语言实现的,底层实现的功能比可视化设计更加强大和灵活。

2.3.1 实例功能

1、不勾选“Generate form”复选框。创建后的项目文件目录下没有qwdlgmanual.ui文件

2.2.2 界面创建

1、采用代码设计实现UI时,需要对组件布局有个完整的规划,不如可视化设计直观,并且编写代码工作量大

2.2.3 信号与槽的关联

2.4 混合方式UI设计

2.4.1 设计目的

1、组件无法可视化地添加到界面上

2.4.2 创建项目并添加资源文件

1、主要是指图标等文件的添加

2.4.3 设计Action

1、所有用于菜单和工具栏的设计的功能都需要Action来实现

2.4.4 设计菜单和工具栏

2.4.5 代码创建其他界面组件

2.4.6 Action的功能实现

2.4.7 手动创建的组件的信号与槽

2.4.8 为程序设置图标

2.5 QT Creator使用技巧

 

第3章 Qt类库概述

1、Qt类库中大类的类是以模块形式分类组织的,包括基本模块和扩展模块等。一个模块通常是一个编程主题

3.1 Qt核心特点

3.1.1 概述

1、Qt本身并不是一种语言,它实质上是一个扩平台的C++开发类库,是用标准C++编写的类库,它为开发GUI应用程序和非GUI应用程序提供了各种类。

2、Qt元对象编译器是一个预处理器,在源程序被编译前先将这些Qt特性的程序转换为标准C++兼容的形式

3、Qt为C++语言增加的特性就是在Qt Core模块里实现的,这些扩展特性由Qt的元对象系统实现,包括信号与槽机制、属性心痛、动态类型转换等。

3.1.2 元对象系统

1、Qt的元对象系统提供了对象之间通信的信号与槽机制、运行时类型信息和动态属性系统。元对像系统由以下三个基础组成:(1)QObeject类是所有元对象系统的基类(2)在一个类的private部分声明Q_OBJECT宏,使得类可以使用元对象的特性,如动态属性、信号与槽(3)MOC(元编译器)为每个QObject的子类提供必要的代码来实现元对象的特性。

2、对于QObject及其子类,还可以使用qobject_cast()函数进行动态投射,使得程序可以在运行时对不同的对象做不同的处理。

3.1.3 属性系统

1、Qt提供Q_PROPERTY()宏可以定义属性,它也是基于元对象系统实现的

2、只要知道昂属性名称,就可以通过QObeject::property读取属性中,并通过QObejct::setProperty()设置属性值。

3、可以在运行时为类定义一个新的属性,称之为动态属性。

4、属性系统的宏Q_CLASSINFO()可以为类的元对象定义“名称-值”信息

3.1.4 信号与槽

1、某些开发架构使用回调函数实现对象间通行。与回调函数相比,信号与槽的执行速度稍微慢一点,因为需要查找连接的对象和槽函数。

2、connect()缺省值为Qt::AutoConnection。枚举类型Qt::ConnectionType表示信号与槽之间的关联方式,有以下几种取值:

  • Qt::AutoConnection:如果信号的接收者与发送者在同一个线程,就使用Qt::DirectConnection方式,否则使用Qt::QueueConnection方式
  • Qt::DirectConnection:信号被发射是槽函数立即执行,槽函数与信号在同一个线程。
  • Qt::QueueConnection:在时间循环回到接受者线程执行槽函数,槽函数与信号在不同的线程
  • Qt::BlockingQueueConnection:与Qt::QueueConnection相似,知识信号线程会阻塞,直到参函数被执行完毕

3、可以使用sender()获得信号发射者,从而对信号发射者进行操作

4、可以在自己设计的类里面自定义信号,信号在signals下面定义,无需实现,只需发射(emit)

3.1.5 元对象特性测试实例

3.2 Qt全局定义

1、<QtGlobal>头文件包含了Qt类库的一些全局定义,包括基本数据类型、函数和宏。

3.2.1 数据类型定义

1、为确保各个平台数据类型都有统一确定的长度,Qt为各种数据类型定义了类型符号。

3.2.2 函数

1、包含了常用的函数的定义,这些函数多以模板类型作为参数,返回相应的模板类型,模板类型可以用任何其他类型替换。

3.3 容器类

3.3.1 容器类概述

1、Qt的容器类比标准模板库中的容器类更轻巧、安全和易于使用

2、Qt的容器类分为顺序容器和关联容器。

3、容器迭代类用于遍历容器里的数据项,有Java类型的迭代类易于使用,提供高级功能,而STL类型的迭代类效率更高一些。

3.3.2 顺序容器类型

1、Qt的顺序容器类型有QList(dequeue)、QLinkedList(list)、QVector(vector)、QStack和QQuere

3.3.2 关联容器

1、QMap、QMultiMap、QHash、QMultiHash和QSet

3.4 容器类的迭代

3.4.1 Java类型迭代器

1、对于每个容器类,有俩个Java类型迭代器:一个用于只读操作,一个用于读写操作。

3.4.2 STL类型迭代器

1、STL迭代器与Qt和STL的原生算法兼容

2、无需修改数据时,一定使用只读迭代器,因为他们速度更快。

3、STL类型的得带器是数组的指针,所以“++”运算符使得带器指向下一个数据项,“*”运算符返回数据项内容。

4、对关联容器,迭代器的“*”操作符返回数据项的值。

5、隐式共享是对象的管理放啊发,一个对象被隐式共享,知识传递该对象的一个指正给使用者,而不是复制对象数据,只有在使用者修改数据时,才实质复制共享对象给使用者。

6、当一个迭代器在操作一个容器变量时,不要去复制这个容器的变量。

3.4.3 foreach关键字

1、如果只是向遍历容器中所有项,可以使用foreach关键字

3.5 Qt类库的模板

1、Qt类库里大量的类功能分为各个模块,这些模块又分为几大类

  • Qt基本模块:提供了Qt在所有平台上的基本功能
  • Qt附加模块:实现一些特定功能的提供附加值的模块
  • 增值模块:单独发布的提供二外价值的模块或工具
  • 技术预览模块:一些处于开发阶段,但是可以作为技术预览使用的模块
  • Qt工具:帮助应用程序开发的一些工具

3.5.1 Qt基本模块

1、Qt基本模块是Qt在所有平台闪的基本功能,他们在所有的开发平台和目标平台上都可用。在Qt5所有版本上是源代码和二进制兼容的。

3.5.2 Qt附加模块 

1、这些模块可能只在某些开发平台上有,或只能用于某些操作系统,或只是为了向后兼容。

 

 3.5.3 增值模块

1、只在商业版许可的Qt里才有的

 

 3.5.4 技术预览模块

1、技术预览模块就是一些还处于开发和测试阶段的模块

3.5.5 Qt工具

1、Qt工具在所有支持的平台上都可以使用,用于帮助应用程序的开发和设计

第4章 常用界面设计组件

1、要应用Qt编写各种应用程序,重要的就是熟练掌握Qt类库里各种用于界面设计或其他功能的类的使用。

4.1 字符串与输入输出

4.1.1 字符串与数值之间的转换

4.1.2 QString的常用功能

1、QString储存在字符串中采用的是Unicode码,每一个字符是一个16位的QChar,而不是8位char,所以QString处理中文字符没有问题。

2、QString只要赋值,就在字符串的末尾自动加上“\0”,所以,如果只是要判断字符串内容是否为空,常用isEmpty()。

3、QString中一个汉字可以当做一个字符

4.2 SpinBox的使用

1、QSpinBox用于整数的显示和输入,一般显示十进制数,也可以显示二进制、十六进制的数。QDoubleSpinBox用于浮点数的显示和输入,可以设置显示小数位数。

4.3 其他数值输入和显示组件

4.3.1 实例功能

1、QSlider:滑动条,通过滑动来设置数值,可用于数值输入

2、QScrollBar:卷滚条,与QSlider功能类似,还可用于卷滚区域

3、QProgressBar:进度条,一般用于显示任务进度

4、QDial:表盘是数值输入组件

5、QLCDNumber:魔方LCD数字的显示组件

4.3.2 各组件的主要功能和属性

4.3.3 实例功能的代码实现

4.4 时间日期与定时器

4.4.1 时间日期相关的类

1、Qt中时间日期类型的类如下:

  (1)QTime:时间数据类型

  (2)QDate:日期数据类型

  (3)QDateTime:日期时间数据类型

  (4)QTimeEdit:编辑和显示日期的组件

  (5)QDateEdit:编辑和显示日志的时间组件

  (6)QDateTimeEdit:编辑和显示日期时间的组件

  (7)QCalendarWidget:一个用日历形式选择日期的组件

4.4.2 日期时间数据与字符之间的转换

4.4.3 QCalebndarWidget日历组件

4.4.4 定时器的使用

4.5 QComboBox和QPlainTextEdit

1、QComboBox是下拉列表框组件类,它提供一个下拉列表供用户选择,也可以直接单做一个QLineEdit用作输入。QComboBox除了显示可见下拉列表外,每个项还可以冠梁一个QVariant类型的变量,用于存储一些不可见数据。

4.5.1 实例功能概述

4.5.2 QComBox的使用

1、提供一个下拉列表供选择输入。可以直接对QComboBox组件的下拉列表的选项进行编辑。

2、可以使用代码添加简单项。

3、可以添加具有用户数据的项。利用变量存储用户定义数据。

4、不提供整个列表用于访问,可以通过索引访问某个项,当组件上的选择项发生变化时,会发射俩个信号。

4.5.3 QPlainTextEdit

1、用于编辑多行文本编辑器。提供cut()、copy()、paste()、undo()、redo()、clear()、selectAll()等标准编辑功能的槽函数。

2、有自带的有快捷菜单,可以事项常见的编辑功能

4.6 QListWidget和QToolButton

4.6.1 实例功能介绍

1、Qt中用于项(Item)处理组件有俩类:一类是Item Views,包括QListView、QTreeView、QTableView、QColumnView等;另一类是Item Widgets,包括QListWidget、QTreeWidget和QTabelWidget

2、Item Views基于模型/视图结构,视图与模型数据关联实现数据的显示和编辑。

3、Item Widgets是直接将数据存储在每一个项里

4.6.2 界面设计

1、QToolButton可以为其设置一个下拉式菜单,配合QToolButton的一些属性设置,可以有不同的下拉菜单效果。

2、ToolBox内可以放置任何界面组件,如QGroupBox、QLineEdit、QPushButton等。

3、QTabWidget组件是一个多页的容器类组件。在窗口放置一个QTabWidget组件,通过其快捷菜单的“Insert Page”“Delete Page”等菜单项实现页面的添加会删除。主要属性有:页面标签的位置、当前页的编号、当前页的标题、当前页的对象名称、为当前页设置一个图标。

4、QListWidget是存储多个项的列表组件

4.6.3 QListWidget的操作

1、列表框里一行是一个项,是一个QListWidgetItem类的对象,向列表添加一个项,就需要创建一个QListWidgetItem类型的实例aItem

2、QListWidget在当前切换时发送俩个信号,只是传递的参数不同。currentRowChanged(int currentRow):传递当前的行号作为参数;currentItemChanged(QListWidgetItem *current,QListWidgetItem *previous):传递俩个QList WidgetItem对象作为参数,current表示当前项,previous是前一项。

4.6.4 QToolButton与下拉式菜单

1、使用setActionsForButton()为一个QToolButton按钮设置一个Action之后,将自动获取Action的文字、图标、ToolTip等设置为按钮的响应属性。

4.6.5 创建右快捷菜单

1、每个从Qwidget继承的类都有信号customContextMenuRequested(),这个信号在鼠标右击时发射,为此信号编写槽函数,可以创建和运行右快捷菜单。

4.7 QTreeWidget和QDockWidget

4.7.1 实例功能概述

1、QTreeWidget类是创建和管理目录树结构的类。

2、QDockWidget停靠区域组件是可以在QMainWindow窗口停靠,或在桌面最上层浮动的界面组件。

4.7.2 界面设计

1、QScrollAre组件会自动显示水平或垂直方向的卷滚调,用于区域显示。

4.7.3 QTreeWidget操作

1、一个节点不能移除自己,所以需要获取其父节点,使用父节点的removeChild()函数来移除自己,主要要调用delte从内存中删除自己

4.7.4 QLabel和QPixmap显示图片

1、QPixmap存储图片数据,可以缩放图片

4.7.5 QDockWidget的操作

1、主窗口上的DockWidget组件可以被拖动,在主窗口的左、右俩侧停靠,或在桌面上浮动。

4.8 QTableWidget的使用

4.8.1 QTableWidget概述

1、在QTableWidget表格中,每一个单元格式一个QTableWidgetItem对象,可以设置文字内容、字体、前景色、背景色、图标,也可以设置编辑和显示标记。

4.8.2 界面设计与初始化

4.8.3 QTableWidget操作

1、可以为行表头的每个单元格创建一个QTableWidgetItem类型的变量,并进行相应设置。

2、QTableWidgetItem有一些函数对单元格进行属性设置:

  • setTextAlignment(int alignment):设置文字对齐方式
  • setBackground(const QBrush &brush):设置单元格背景颜色
  • setForeground(const QBrush &brush):设置单元格前景色
  • setIcon(const QIcon &icon):为单元格设置一个显示图标
  • setFont(const QFont &font):为单元格显示文字设置字体
  • setCheckState(Qt::CheckState state):设置单元格勾选状态,单元格里出现一个QCheckBox组件。
  • setFlags(Qt::ItemFlages flages):设置单元格的一些属性标记

3、获得当前单元格数据

4、插入、添加、删除行

5、可以自行调整行高和列宽

第5章 Model/View结构

是Qt中用界面组件显示与编辑数据的一种结构,视图是显示和编辑数据的界面组件,模型是视图与原始数据之间的接口

5.1 Model/View结构

5.1.1 Model/View基本原理

1、间界面组件与所编辑的数据分离开来,又通过数据源的方式连接起来,是处理界面与数据一种较好的方式。

2、基本结构(1)数据是实际的数据,如数据库的一个数据表或SQL查询结果(2)视图或视图组件是屏幕上的界面组件(3)模型或数据模型与实际数据通信。模型、视图和代理之间使用信号和槽通信。当源数据变化时,数据模型发射信号通知视图组件。

5.1.2 数据模型

1、所有的基于项数据的数据模型都是基于QAbstractItemModel类的,定义了视图组件和代理存取数据的接口。

5.1.3 视图组件

1、视图组件在显示数据时,只需要调用视图类的setModel()函数,为视图组件设置一个数据模型就可以实现视图组件与数据模型之间的关联。

5.1.4 代理

1、代理就是在视图组件上为编辑数据提供编辑器,如在表格组件中编辑一个单元格的数据时,缺省是使用一个QLineEdit

5.1.5 Model/View结构的一些概念

1、model/View的基本结构中,数据模型为视图组件和代理提供存取数据的标准接口。所有的数据模型类都从QAbstractItemModel继承而来

2、模型索引是为保证数据的表示与数据存取方式隔离,数据模型中引入了模型索引的概念。视图组件和代理都通过模型索引来获取数据。

3、行号和列号是用来定义数据模型的基本形式。

4、父项是所有数据的定层项

5、项的角色是在为数据模型的一个项设置数据时,可以赋予其不同项的角色的数据

5.2 QFileSystemModel

5.2.1 QFileSystemModel类的基本功能

1、可用于访问本机文件系统的数据模型,可以创建、删除、重命名目录

2、QFileSystemModel采用单独线程获取目录文件结构,而QDirMode不使用单独线程。

5.2.2 QFileSystemModel的使用

1、设置文件目录结构,常用函数是QSting filePath返回节点的目录名或待路径的文件名,fileName返回去除路径的文件夹名称或文件名。

5.3 QStringListModel

5.3.1 QStringListModel功能概述

1、用于处理字符串列表的数据模型,可以作为QListView的数据模型,在界面上显示和编辑字符串列表。

5.3.2 QStringListModel的使用

1、模型的编辑、添加、删除线的操作

5.4 QStandardItemModel

5.4.1 功能概述

1、QStandardItemModel是标准的以项数据(item data)为基础的标准数据模型类,通常与QTableView组合成Mode/View结构,事项通常的二维数据的管理功能。

5.4.2 界面设计与主窗口类定义

5.4.3 QStandardItemModel的使用

5.5 自定义代理的功能

5.5.1 自定义代理的功能

1、QTableView组件为每个单元格提供的是缺省的代理编辑组件,就是一个QLineEdit组件。可以通过为TabelView的某列或某个单元格是指自定义代理组件。

5.5.2 自定义代理类的基本设计要求

1、设计自定义代理组件,必须实现如下4个函数:(1)createEditor()函数创建用于编辑模型数据的widget组件(2) setEditorData()函数从数据模型获取数据,提供widget组件进行编辑(3)setModelData()将widget上的数据更新到数据模型(4)updateEditorGeometry()用于给widget组件设置一个合适的大小

5.5.3 基于QSpinBox的自定义代理类

1、自定义类需要继承QStyledItemDelegate.

第6章 对话框与多窗体设计

1、将介绍对话框和多窗体程序设计、调用方式、数据传递等问题,主要包括以下几个点:

  • Qt提供的标准对话框使用,如打开文件对话框、选择颜色对话框、字体对话框、消息提示和确认选择对话框等
  • 自定义对话框的设计和调用,如何获取返回值,在对话框中如何操作主窗体等
  • 在一个应用程序中如何设计多种窗体,基于QDialog、QWidget和QMainWindow创建的窗体的调用方式有哪些,他们之间有什么区别
  • 如何创建一个在多页组件中管理的多窗体应用,类似于现在流行的多页浏览器的界面效果,子窗体如何与主窗体实现交互
  • 如何创建MDI应用程序
  • 如何创建一个带有启动界面和登录界面的窗体,如何保存和读取应用程序设置的参数

6.1 标准对话框

6.1.1 标准对话框

1、Qt为应用程序设计提供一些常用的标准对话框,如打开文件对话框、选择颜色对话框、信息提示和确认选择对话框、标准输入对话框等。

6.1.2 QFileDialog对话框

1、选择打开一个文件,可调用静态函数QFileDialog::getOpenFileName().每组文件之间用两个分号隔开,同一组内不同后缀之间用空格隔开。

6.1.3 QColorDialog对话框

1、QColorDialog是选择颜色对话框,选择颜色使用静态函数QColorDialog::getColor()。

6.1.4 QFontDialog对话框

1、QFontDialog是选择字体对话框,选择字体使用静态函数QFontDialog::getFont()。它为文本选择字体,字体设置的内容包括字体名称、大小、粗体、斜体等。

6.1.5 QIputDialog标准输入对话框

1、QInputDialog有单行字符串输入、整数输入、浮点数输入、列表框选择输入和多行文本等多种输入方式。

6.1.6 QMessageBox消息对话框

1、消息对话框QMessageBox用于显示提示、警告、错误等信息,或进行确认选择,由几个静态函数实现这些功能

6.2 自定义对话框及其调用

6.2.1 对话框的不同调用方式

1、对话框的调用一般包括创建对话框,传递数据给对话框、显示对话框获取输入、判断对话框单击按钮的返回类型、获取对话框输入数据等过程。

2、模态方式调用,对话框不能互相交互,非模态调用,对话框可以相互交互。

6.2.2 对话框QWDialogSize的创建和使用

1、调用对话框的exec()函数,以模态显示的方式显示对话框。

6.2.3 对话框QWDialogHeaders的创建和使用

1、对话框创建的时候,传递主窗口的的指针作为对话框的父对象,可以确保主窗口释放时,才会自动删除此对话框对象。

6.2.4 对话框QWDialogLocate的创建与使用

1、若使用QDialog::show(),则能以非模态(Modeless)方式显示对话框。非模态显示的对话框在显示后继续运行主程序,还可以在主窗口上操作。

2、setAttribute()用于对窗体的一些属性进行设置,当设置为Qt::WA_DeleteOnClose时,窗口关闭时会自动删除,以释放内存。

3、对话框和主窗口之间互相操作的关键是要有对方对象的指针,然后才能传递参数并调用对方的函数。

6.2.4 利用信号与槽实现交互操作

1、对话框与主窗口之间的交互采用相互引用的方式,实现起来比较复杂。可以利用Qt的信号与槽机制,设计相应的限号和槽。

6.3 多窗体应用程序设计

6.3.1 主要的窗体类及其用途

 1、窗体类的主要特点和用途如下:

  • QWidget:在没有指定父容器时可作为独立的窗口,指定父容器后可以作为容器的内部组件
  • QDialog:用于设计对话框,可以独立窗口显示
  • QMainWindow:用于设计带有菜单栏、工具栏、状态栏的主窗口,一般以独立窗口显示
  • QSplashScreen:用作应用程序启动时的splash窗口,没有边框
  • QMdiSubWindow:用于为QMdiArea提供一个子窗口,用于MDI(多文档)应用程序的设计
  • QDesktopWidget:具有多个显卡和多个显示器的系统具有多个桌面,这个类提供桌面信息,如屏幕个数、每个屏幕的大小等
  • QWindow:通过底层的窗口系统标识一个窗口类,一般作为一个父容器的嵌入式窗体,不作为独立窗体

6.3.2 窗体类重要特性的设置

1、setAttribute()函数用于设置窗体的一些属性

 2、setWindowFlags()函数用于设置窗体标记

 

 3、如果创建窗口指定主窗口为父串口时,关闭主窗口时,所有文档窗口会自动删除。

 6.4 MDI应用程序设计

6.4.1 MDI简介

1、传统的应用程序设计中有多文档界面应用程序,Qt为设计MDI应用程序提供了支持。

2、设计MDI应用程序需要在主窗口工作区放置一个QMdiAre作为子窗体的容器。

6.4.2 文档窗口类QFormDoc的设计

6.4.3 主窗口设计与子窗口的使用

1、通过QMdiAre::subWindowList可以获得子窗口对象列表,从而判断子窗口的个数。

2、QMdiArea提供一些成员函数,可以实现“关闭全部”、“MDI模式”、“级联展开”、“平铺展开”

3、主窗口工具栏上的“剪切”、“复制”、“粘贴”、“字体设置”等按钮都是调用当前子串口的相应函数,关键是获取当前MDI子窗体对象。

6.5 Splash与登录窗口

6.5.1 实例功能概述

1、一般的大型应用程序在启动时会显示一个启动画面,及Splash串口,一个无边对话框。

6.5.2 对话框界面设计和类定义

6.5.3 QDlgLogin类功能实现

1、在QLineEdit::setEchoMode()函数设置编辑框回显方式,参数为QLineEdit::EchoMode枚举类型,这是设置为QLineEdit::Password回显方式,用于将密码显示为一个符号。

2、可以通过“键-值”对来保存用户信息。

6.5.4 Splash登录窗口的使用

第7章 文件系统和文件读写

1、将接收如何实现文本文件、二进制文件的读写,以及文件和目录的管理功能

7.1 文本文件读写

7.1.1 实例功能概述

1、文本文件 是指以纯文本格式存储的文件

2、Qt提供了俩种读写纯文本文件的方法,一种是用QFile类的IODevice读写功能直接进行读写,另一种是利用QFile和QTextStream结合起来,用流的方法进行读写文件

7.1.2 QFile读写文本文件

1、QFile类是直接与IO设备打交道,进行文件读写操作的类,使用QFile可以直接打开或保存文本文件。

2、打开文件通过传递QIODevice::OpenModeFlag枚举类型的参数,决定文件以什么方式打开。

7.1.3 QFile和QTextStream结合读写文本文件

1、QTextStream与IO读写设备结合,为数据读写提供了一些方便的方法类,QTextStream可以与QFile、QTemporaryFile、QBuffer、QTcpSocket和QUdpSocket等IO设备类结合使用。

2、如果文本文件里有汉字,需要设定为自动识别Unicode码,即调用setAutoDetectUnicode(true)函数。

7.1.4 解决中文乱码问题

1、使用QTextStream读写有中文内容的文本文件时,为了能正确的识别Unicode码,需要调用setAutoDetectUnicode(true),设置QTextStream可以自动设别Unicode码。

7.2 二进制文件读写

7.2.1 实例功能概述

1、除了文本文件之外,其他需要按照一定格式定义读写的文件都称为二进制文件。每种格式的二进制文件都有自己的格式定义,写入数据时按照一定的顺序写入,读出时也按照相应的顺序读出。

2、根据QdataStream保存文件时使用的数据编码的方式不同,可以保存为俩种文件:(1)用Qt预定义保存各种类型的文件,定义文件后缀为“.stm”(2)标准编码数据文件,定义文件后缀为“.dat”。

7.2.2 Qt预定义编码文件的读写

1、QDateSteam以流操作写入这些数据时,我们并不知道文件里每个字节是如何存储的,但是知道数据写入的顺序,以及每次写入数据的类型。在文件数据读出是,只需按照顺序和类型对给你个读出即可

2、Qt预定义编码保存的stm文件格式见:

 

  2、QDataStream的流操作方式读写文件有以下特点:

  • 读写操作都比较方便,支持读写各种数据类型,包括Qt的一些类,还可以为流数据读写扩张自定义的数据类型
  • 写文件和读文件时必须保证使用的流版本兼容,即流的版本号相同,或读取文件的流版本号高于写文件时的流版本号
  • 这种方式保存文件,与其他语言不兼容

7.2.3 标准编码文件的读写

1、采用Qt预定义编码读写stm文件,这种方法简单,但是文件格式不完全透明,不能创建用于交换的通用格式文件。

2、创建通用格式文件的方法以标准编码方式创建文件,使文件的每个字节都有具体定义。

3、保存为标准表满的二进制文件时,需要指定字节顺序,大端字节序和小端字节序。

4、dat文件的格式见表:

7.3 文件目录操作

7.3.1 文件目录操作相关的类

1、Qt为文件和目录提供了一些类,利用这些类可以方便地实现一些操作。

  • QCoreApplication:用于提取应用程序路径、程序名等文件信息
  • QFile:除了打开文件操作外,QFile还有复制文件、删除文件等功能
  • QFileInfo:用于提取文件的信息,包括路径、文件名、后缀等
  • QDir:用于提出目录或文件信息,获取一个目录下的文件或目录列表,创建或删除目录和文件、文件重命名操作等
  • QTemporaryDir和QTemporaryFile:用于创建临时目录和临时文件
  • QFileSystemWatcher:文件和目录监听类,监听目录下文件的添加、删除等变化,监听文件修改班花。

7.3.2 实例概述

1、用到了QObject::sender()函数,该函数用于在槽函数里获取发射信号的对象。

7.3.3 QCoreApplication类

 1、QCoreApplication是为无GUI应用提供时间循环的类,是所有应用程序类的基类,其子类QGuiApplication为有GUI界面的应用程序提供流控制和主要设定,QGuiApplication的子类QApplication为基于QWidget的应用程序提供支持,包括界面的初始化等。

 7.3.4 QFile类

1、QFile有一些静态函数和成员函数用于文件操作

 2、成员函数

7.3.5 QFileInfo类

1、QFileInfo类的接口函数提供文件的各种信息

 2、QFileInfo提供的函数可以提取文件的信息,包括目录名、文件基名(不带后缀)、文件后缀等

7.3.6 QDir类

1、QDir是进行目录操作的类,在创建QDir对象时传递一个目录字符串作为当前目录,然后QDir函数就可以针对当前母线或目录下的文件进行操作。

 

 2、QDir的一些公共接口函数

 3、获取目录下的目录或文件列表的函数entryList()需要传递QDir::Filter枚举类型的参数以获取不同的结果,QDir::Filter枚举类型的常用取值如下。

  • QDir::AllDirs 列出所有目录名
  • QDir::Files 列出所有文件
  • QDir::Drives 列出所有盘符(Unix系统无效)
  • QDir::NoDotAndDotDot 不列出特殊的符号
  • QDir::AllEntries 列出目录下所有项目

7.3.7 QTemporaryDir和QTemporaryFile

1、QTemporaryDir是用于创建、删除临时目录的类,其主要函数见表

 2、临时目录可以设置为使用后自动删除,即临时目录变量删除时,临时目录也删除。

7.3.8 QFileSystemWatcher类

 1、QFileSystemWatcher是对目录和文件进行监听的类。把某些目录或文件添加到QFileSystemWatcher对象的监听列表后,当目录下发生文件新建、删除等操作时会发射directorChanged()信号,当监听的文件发生修改、重命名等操作时,会发射fileChanged()信号。

第8章 绘图

1、GUI用户界面的优势是通过可视化的界面元素为用户提供遍历的操作,界面上的按钮、编辑框等分钟界面组件其实都是通过绘图而得到的。

2、Qt的二维绘图基本功能是使用QPainter在绘图设备上绘图,绘图设备包括QWidget、QPixmap等,通过绘制一些基本的点、线、圆等基本图状组成自己需要的图形,得到的图形是不可交互操作的图形

3、Qt提供了Graphics View架构,使用QGraphicsView、QGraphicsScene和各种QGraphicsItem类绘图,在一个场景中可以绘制大量图件,且每个图件是可选择的、可交互的。

8.1 QPainter基本绘图

8.1.1 QPainter绘图系统 

1、QPainter是用来进行绘图操作的类,QPaintDevice是一个可以使用QPainter进行绘图的抽象二维界面,QPaintEngine给QPainter提供在不同设备上绘图的接口。

2、一般的画图设备包括QWidget、QPixmap、QImage等,这些绘图设备为QPainter提供一个“画布”

3、QWidget类及其子类是最常用的绘图设备,从QWidget类继承的类都有paintEvent()事件,要在设备上绘图,只需要重定义此事件编写响应代码。

4、QPainter绘图的主要属性包括:

  • pen:是一个QPen对象,用于控制线条颜色、宽度、线型等。
  • brush属性:是一个QBrush对象,用于设置一个区域的填充特性,可以设置填充颜色、填充方式、渐变特性等。
  • font属性:是一个QFont对象,用于绘制文字是,设置文字的字体样式、大小等属性。

8.1.2 QPen的主要功能

1、QPen用于绘图时对线条进行设置,主要包括线宽、颜色、线型等,表8-1是QPen类的主要接口函数。

 2、QPen影响线条特性的3个主要属性是线条样式、端点样式和连接样式。

 8.1.3 QBrush的主要功能

1、QBrush定义了QPainter绘图时的填充特性,包括填充颜色、填充样式、材质填充时的材质图片等。

 2、典型取值的填充效果

8.1.4 渐变填充

1、使用渐变填充需要用渐变类的对象作为Painter的brush,有3个实现渐变填充的类

  • QLinearGradient:线性渐变
  • QRadialGradient:有简单辐射渐变和扩展辐射渐变俩种方式
  • QConicalGradient:圆锥形渐变,围绕一个中心点逆时针生成渐变颜色

2、渐变类都集成自QGradient类,除了生成渐变颜色的方式不同之外,在设定的渐变颜色坐标范围之外,还需要用QGradient类的setSpread函数设置延展方式。总共一起有3种取值:

  • PadSpread模式是用结束点的颜色填充外部区域
  • RepeatSpread模式是重复使用渐变方式填充外部区域
  • ReflectSpread是反射重复使用渐变方式填充外部区域

8.1.5 QPainter绘制基本图形元件

1、QPainter提供了很对绘制基本图形的功能,包括点、直线、椭圆、矩形、曲线等,由这些基本的图形可以构成复杂的图形。

2、QPainterPath的优点是绘制某些复杂形状时只需要创建一个PainterPath,然后调用QPainter::drawPath()就可以重复使用

8.2 坐标系统和坐标变换

8.2.1 坐标变换函数

1、QPainter提供了一些坐标变换的功能,通过平移、旋转等坐标转换,得到一个逻辑坐标系统,使用逻辑坐标系统在某些时候绘图会更方便。

8.2.2 坐标变换绘图实例

1、使用QPainterPath的优点就是定义一个QPainterPath类型的变量记录一个复杂图形的绘制过程后,可以重复使用。

8.2.3 视口和窗口

1、绘图设备的物理坐标是基本的坐标系,通过QPainter的平移、旋转等变换可以得到更容易操作的逻辑坐标。

2、QPainter还提供了视口和串口坐标系,通过QPainter内部的坐标变换矩阵自动转换为绘图设备的物理坐标

3、视口表示绘图设备的任意一个矩形区域的物理坐标,可以只选取物理坐标的一个矩形区域用于绘图。

4、窗口与视图是同一个矩形,只不过是用逻辑坐标定义的坐标系。窗口可以直接定义矩形区的逻辑坐标系

5、使用窗口坐标的优点是,只需按照窗口坐标定义来糊涂,而不用管实际的物理坐标范围的大小。可以将绘图功能与绘图设备隔离开来。

8.2.4 绘图叠加的效果

8.3 Graphics View绘图架构

8.3.1 场景、视图与图形项

1、采用QPainter绘图时需要在绘图设备的paintEvent()事件里编写绘图程序,实现整个绘图过程,不能实现图件的选择、编辑、拖放、修改等功能

2、Qt为绘制负责可交互图形提供了Graphics View绘图架构,是一种基于图形项的模型/视图模式。使用Graphics View架构可以绘制复杂的有几万个基本图形元件的图形,并且每个图形元件是可选择、可拖放和修改的,类似于矢量绘图软件。

3、Graphics View架构主要由3个部分组成,即场景、视图和图形项,其构成Graphics View绘图系统结构

 4、场景是不可见的,是一个抽象的管理图形项的容器,可以向场景添加图形项,获取场景中的某个图形项等。可以通过重新实现drawBackground()和drawForeground()函数来实现自定义的背景和前景。

5、QGraphicsView提供绘图的视图组件,用于显示场景中的内容,可以为一个场景设置几个视图,用于对同一个数据集提供不同的视口。

 6、图形项就是一些基本的图形元件,图形项的基类是QGraphicsItem。图形项可以被选择、拖放、组合、若编写信号槽函数代码,还可以实现各种编辑功能。图形项还可以包含子图形项,图像还支持碰撞检测,即是否与其他图形项碰撞。

----------------以下非仔细阅读------------------------------

8.3.2 Graphics View的坐标系统

 1、Graphics View系统有3个有效坐标系,图形项坐标系、场景坐标、视图坐标等。

8.3.3 Graphics View相关类

8.3.4 Graphics View程序金额没结构和功能实现

8.3.5 Graphics View绘图程序实例

第9章 Qt Charts

Qt Charts是Qt提供图表模块,可以很方便地绘制常见的折线图、柱状图、饼图等图表。

9.1 Qt Charts概述

9.1.1 Qt Charts模块

Qt Chart模块是一组易于使用的图表组件,它基于Qt的Graphics View架构,其核心组件是QChartView和QChart。

9.1.2 一个简单的QChart绘图程序

本地已实现

9.1.3 图表的主要组成部分

QChart一般包括序列、坐标轴、图例、图表标题等部分

9.2 QChart绘制折线图

9.2.1 实例功能

9.2.2 主窗口类定义和初始化

9.2.3 画笔设置对话框QWDialogPen

1、pen属性就是一个QPen对象,设置内容主要包括线型、线宽和颜色。

9.2.4 QChart的设置

1、QChart是组合图表各部件、显示各种数据序列的绘图组件。

9.2.5 QLineSeries序列的设置

9.2.6 QValueAxis坐标轴的设置

9.3 各种常见图标的绘制

9.3.1 实例功能概述

1、Qt Charts还提供柱状图、饼图、百分比柱状图等常见图表

9.3.2 数据准备

9.3.3 柱状图

9.3.4 饼图

9.3.5 堆叠柱状图

9.3.6 百分比柱状图

9.3.7 散点图和光滑曲线图

9.4 图标的其他操作

9.4.1 实例功能概述

9.4.2 自定义QWChartView类

9.4.3 主窗口类的设计

9.4.4 实时显示光标处的数值

9.4.5 QLegendMarker的使用

9.4.6 图表的缩放

第10 章 Data Visualization

 1、用于数据的三维显示,包括柱状 图、三维空间散点、三维曲面等。

10.1 Data Visualization模块概述

10.2 三维柱状图

10.2.1 实例功能

10.2.2 主窗口设计

10.2.3 三维柱状图的创建

10.2.4 三维柱状图属性设置

10.3 三维散点图

10.3.1 绘制三维散点图

10.3.2 三维坐标轴的方向

10.3.3 散点形状与大小

10.4 三维曲面绘图

10.4.1 三维曲面图

10.4.2 三维地图图形

----------------以上非仔细阅读------------------------------

第11章 数据库

1、Qt SQL模块包含多个类,可以事项数据库连接、SQL语句执行、数据获取与界面显示功能,数据与界面之间使用Model/View架构,从而可以方便的实现数据的界面显示和操作。

11.1 Qt SQL模块概述

1、需要在配置文件中增加Qt +=sql

11.1.1 Qt SQL支持的数据库

1、Qt SQL提供一些常见数据库的驱动,包括网络型数据库,如Oracle、MS SQL Server等,也包括简单的单机型数据库,如SQLite.

11.1.2 SQLite数据库

1、使用QSqlRelationalTableModel可以很方便地实现这种代码型数据表的显示与编辑。

11.1.3 Qt SQL模块的主要类

1、Qt SQL提供的主要类的简要功能描述-表11-6

 2、用于数据库操作的数据模型类有QSqlQueryModel、QSqlTableModel和QSqlRelationalTableModel

  • QSqlQueryModel通过设置SELECT语句查询获取数据库的内容,但是QSqlQueryModel的数据是只读的,不能进行编辑的。
  • QSqlTableModel直接设置一个数据表的名称,可以获取数据表的全部记录,其结果是可编辑的,设置为界面上的QTableView组件的数据模型后就可以显示编辑数据
  • QSqlRelationalTableModel编辑一个数据表,并且可以将代码字段通过关系与代码表关联,将代码字段的编辑转换为直观的内容选择编辑。

11.2.2 主窗口设计

11.2.3 打开数据表

11.2.4 添加、插入与删除记录

11.2.5保存与取消修改

11.2.6 设置和清除照片

11.2.7 数据记录的遍历

11.2.8 记录排序

11.3 QSqlQueryModel的使用

11.3.1 QSqlQueryModel功能概述

1、只能作为只读数据源使用,不可以编辑数据

11.3.2 使用QSqlQueryModel实现数据查询

11.4 QSqlQuery的使用

11.4.1 QSqlQuery的使用

1、是能执行任意SQL语句的类。

11.4.2 QSqlQueryModel和QSqlQuery的使用

11.5 QSqlRelationalTableModel的使用

11.5.1 关系型数据表和实例功能

11.5.2 关系型数据模型功能实现

第12 章 自定义插件和库

 1、当UI设计器里提供的界面组件不满足实际设计需求是,可以从QWidget集成自定义界面组件,有俩种方法使用自定义界面组件,一种是提升法,另一种是为UI设计器设计自定义界面组件的Widget插件

12.1 自定义Widget组件

12.1.1 自定义Widget子类QmyBattery

12.1.2 自定义Widget组件的使用

12.2 自定义Qt Designer插件

12.2.1 创建Qt Designer Widget插件项目

12.2.2 插件项目各文件的功能实现

12.2.3 插件的编译与安装

12.2.4 使用自定义插件

12.2.5 使用MSVC编译器输出中文的问题

12.3 创建和使用静态链接库

12.3.1 创建静态链接库

12.3.2 静态链接库的使用

12.4 创建和使用共享库

12.4.1 创建共享库

12.4.2 使用共享库

第13 章 多线程

13.1 QThread创建多线程程序

13.1.1 QThread类功能简介

13.1.2 掷骰子的线程QDiceThread

13.1.3 掷骰子的多线程应用程序

13.2 线程同步

13.2.1 线程同步的概念

13.2.2 基于互斥量的线程同步

13.2.3 基于QReadWriteLock的线程同步

13.2.4 基于QWaitCondition的线程同步

1、QWaitCondition与QMutex结合,可以使一个线程在满足一定条件时通知其他多个线程,使他们及时做出响应

13.2.5 基于信号量的线程同步

第14章 网络编程

14.1 主机信息查询

14.1.1 QHostInfo和QNetworkInterface类

14.1.2 QHostInfo的使用

14.1.3 QNetWorkInterface的使用

14.2 TCP通讯

14.2.1 TCP通信概述

14.2.2 TCP服务器端程序设计

14.2.3 TCP客户端程序设计

14.3 QUdpSocket实现UDP通信

14.3.1 UDP通信概述

1、UDP是轻量的、不可靠的、面向数据、无连接的协议

14.3.2 UDP单播和广播

14.3.3 UDP组播

14.4 基于HTTP协议的网络应用程序

14.4.1 实现高层网络操作的类

疑问:

1、断点设置不生效
2、应用程序设置图标不生效

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/109974
推荐阅读
相关标签
  

闽ICP备14008679号