Qt 5.9 C++开发指南(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-22 18:37:35

点击下载

作者:王维波 栗宝鹃 侯春望

出版社:人民邮电出版社有限公司

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Qt 5.9 C++开发指南

Qt 5.9 C++开发指南试读:

前言

从1994年至今,Qt已经走过了20多年的发展历程,日趋成熟并广受欢迎。Qt是非常优秀的跨平台应用开发框架,在专业应用领域,很多应用软件都是采用Qt C++开发的,比如在地球物理研究领域,开发的专业软件一般需要在Linux、Windows或macOS等多种平台上运行,使用Qt就是非常好的选择。

本书主要介绍如何使用Qt进行C++应用程序开发。C++是使用最广泛的编程语言之一,在各个专业领域有很多大型的类库都是用C++编写的,在不同的专业研究领域可以找到很多开源的用C++编写的类库或算法程序,这对于专业软件开发是非常有利的。所以,扎实地掌握Qt C++编程如同掌握了一件利器,无论是通过编程实现自己的专业研究成果,还是从事专业的软件开发都是有长远意义的。

本书以Qt 5.9 LTS(Long Term Supported)版本为例介绍Qt C++开发,所有实例程序在Windows 7平台上测试,需要使用MSVC编译器的时候使用Visual Studio 2015。由于Qt的跨平台特性,这些实例程序在Linux和macOS系统上基本上无需修改就可以编译,所以,本书介绍的内容也适用于Linux和macOS平台上的应用程序开发。

本书不对C++语言的基本特性作介绍,需要读者已经掌握了C++语言编程的基本原理,对类的概念和使用比较熟悉。如果对C++语言还不够熟悉,可以找一本专门介绍C++语言的书学习,有很多很好的专门介绍C++语言的书。

Qt实际上是一套应用程序开发类库,Qt类库由许多模块组成,如核心的GUI组件模块Qt Widget,用于数据库访问的Qt SQL模块,用于二维图表显示的Qt Charts模块,用于数据三维显示的Qt Data Visualization模块,用于网络编程的Qt Network模块等。Qt的模块很多,在一本书里很难全面介绍到,本书只介绍应用程序设计常用的功能模块的使用。

本书为每个编程主题都精心设计了完整的实例程序(实例程序源代码可登录异步社区https://www.epubit.com,在本书页面免费下载),通过实例程序介绍类的主要接口函数的功能和使用,而不是简单地通过一些代码片段来孤立地解释类的使用。通过阅读本书,练习书中的实例,读者可以学习Qt C++类库常用模块的使用方法,学会用Qt C++设计一般应用程序的方法。第1章 认识Qt1.1 Qt简介

C++是一种通用的标准编程语言,使用任何编辑器都可以编写C++源程序,然后利用C++编译器对程序进行编译,就可以生成可执行的程序。

为了方便进行C++程序的编写和编译,有各种综合开发环境(Integrated Developing Environment,IDE),如Visual Studio就是Windows平台上常见的编写C++程序的IDE。一个IDE不仅提供程序的编辑和编译,一般还提供一套基本类库,用于提供支持平台应用程序开发的各种基本类,如Visual Studio使用MFC进行Windows平台的应用程序开发。

Qt是一套应用程序开发类库,但与MFC不同,Qt是跨平台的开发类库。Qt支持PC和服务器的平台,包括Windows、Linux、macOS等,还支持移动和嵌入式操作系统,如iOS、Embedded Linux、Android、WinRT等。跨平台意味着只需编写一次程序,在不同平台上无需改动或只需少许改动后再编译,就可以形成在不同平台上运行的版本。这种跨平台功能为开发者提供了极大的便利。

Qt最早是由挪威的Haavard Nord和Eirik Chambe-Eng在1991年开始开发的,在1994年发布,并成立了一家名为Trolltech的公司。Trolltech公司在2008年被诺基亚公司收购。2012年,Qt被Digia公司收购,并在2014年成立了独立的Qt公司,专门进行Qt的开发、维护和商业推广。

经过20多年的发展,Qt已经成为最优秀的跨平台开发框架之一,在各行各业的项目开发中得到广泛应用。许多大型软件都是用Qt开发的,如Autodesk Maya、Google Earth、Skype、WPS Office等。

C++语言使用广泛,长盛不衰,易在不同平台上移植,其编译生成的程序执行效率高,所以在专业研究领域很多开源的算法程序或类库都是用C++编写的。使用Qt C++编写应用程序,可以使自己的应用程序具有跨平台移植的功能,也可以利用各种开源的类库资源。所以,扎实地掌握Qt C++编程就如同掌握了一件利器,无论是通过编程实现自己的专业研究成果,还是从事专业软件开发都具有长远意义。1.2 Qt的获取与安装1.2.1 Qt的许可类型

Qt的许可类型分为商业许可和开源许可,开源许可又分为LGPLV3和GPLV2/GPLV3。商业许可允许开发者不公开项目的源代码,其Qt版本包含更多的模块(某些模块只有商业许可的版本里才有),并能获得Qt公司的技术支持。当然,购买Qt商业许可需要支付费用。

使用开源许可的Qt无需支付费用,但是要遵循开源许可协议LGPLV3或GPLV2/GPLV3的规定。关于商业许可、开源许可的具体差别,开源许可的要求可以查看Qt官网的相关介绍。

对于Qt的学习来说,初学Qt使用开源版本的软件即可。若需要开发大型软件,并且不希望按照开源许可协议的要求公开源代码,以便对编写软件进行版权保护,则可以购买Qt的商业许可。

不同许可协议下,Qt的使用权利和要求、包含的模块、工具的对比可查看Qt官网网址。1.2.2 Qt的版本

Qt的版本更新比较快,且版本更新时会新增一些类或停止维护一些以前版本的类,例如Qt 5与Qt 4就有较大的区别,如果不是为了维护用旧版本编写的程序,一定要选用最新版本的Qt进行程序开发。

Qt公司在2017年5月底发布了Qt 5.9.0。Qt 5.9是一个长期支持(long term supported,LTS)版本,在未来至少3年内提供更新支持,而上一个LTS版本是Qt 5.6 LTS。

Qt 5.9具有更强的性能,更好的稳定性,从Qt 5.6到Qt 5.9增加了许多新的特性,一些重要的更新如下。● Qt 5.7增加了Qt 3D、Qt Quick Controls 两个模块。● 从Qt 5.7开始,Qt Charts、Qt Data Visualization、Qt Virtual

Keyboard、Qt Purchasing、Qt Quick 2D Renderer等原来只在商

业许可版本中存在的模块在开源许可版本中也可以使用了。● Qt 5.8增加了Qt Wayland Compositor、Qt SCXML和Qt Serial Bus

3个模块。● Qt 5.9增加了Qt Gamepad模块,用于不同平台上对游戏手柄的支

持。● Qt 5.9包含一些技术预览模块,包括Qt Remote Objects、Qt

Network Authentication和Qt Speech。● Qt 5.9的QtCore模块增加了qfloat16数据类型定义。

可访问Qt官网页面了解Qt 5.0至Qt 5.9版本更新的历程和每个版本的新增特性描述。

由于Qt 5.9 LTS是一个长期技术支持版本,在未来几年里都将有更新支持,因此,本书以Qt 5.9 LTS版本为例进行讲解,并且所有实例程序均使用Qt 5.9编译测试通过。1.2.3 Qt的下载与安装

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

桌面和移动设备应用开发就是开发在PC、服务器、手机、平板电脑等设备上运行的程序,操作系统平台可以是Windows、Linux、macOS、Android等。用于桌面和移动设备应用开发的Qt具有开源许可协议,可以免费下载和使用。

嵌入式设备开发是针对具体的嵌入式设备来开发应用程序,如物联网设备、汽车电子设备、医疗设备等特定的嵌入式设备。用于嵌入式设备开发的Qt可下载30天试用版本。

本书是介绍桌面应用程序开发的,所以下载使用的是桌面和移动设备开发的Qt 5.9.1开源版本。根据Qt官网的提示,注册用户后才可以下载Qt安装程序。

Qt 5.9.1的安装包分为在线安装包和离线安装包,为便于重复安装,最好下载离线安装包。离线安装包根据使用的操作系统平台不同,分为Linux、macOS和Windows 3个版本,本书实例都是用Windows 7平台上的Qt开发的,所以这里下载Windows版本的Qt 5.9.1离线安装包。

Qt 5.9以前版本的离线安装包即使是在Windows平台上,也会根据使用的编译器不同分为很多版本,如MinGW 32-bit版本、MSVC2015 32-bit版本、MSVC2015 64-bit版本等。而Qt 5.9在一个平台上只有一个安装包,编译器的选择放在了安装过程里,所以下载的Windows平台上的Qt 5.9.1安装包只有一个可执行文件。

双击下载后的Qt 5.9.1离线安装包可执行文件,就开始执行安装过程,安装过程与一般的Windows应用程序一样,按照向导进行操作即可。

在安装过程中会出现如图1-1所示的安装选项设置页面,在这个页面里选择需要安装的模块。“Qt 5.9.1”节点下面是Qt的功能模块,包括用于不同编译器和平台的模块,这些模块包括内容如下。图1-1 Qt 5.9.1安装选项设置页面● MinGW 5.3.0 32 bit编译器模块。MinGW是Minimalist GNU for

Windows的缩写,MinGW是Windows平台上使用的GNU工具集导

入库的集合。● 用于UWP编译的模块。UWP是Windows 10中Universal Windows

Platform的简称,有不同编译器类型的UWP。● 用于windows平台上的MSVC编译器模块,如msvc2015 32-bit和

msvc2015 64-bit等。要安装MSVC编译器的模块,需要计算机上

已经安装相应版本的Visual Studio。● 用于Android平台的模块,如Android x86和Android ARMv7。● Sources是Qt的源程序。● Qt Charts是二维图表模块,用于绘制柱状图、饼图、曲线图等

常用二维图表。● Qt Data Visualization 是三维数据图表模块,用于数据的三维显

示,如散点的三维空间分布、三维曲面等。● Qt Purchasing、Qt WebEngine、Qt Network Auth(TP)等其他模块,

括号里的TP表示技术预览(Technology Preview)。● Qt Scritp(Deprecated)是脚本模块,括号里的“Deprecated”

表示这是个已经过时的模块。“Tools”节点下面是一些工具软件,包括内容如下。● Qt Creator 4.3.1是用于Qt程序开发的IDE。● MinGW 5.3.0是MinGW 编译工具链。● Strawberry Perl是一个Perl语言工具。

根据个人的需要设置安装选项,无需选择所有的安装选项。例如,如果不需要进行UWP平台的开发,UWP模块就可以都不选;如果不是为和以前开发的源程序兼容,过时的模块不要选择,如Qt Script就是已过时的模块。注意 如果选择安装MSVC编译器的模块,需要在计算机上安装相应的Microsoft Visual Studio开发工具,使用免费的Community版本的Visual Studio即可。

安装完成后,在Windows“开始”菜单里建立的Qt 5.9.1程序组内容如图1-2所示。程序组中一个主要的程序是Qt Creator 4.3.1(Community),它是用于开发Qt程序的IDE,是Qt的主要工具软件。

根据选择安装的编译器模块会建立几个子分组,见图1-2中的MinGW 5.3.0 (32-bit)、MSVC 2015(32-bit)和MSVC 2015(64-bit),每个分组下面主要有3个工具软件。图1-2 安装后“开始”菜单里的Qt 5.9.1程序组● Assistant是一个独立的查看Qt帮助文件的程序,集成在了Qt

Creator中。● Designer是一个独立的进行窗口、对话框等界面可视化设计的程

序。Designer也集成在了Qt Creator中,在Qt Creator中编辑或创

建界面文件时,就可以自动打开并进行界面设计。● Linguist是一个编辑语言资源文件的程序,在开发多语言界面的

应用程序时会用到。

这3个工具软件可独立使用,前两个集成到了Qt Creator里,可在Qt Creator打开。所以Qt的主要工具是Qt Creator,要编写Qt程序,运行Qt Creator即可。1.3 Qt Creator初步使用1.3.1 Qt Creator的界面组成

启动Qt Creator,出现如图1-3所示的主窗口。图1-3 Qt Creator主窗口

Qt Creator的界面很简洁。上方是主菜单栏,左侧是主工具栏,窗口的中间部分是工作区。根据设计内容不同,工作区会显示不同的内容。

图1-3是在左侧主工具栏单击“Welcome”按钮后显示实例的界面。这时工作区的左侧有“Projects”“Examples”“Tutorials”“Get Started Now”几个按钮,单击后会在主工作区显示相应的内容。● 单击“Projects”按钮后,工作区显示新建项目按钮和最近打开

项目的列表。● 单击“Examples”按钮后,工作区显示Qt自带的大量实例,选

择某个实例就可以在Qt Creator中打开该项目源程序。● 单击“Tutorials”按钮后,工作区显示各种视频教程,查看视频

教程需要联网并使用浏览器打开。● 单击“Get Started Now”按钮,工作区显示“Qt Creator

Manual”帮助主题内容。

主窗口左侧是主工具栏,主工具栏提供了项目文件编辑、窗体设计、程序调试、项目设置等各种功能按钮。1.3.2 Qt Creator的设置

对Qt Creator可以进行一些设置,如刚安装好的Qt Creator界面语言可能是中文,但是很多词汇翻译得并不恰当,可以将Qt Creator的界面语言设置为英文。

单击Qt Creator菜单栏的“Tools”→“Options”菜单项会打开选项设置对话框(如图1-4所示)。对话框的左侧是可设置的内容分组,单击后右侧出现具体的设置界面。常用的设置包括以下几点。图1-4 Options的Build & Run设置页面

1.Environment设置:在Interface页面可以设置语言和主题,本书全部以英文界面的Qt Creator进行讲解,所以语言选择为English;为了使界面抓图更清晰,设置主题为Flat Light。更改语言和主题后需要重新启动Qt Creator才会生效。

2.Text Editor设置:在此界面可以设置文本编辑器的字体,设置各种类型文字的字体颜色,如关键字、数字、字符串、注释等字体颜色,也可以选择不同的配色主题。编辑器缺省字体的大小为9,可以修改得大一些。

3.Build & Run设置:图1-4显示的是Build & Run的设置界面,它有以下几个页面。(1)Kits页面显示Qt Creator可用的编译工具,在图中可以看到有3个编译工具可用。(2)Qt Versions页面显示安装的Qt版本,有Qt 5.9.1 MinGW 32bit、Qt 5.9.1 MSVC2015 32bit和Qt 5.9.1 MSVC2015 64bit 3个可用的版本。(3)Compliers页面显示系统里可用的C和C++编译器,由于安装了MinGW和Visual Studio 2015,Qt Creator会自动检测出这些编译器。(4)Debuggers页面显示Qt Creator自动检测到的调试器,有GNU gdb for MinGW调试器和Windows的CDB调试器。注意 如果只是在计算机上安装了Visual Studio 2015,图1-4显示的界面上MSVC2015的两个编译器的图标会变为带有感叹号的一个黄色图标。Debuggers页面没有Windows的CDB调试器,可以用MSVC编译器对Qt Creator编写的程序进行编译,但是不能调试,这是因为缺少了Windows Software Development Kit (SDK)。这个SDK不会随Visual Studio一同安装,需要从Microsoft网站上下载。可以下载Windows Software Development Kit (SDK) for Windows 8.1,安装后重启计算机即可。1.4 编写一个Hello World程序

学习一种编程语言或编程环境,通常会先编写一个“Hello World”程序。我们也用Qt Creator编写一个“Hello World”程序,以初步了解Qt Creator设计应用程序的基本过程,对使用Qt Creator编写Qt C++应用程序建立初步的了解。1.4.1 新建一个项目

单击Qt Creator的菜单项“File”→“New File or Project”,出现如图1-5所示的对话框。在这个对话框里选择需要创建的项目或文件的模板。图1-5 新建文件或项目对话框

Qt Creator可以创建多种项目,在最左侧的列表框中单击“Application”,中间的列表框中列出了可以创建的应用程序的模板,各类应用程序如下。● Qt Widgets Application,支持桌面平台的有图形用户界面(Graphic User Interface,GUI)界面的应用程序。GUI的设计完

全基于C++语言,采用Qt提供的一套C++类库。● Qt Console Application,控制台应用程序,无GUI界面,一般用

于学习C/C++语言,只需要简单的输入输出操作时可创建此类项

目。● Qt Quick Application,创建可部署的Qt Quick 2应用程序。Qt

Quick是Qt支持的一套GUI开发架构,其界面设计采用QML语

言,程序架构采用C++语言。利用Qt Quick可以设计非常炫的用

户界面,一般用于移动设备或嵌入式设备上无边框的应用程序的

设计。● Qt Quick Controls 2 Application,创建基于Qt Quick Controls 2组

件的可部署的Qt Quick 2应用程序。Qt Quick Controls 2组件只有

Qt 5.7及以后版本才有。● Qt Canvas 3D Application,创建Qt Canvas 3D QML项目,也是

基于QML语言的界面设计,支持3D画布。

在图1-5显示的对话框中选择项目类型为Qt Widgets Application后,单击“Choose…”按钮,出现如图1-6所示的新建项目向导。图1-6 新建项目向导第1步:项目名称和存储路径设置

在图1-6中,选择一个目录,如“G:\Qt5Book\Qt5.9Samp\chap01”,再设置项目名称为samp1_1,这样新建项目后,会在“G:\Qt5Book\Qt5.9Samp\chap01”目录下新建一个目录,项目所有文件保存在目录“G:\Qt5Book\Qt5.9Samp\chap01\samp1_1\”下。

在图1-6中设置好项目名称和保存路径后,单击“Next”按钮,出现如图1-7所示的选择编译工具的界面,可以将3个编译工具都选中,在编译项目时再选择一个作为当前使用的编译工具,这样可以编译生成不同版本的可执行程序。

在图1-7显示的界面中单击“Next”按钮,出现如图1-8所示的界面。在此界面中选择需要创建界面的基类(base class)。有3种基类可以选择:图1-7 新建项目向导第2步:选择编译工具图1-8 新建项目向导第3步:选择界面基类● QMainWindow是主窗口类,主窗口具有主菜单栏、工具栏和状

态栏,类似于一般的应用程序的主窗口;● QWidget是所有具有可视界面类的基类,选择QWidget创建的界

面对各种界面组件都可以支持;● QDialog是对话框类,可建立一个基于对话框的界面。

在此选择QMainWindow作为基类,自动更改的各个文件名不用手动去修改。勾选“Generate form”复选框。这个选项如果勾选,就会由Qt Creator创建用户界面(User Interface,UI)文件,否则,需要自己编程手工创建界面。初始学习,为了了解Qt Creator的设计功能,勾选此选项。然后单击“Next”按钮,出现一个页面,总结了需要创建的文件和文件保存目录,单击“Finish”按钮就可以完成项目的创建。1.4.2 项目的文件组成和管理

完成了以上新建项目的步骤后,在Qt Creator的左侧工具栏中单击“Edit”按钮,可显示如图1-9所示的窗口。窗口左侧有上下两个子窗口,上方的目录树显示了项目内文件的组织结构,显示当前项目为samp1_1。项目的名称构成目录树的一个根节点,Qt Creator可以打开多个项目,但是只有一个活动项目(Active Project),活动项目的项目名称节点用粗体字体表示。图1-9 项目管理与文件编辑界面

在项目名称节点下面,分组管理着项目内的各种源文件,几个文件及分组分别为以下几项。● samp1_1.pro是项目管理文件,包括一些对项目的设置项。● Headers分组,该节点下是项目内的所有头文件(.h),图1-9中

所示项目有一个头文件mainwindow.h,是主窗口类的头文件。● Sources分组:该节点下是项目内的所有C++源文件(.cpp),图

1-9中所示项目有两个C++源文件,mainwindow.cpp是主窗口类

的实现文件,与mainwindow.h文件对应。main.cpp是主函数文件,

也是应用程序的入口。● Forms分组:该节点下是项目内的所有界面文件(.ui)。图1-9中

所示项目有一个界面文件mainwindow.ui,是主窗口的界面文

件。界面文件是文本文件,使用XML语言描述界面的组成。

左侧上下两个子窗口的显示内容可以通过其上方的一个下拉列表框进行选择,可以选择的显示内容包括Projects、Open Documents、Bookmarks、File System、Class View、Outline等。在图1-9中,上方的子窗口显示了项目的文件目录树,下方显示打开的文件列表。可以在下方选择显示Class View,这样下方则显示项目内所有的类的结构,便于程序浏览和快速切换到需要的代码位置。

双击文件目录树中的文件mainwindow.ui,出现如图1-10所示的窗体设计界面,这个界面实际上是Qt Creator中集成的Qt Designer。窗口左侧是分组的组件面板,中间是设计的窗体。在组件面板的Display Widgets分组里,将一个Label组件拖放到设计的窗体上面。双击刚刚放置的Label组件,可以编辑其文字内容,将文字内容更改为“Hello, World!”。还可以在窗口右下方的属性编辑器(Property Editor)里编辑标签的Font属性,Point Size更改为12,勾选Bold。图1-10 集成在Qt Creator中UI设计器1.4.3 项目的编译、调试与运行

单击主窗口左侧工具栏上的“Projects”按钮,出现如图1-11所示的项目编译设置界面。

界面左侧一栏的“Build & Run”下面显示了本项目中可用的编译器工具,要使用哪一个编译器用于项目编译,单击其名称即可,选择的编译器名称会用粗体字表示。这里选择使用MinGW 32bit编译器。图1-11 项目编译器选择和设置界面

每个编译器又有Build和Run两个设置界面。在Build设置界面上,有一个“Shadow build”复选框。如果勾选此项,编译后将在项目的同级目录下建立一个编译后的文件目录,目录名称包含编译器信息,这种方式一般用于使用不同编译器创建不同版本的可执行文件。如果不勾选此项,编译后将在项目的目录下建立“Debug”和“Release”子目录用于存放编译后的文件。

在设计完mainwindow.ui文件,并设置好编译工具之后,就可以对项目进行编译、调试或运行。主窗口左侧工具栏下方有4个按钮,其功能见表1-1。表1-1 编译调试工具栏按钮的作用图作用快标捷键弹出菜单选择编译工具和编译模式,如Debug或Release模式直接运行程序,如果修改后未编译,会先进行编译。即使在程序中设置Ctrl了断点,此方式运行的程序也无法调试。+R项目需要以Debug模式编译,点此按钮开始调试运行,可以在程序中设F5置断点。若是以Release模式编译,点此按钮也无法进行调试。编译当前项目Ctrl+B

首先对项目进行编译,没有错误后,再运行程序。程序运行的界面如图1-12所示。这就是一个标准的桌面应用程序,我们采用可视化的方式设计了一个窗口,并在上面显示了字符串“Hello,World!”。

在Qt Creator中也可以对程序设置断点进行调试,但是必须以Debug模式编译,并以“Start Debugging”(快捷键F5)方式运行程序。程序调试的方法与一般IDE工具类似,不再详述。注意,要在Qt Creator里调试MSVC2015编译的程序,必须安装Windows软件开发工具包SDK。

在图1-11的界面中选择其他编译器,并且勾选“Shadow build”,用Debug和Release模式分别编译,将会在项目的同级目录下生成对应的目录,保存编译后的文件。图1-13显示的是实例samp1_1采用3种编译器,分别用Debug和Release模式编译后生成的目录结构。3种编译器,2种编译模式,生成了6个文件夹。图1-12 实例程序samp1_1运行时界面图1-13 勾选“Shadow build”选项后使用不同编译器和编译模式生成的输出目录提示 除非特别说明,本书后面的实例程序均在Windows 7.0 SP1 64位平台上用Qt Creator 4.3.1开发,采用Qt 5.9.1的MinGW 32bit编译器进行编译。只有在第12章设计Qt Designer的Widget插件时才必须使用MSVC2015 32bit编译器,在第15.5节使用摄像头录像时必须使用Linux平台的Qt。1.5 在Visual Studio里使用Qt

在Qt Creator中可以使用MSVC编译工具对Qt项目进行编译。若有人比较习惯于使用Visual Studio,或某些项目必须使用Visual Studio,也可以在Visual Studio里创建和管理Qt程序项目。要在Visual Studio中使用Qt,需要安装一个Visual Studio的Qt插件,这个插件程序由Qt公司提供。

目前最新的Visual Studio Qt插件是“Visual Studio Add-in 2.0.0 for Qt5 MSVC 2015”,可以从Qt官网下载并安装。安装此插件之前,需已经安装好Visual Studio 2015。

这里省略Visual Studio Add-in 2.0.0 for Qt5的安装过程。安装完成后,在Visual Studio的主菜单栏上增加了一个菜单组“Qt VS Tools”,在新建项目向导里增加了可创建Qt项目的项目模板。

在Visual Studio 2015里创建一个Qt GUI应用程序项目。创建项目时选择项目模板的对话框如图1-14所示,选择创建Qt GUI Application项目,根据向导提示完成项目samp1_2的创建。

按照向导缺省设置创建完项目后,Visual Studio管理项目的全部文件,有一个samp1_2.ui的窗体文件,双击此文件,会自动使用Qt Designer打开窗体文件进行界面设计,如同在Qt Creator里设计窗体一样。

在首次使用Visual Studio编译Qt项目之前,必须先进行一些设置,否则会提示没有设置Qt版本,无法编译项目。图1-14 在Visual Studio 2015里创建Qt项目samp1_2

首先要设置Qt版本。单击Visual Studio菜单项“Qt VS Tools”→“Qt Options”,出现如图1-15所示的对话框。Qt Versions页面显示了可以使用的Qt版本(这是已经设置好的界面),在未设置之前,框里是空白的。单击“Add”按钮出现如图1-16所示的添加Qt版本对话框。图1-15 Qt Options设置对话框图1-16 添加Qt版本对话框

单击“Path”文本框后面的按钮,在出现的目录选择对话框里选择Qt 5.9.1安装目录下的MSVC编译器目录,如“D:\Qt\Qt5.9.1\5.9.1\msvc2015_64”。选择目录后,Version name编辑框里会自动出现版本名称,可以修改此名称为意义更明显的名字,如“msvc2015-64bit”。

然后,再单击Visual Studio菜单项“Qt VS Tools”→“Qt Project Settings”,为项目设置Qt版本,出现如图1-17所示的对话框。在此对话框的Properties分页下的列表框里,在Version下拉列表框中选择某个Qt版本。图1-17 Qt项目设置对话框

完成这两项设置后,再进行编译就没有问题了。项目的运行、调试等就都是Visual Studio的操作了,这里不再赘述。提示 在Qt Creator里就可以使用MSVC编译器对项目进行编译,并不是只有在Visual Studio里才可以使用MSVC编译器编译Qt的项目。第2章 GUI应用程序设计基础

上一章通过一个“Hello World”实例,演示了在Qt Creator里创建应用程序、设计窗体界面、编译和运行程序的基本过程。本章将继续深入地介绍Qt Creator设计GUI应用程序的基本方法,包括Qt创建的应用程序项目的基本组织结构,可视化设计的UI界面文件的原理和运行机制,信号与槽的使用方法,窗体可视化设计的底层原理,应用程序的窗体、组件布局、菜单、工具栏、Actions等常见设计元素的使用方法。2.1 UI文件设计与运行机制2.1.1 项目文件组成

在Qt Creator中新建一个Widget Application项目samp2_1,在选择窗口基类的页面(图1-8)选择QWidget作为窗体基类,并选中“Generate form”复选框。创建后的项目文件目录树如图2-1所示。图2-1 项目文件的目录树

这个项目包含以下一些文件。● 项目组织文件samp2_1.pro,存储项目设置的文件。● 主程序入口文件main.cpp,实现main()函数的程序文件。● 窗体界面文件widget.ui,一个XML格式存储的窗体上的元件及其

布局的文件。● widget.h是所设计的窗体类的头文件,widget.cpp是widget.h里定

义类的实现文件。在C++里,任何窗体或界面组件都是用类封装

的,一个类一般有一个头文件(.h文件)和一个源程序文件(.cpp文件)。2.1.2 项目管理文件

后缀为“.pro”的文件是项目的管理文件,文件名就是项目的名称,如本项目中的samp2_1.pro。下面是samp2_1.pro文件的内容。Qt += core guigreaterThan(Qt_MAJOR_VERSION, 4): Qt += widgetsTARGET = samp2_1TEMPLATE = appSOURCES += main.cpp\ widget.cppHEADERS += widget.hFORMS += widget.ui

项目管理文件用于记录项目的一些设置,以及项目包含文件的组织管理。“Qt += core gui”表示项目中加入core gui模块。core gui是Qt用于GUI设计的类库模块,如果创建的是控制台(Console)应用程序,就不需要添加core gui。

Qt类库以模块的形式组织各种功能的类,根据项目涉及的功能需求,在项目中添加适当的类库模块支持。例如,如果项目中使用到了涉及数据库操作的类就需要用到sql模块,在pro文件中需要增加如下一行:Qt +=sql

samp2_1.pro中的第2行是:greaterThan(Qt_MAJOR_VERSION, 4): Qt += widgets

这是个条件执行语句,表示当Qt主版本大于4时,才加入widgets模块。“TARGET = samp2_1”表示生成的目标可执行文件的名称,即编译后生成的可执行文件是samp2_1.exe。“TEMPLATE = app”表示项目使用的模板是app,是一般的应用程序。

后面的SOURCES、HEADERS、FORMS 记录了项目中包含的源程序文件、头文件和窗体文件(.ui文件)的名称。这些文件列表是Qt Creator自动添加到项目管理文件里面的,用户不需要手动修改。当添加一个文件到项目,或从项目里删除一个文件时,项目管理文件里的条目会自动修改。2.1.3 界面文件

后缀为“.ui”的文件是可视化设计的窗体的定义文件,如widget.ui。双击项目文件目录树中的文件widget.ui,会打开一个集成在Qt Creator中的Qt Designer对窗体进行可视化设计,如图2-2所示。约定 本书后面将称这个集成在Qt Creator中的Qt Designer为“UI设计器”,以便与独立运行的Qt Designer区别开来。

图2-2中的UI设计器有以下一些功能区域。● 组件面板。窗口左侧是界面设计组件面板,分为多个组,如

Layouts、Buttons、Display Widgets等,界面设计的常见组件都

可以在组件面板里找到。● 中间主要区域是待设计的窗体。如果要将某个组件放置到窗体上

时,从组件面板上拖放一个组件到窗体上即可。例如,先放一个

Label和一个Push Button到窗体上。● Signals和Slots 编辑器与Action编辑器是位于待设计窗体下方的

两个编辑器。Signals和Slots 编辑器用于可视化地进行信号与槽

的关联,Action编辑器用于可视化设计Action。图2-2 集成在Qt Creator中的UI设计器● 布局和界面设计工具栏。窗口上方的一个工具栏,工具栏上的按

钮主要实现布局和界面设计。● 对象浏览器(Object Inspector)。窗口右上方是Object Inspector,

用树状视图显示窗体上各组件之间的布局包含关系,视图有两

列,显示每个组件的对象名称(ObjectName)和类名称。● 属性编辑器(Property Editor)。窗口右下方是属性编辑器,是

界面设计时最常用到的编辑器。属性编辑器显示某个选中的组件

或窗体的各种属性及其取值,可以在属性编辑器里修改这些属性

的值。

图2-3显示的是选中窗体上放置的标签组件后属性编辑器的内容。最上方显示的文字“LabDemo: QLabel”表示这个组件是一个QLabel类的组件,objectName是LabDemo。属性编辑器的内容分为两列,Property列是属性的名称,Value列是属性的值。属性又分为多个组,实际上表示了类的继承关系,如在图2-3中,可以看出QLabel的继承关系是QObject→QWidget→QFrame→QLabel。图2-3 界面组件的属性编辑器

objectName表示组件的对象名称,界面上的每个组件都需要一个唯一的对象名称,以便被引用。界面上的组件的命名应该遵循一定的法则,具体使用什么样的命名法则根据个人习惯而定,主要目的是便于区分和记忆,也要便于与普通变量相区分。

设置其他属性的值只需在属性编辑器里操作即可,如设置LabDemo的text属性为“Hello, World”,只需像图2-3那样修改text属性的值即可。提示 标准C++语言里并没有property关键字,property是Qt对标准C++的扩展,使得在Qt Designer里就可以可视化设置类的数据。

在图2-2显示的设计窗体上,放置一个Label和一个Push Button组件,它们的主要属性设置见表2-1。表2-1 界面组件的属性设置

Object类名称属性设置备注NameLabDeQLabelText=”Hello, World”设置标签显示文字和moFont.PointSize=20字体Font.bold=truebtnClosQPushText=”Close”设置按钮的文字eButton

编辑完属性之后,再为btnClose按钮增加一个功能,就是单击此按钮时,关闭窗口,退出程序。使用Signals和Slots 编辑器完成这个功能,如图2-4所示。图2-4 信号与槽编辑器中设计信号与槽的关联

在信号与槽编辑器的工具栏上单击“Add”按钮,在出现的条目中,Sender选择btnClose,Signal选择clicked(),Receiver选择窗体Widget,Slot选择close()。这样设置表示当按钮btnClose被单击时,就执行Widget的close()函数,实现关闭窗口的功能。

然后对项目进行编译和运行,可以出现如图2-5所示的窗口,单击“Close”按钮可以关闭程序。标签的文字内容和字体被修改了,窗口标题也显示为所设置的标题,而我们并没有编写一行程序语句,Qt是怎么实现这些功能的呢?图2-5 具有Close按钮的“Hello World”程序2.1.4 主函数文件

main.cpp是实现main()函数的文件,下面是main.cpp文件的内容。#include "widget.h"#include int main(int argc, char *argv[]){ QApplication a(argc, argv); //定义并创建应用程序 Widget w; //定义并创建窗口 w.show(); //显示窗口 return a.exec(); //应用程序运行}

main()函数是应用程序的入口。它的主要功能是创建应用程序,创建窗口,显示窗口,并运行应用程序,开始应用程序的消息循环和事件处理。

QApplication 是Qt的标准应用程序类,第1行代码定义了一个QApplication类的实例a,就是应用程序对象。

然后定义了一个Widget类的变量w,Widget是本实例设计的窗口的类名,定义此窗口后再用w.show()显示此窗口。

最后一行用a.exec()启动应用程序的执行,开始应用程序的消息循环和事件处理。2.1.5 窗体相关的文件

为了搞清楚窗体类的定义,以及界面功能的实现原理,这里将项目进行编译。编译后在项目目录下会自动生成一个文件ui_widget.h,这样对于一个窗体,就有4个文件了,各文件的功能说明见表2-2。表2-2 窗体相关的4个文件文件功能widget.h定义窗体类的头文件,定义了类Widgetwidget.cppWidget类的功能实现源程序文件widget.ui窗体界面文件,由UI设计器自动生成,存储了窗体上各个组件的属性设置和布局ui_widget.h编译后,根据窗体上的组件及其属性、信号与槽的关联等自动生成的一个类的定义文件,类的名称是Ui_Widget

下面分别分析各个文件的内容及其功能,以及它们是如何联系在一起工作,实现界面的创建与显示的。1.widget.h文件

widget.h文件是窗体类的头文件。在创建项目时,选择窗体基类是QWidget,在widget.h中定义了一个继承自QWidget的类Widget,下面是widget.h文件的内容。#ifndef WIDGET_H#define WIDGET_H#include namespace Ui { //一个命名空间Ui,包含一个类Widgetclass Widget;}class Widget : public QWidget{ Q_OBJECTpublic: explicit Widget(QWidget *parent = 0); ~Widget();private: Ui::Widget *ui; //使用Ui::Widget定义的一个指针};#endif

widget.h文件有几个重要的部分。(1)namespace声明

代码中有如下的一个namespace声明:namespace Ui {class Widget;}

这是声明了一个名称为Ui的命名空间(namespace),包含一个类Widget。但是这个类Widget并不是本文件里定义的类Widget,而是ui_widget.h文件里定义的类,用于描述界面组件的。这个声明相当于一个外部类型声明(具体要看完ui_widget.h文件内的解释之后才能搞明白)。(2)Widget类的定义。widget.h文件的主体部分是一个继承于QWidget的类Widget的定义,也就是本实例的窗体类。

在Widget类中使用了宏Q_OBJECT,这是使用Qt的信号与槽(signal和slot)机制的类都必须加入的一个宏(信号与槽在后面详细介绍)。

在public部分定义了Widget类的构造函数和析构函数。

在private部分又定义了一个指针。Ui::Widget *ui;

这个指针是用前面声明的namespace Ui里的Widget类定义的,所以指针ui是指向可视化设计的界面,后面会看到要访问界面上的组件,都需要通过这个指针ui。2.widget.cpp文件

widget.cpp文件是类Widget的实现代码,下面是widget.cpp文件的内容。#include "widget.h"#include "ui_widget.h"Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget){ ui->setupUi(this);}Widget::~Widget(){ delete ui;}

注意到,在这个文件的包含文件部分自动加入了如下一行内容:#include "ui_widget.h"

这个就是Qt编译生成的与UI文件widget.ui对应的类定义文件。

目前只有构造函数和析构函数。其中构造函数头部是:Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)

其意义是:执行父类QWidget的构造函数,创建一个Ui::Widget类的对象ui。这个ui就是Widget的private部分定义的指针变量ui。

构造函数里只有一行语句:ui->setupUi(this)

它是执行了Ui::Widget类的setupUi()函数,这个函数实现窗口的生成与各种属性的设置、信号与槽的关联(后面会具体介绍)。

析构函数只是简单地删除用new创建的指针ui。

所以,在ui_widget.h文件里有一个namespace名称为Ui,里面有一个类Widget是用于描述可视化设计的窗体,且与widget.h里定义的类同名。在Widget类里访问Ui::Widget类的成员变量或函数需要通过Widget类里的ui指针,如同构造函数里执行ui->setupUi( this)函数那样。3.widget.ui文件

widget.ui是窗体界面定义文件,是一个XML文件,定义了窗口上的所有组件的属性设置、布局,及其信号与槽函数的关联等。用UI设计器可视化设计的界面都由Qt自动解析,并以XML文件的形式保存下来。在设计界面时,只需在UI设计器里进行可视化设计即可,而不用管widget.ui文件是怎么生成的。

下面是widget.ui文件的内容。 Widget 0 0 336 216 My First Demo 60 50 211 51 20 75 true Hello, World 200 140 81 31 Close btnClose clicked() Widget close() 240 195 199 149 4.ui_widget.h文件

ui_widget.h是在对widget.ui文件编译后生成的一个文件,ui_widget.h会出现在编译后的目录下,或与widget.ui同目录(与项目的shadow build编译设置有关)。

文件ui_widget.h并不会出现在Qt Creator的项目文件目录树里,当然,可以手工将ui_widget.h添加到项目中。方法是在项目文件目录树上,右击项目名称节点,在调出的快捷菜单中选择“Add Existing Files…”,找到并添加ui_widget.h文件即可。注意 ui_widget.h是对widget.ui文件编译后自动生成的,widget.ui又是通过UI设计器可视化设计生成的。所以,对ui_widget.h手工进行修改没有什么意义,所有涉及界面的修改都应该直接在UI设计器里进行。所以,ui_widget.h也没有必要

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载