QT学习:00 介绍

--- title: framework-cpp-qt-00-介绍 date: 2020-04-08 15:41:54 categories: tags: - c/c++ - qt ---

章节描述:
Qt 是一个跨平台的 GUI 框架(C++/Python库),从这一讲开始,我们进行有关的学习。

介绍

目前最新的版本是 Qt5。Qt5 还包含了很多小版本,其中推荐 Qt5.9,即长期支持版本,Bug较少,相对稳定。

Qt 除了支持界面设计(GUI编程),还封装了与网络编程、多线程、数据库连接、视频音频等相关的功能。

开发平台 参数
OS Windows-10
Qt Creator 4.10.0
Qt Core 5.13.1(MSVC 2017, 32bit)

我们这里假设:

  • 读者已经安装好了QT-creator并且能够正常地编译一个空白例程。
  • 读者具备基本的C++开发基础。

术语介绍

在基于IDE(集成开发环境)的开发,我们需要了解常见的术语。

Project

Project 的中文翻译是“项目”或者“工程”,这里的项目是指为实现某个相对独立功能的程序代码合集,这些代码不单单是放在一块,而是有相互之间的关联性,并且有专门负责管理该项目的项目文件,比如:

  • Qt 使用 .pro 文件管理项目;
  • VC++ 则使用 .vcproj 作为项目文件。

集成开发环境通常都是依据项目文件(.pro/.vcproj)管理和构建项目。 即生成脚本,虽然可以直接调用编译器如 g++ 编译程序,但是如果项目里的代码文件变多了,哪些代码文件更新了需要重新编译,哪些代码没有改不需要重新编译等等,靠程序员自己记忆去处理是比较麻烦的事,还有哪些代码需要预处理或是链接哪些库文件, 这些都是繁杂的过程。为了规范程序的编译生成过程,产生了规范化的生成脚本,就是 Makefile,生成器 make 可以依据规范的 Makefile 自动生成目标程序或库文件。

Debug 和 Release

Debug 即调试,Release 即发行。代码编写之后,生成的目标程序或库文件通常不会绝对正确,或多或少有些毛病(bug), 因此需要进行纠错调试(Debug)。调试过程中需要源代码和二进制目标程序之间一一对应的关系, 这样才能定位到错误代码,所以 Debug 版本的程序是臃肿而不进行优化的。

  • Debug 版本程序通常链接的也是 Debug 版本的库文件,比如 libQt5Guid.a/Qt5Guid.dll,库文件的简短名(不含扩展名)都是以 d 结尾的,Debug 库通常都比较大 。
  • Release 版本程序链接的通常就是 Release 版本的库文件,Release 版本库文件名字比 Debug 版本库文件少一个字母 d ,如 libQt5Gui.a/Qt5Gui.dll,而且 Release 版本库一般都比 Debug 版本小很多,运行效率也高很多。

C++11 标准

时代在变化,C++ 标准也在前进。C++ 正式公布标准有 C++98、C++03、C++11。最新的 C++11 标准是2011年8月12日公布的,在公布之前该标准原名为 C++0x 。这是一次较大的修订和扩充,建议读者专门学一下。

Qt 从 4.8 版本就开始用 C++11 新特性了。编译器里面开始支持 C++11 的版本是 MSVC 2010、GCC 4.5、Clang 3.1,这之后版本的编译器都在逐步完善对 C++11 的支持,现在新版本编译器对新标准的支持都比较全面了。

MSVC 编译器默认开启 C++11 特性,GCC(g++命令)则需要自己添加选项 -std=c++0x ,上面 CXXFLAGS 就是为 GCC 编译器(g++命令)添加 -std=c++0x 选项。

Qt 官方在编译 Qt5 库的时候都是开启 C++11 特性的,如果我们要在自己项目代码启用新标准,需要在 .pro 文件里面添加一行: CONFIG += c++11

库链接

Dynamic Link 即动态链接,Static Link 即静态链接。

动态链接库

目标程序通常都不是独立个体,生成程序时都需要链接其他的库,要用到其他库的代码。对于多个程序同时运行而言,内存中就可能有同一个库的多个副本,占用了太多内存而干的活差不多。

为了优化内存运用效率,引入了动态链接库(Dynamic Link Library),或叫共享库(Shared Object)。使用动态链接库时,内存中只需要一份该库文件,其他程序要使用该库文件时,只要链接过来就行了。由于动态库文件外置,链接到动态库的目标程序相对比较小,因为剥离了大量库代码,而只需要一些链接指针。

使用动态库,也意味着程序需要链接到如 *.dll 或 *.so 文件,得提前装好动态库文件,然后目标程序才能正常运行。

静态链接库

静态库就是将链接库的代码和自己编写的代码都编译链接到一块,链接到静态库的程序通常比较大,但好处是运行时依赖的库文件很少,因为目标程序自己内部集成了很多库代码。

库文件后缀

Linux/Unix 系统里静态库扩展名一般是 .a,动态库扩展名一般是 .so 。Windows 系统里 VC 编译器用的静态库扩展名一般是 .lib,动态库扩展名一般是 .dll 。

显式链接 和 隐式链接

显式链接(Explicit Linking),隐式链接(Implicit Linking, 默认),这两种都是动态链接库的使用方式。

动态链接库通常都有其导出函数列表, 告知其他可执行程序可以使用它的哪些函数。可执行程序使用这些导出函数有两种方式:一是在运行时使用主动加载动态库的函数,Linux 里比如用 dlopen 函数打开并加载动态库,Windows 里一般用 LoadLibrary 打开并加载动态库,只有当程序代码执行到这些函数时,其参数里的动态库才会被加载,这就是显式链接。显式链接方式是在运行时加载动态库,其程序启动时并不检查这些动态库是否存在。

隐式链接是最为常见的,所有的编译环境默认都是采用隐式链接的方式使用动态库。隐式链接会在链接生成可执行程序时就确立依赖关系,在该程序启动时,操作系统自动会检查它依赖的动态库,并一一加载到该程序的内存空间,程序员就不需要操心什么时候加载动态库了。比如 VC 编译环境,链接时使用动态库对应的 .lib 文件(包含动态库的导出函数声明,但没有实际功能代码),在 .exe 程序运行前系统会检查依赖的 .dll

MinGW 是将动态库的导出函数声明放在了 .a 文件里,程序运行依赖的动态库也是 .dll

请注意,VC 链接器使用的 .lib 文件分两类,一种是完整的静态库,体积比较大,另一种是动态库的导出声明,体积比较小。MinGW 链接器使用的 .a 文件也是类似的,Qt 官方库都是按照动态库发布的,静态库只有自己编译才会有。

Qt Creator 的使用

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

  • 单击“Projects(项目)”按钮后,工作区显示新建项目按钮和最近打开项目的列表。
  • 单击“Examples(示例)”按钮后,工作区显示 Qt 自带的大量实例,选择某个实例就可以在 Qt Creator 中打开该项目源程序。
  • 单击“Tutorials(教程)”按钮后,工作区显示各种视频教程,查看视频教程需要联网并使用浏览器打开。
  • 单击“Get Started Now”按钮,工作区显示“Qt Creator Manual”帮助主题内容。

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

使用 Qt Creator 新建项目

点击菜单

单击 Qt Creator 的菜单项文件->新建文件或项目,出现一个对话框。在这个对话框里选择需要创建的项目或文件的模板。

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 画布。

我们选择Qt Widgets Application后, 单击Choose…按钮。

设置项目

设置好项目名称以及储存位置以后,单击Next按钮。

选择工具链

勾选合适的工具链,点击Next按钮。

选择界面的基类

选择需要创建界面的基类(base class)。有 3 种基类可以选择:

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

选择 QMainWindow 作为基类,自动更改的各个文件名不用手动去修改。

实际上我更推荐使用QWidget ,因为可以与一些教程兼容。

勾选“创建界面(Generate form)”复选框。

勾选,就会由 Qt Creator 创建用户界面文件。

否则,需要自己编程手工创建界面。新手勾选

项目管理与文件编辑界面

窗口左侧有上下两个子窗口,上方的目录树显示了项目内文件的组织结构,显示当前项目。

默认情况下,上方的子窗口显示了项目的文件目录树,下方显示打开的文件列表。

上下两个子窗口的显示内容可以通过其上方的一个下拉列表框进行选择,可以选择的显示内容包括项目、打开文档、书签、文件系统、类视图、大纲等。

可以在下方选择显示类视图,这样下方则显示项目内所有的类的结构,便于程序浏览和快速切换到需要的代码位置。

项目的名称构成目录树的一个根节点,Qt Creator 可以打开多个项目,但是只有一个活动项目,活动项目的项目名称节点用粗体字体表示。

在项目名称节点下面,分组管理着项目内的各种源文件,几个文件及分组分别为以下几项:

  • xx.pro 是项目管理文件,包括一些对项目的设置项。
  • Headers 分组,该节点下是项目内的所有头文件(.h),项目有一个头文件 mainwindow.h,是主窗口类的头文件。
  • Sources 分组:该节点下是项目内的所有 C++源文件(.cpp),项目有两个 C++ 源文件,mainwindow.cpp 是主窗口类的实现文件,与 mainwindow.h 文件对应。main.cpp 是主函数文件,也是应用程序的入口。
  • Forms 分组:该节点下是项目内的所有界面文件(.ui)。项目有一个界面文件mainwindow.ui,是主窗口的界面文件。界面文件是文本文件,使用 XML 语言描述界面的组成。(双击它可以进行界面设计)

界面设计

双击文件目录树中的文件mainwindow.ui,可以来到窗体设计界面。

这个界面实际上是 集成的Qt Designer。窗口左侧是分组的组件面板,中间是设计的窗体。

在组件面板的 Display Widgets 分组里,将一个Label组件拖放到设计的窗体上面。双击刚刚放置的 Label 组件,可以编辑其文字内容,将文字内容更改为“Hello, World!”。还可以在窗口右下方的属性编辑器里编辑标签的 Font 属性,Point Size(点大小)更改为 12,勾选粗体。

项目的编译、调试与运行

单击主窗口左侧工具栏上的“项目”按钮,出现项目编译设置界面。

界面左侧一栏的“Build & Run”下面显示了本项目中可用的编译器工具,要使用哪一个编译器用于项目编译,单击其名称即可,选择的编译器名称会用粗体字表示。

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

在设计完 mainwindow.ui 文件,并设置好编译工具之后,就可以对项目进行编译、调试或运行。

主窗口左侧工具栏下方有 4 个按钮:

  • 小电脑: 弹出菜单选择编译工具和编译模式,如 Debug或 Release模式
  • 绿色三角形(Ctrl+R): 直接运行程序,如果修改后未编译,会先进行编译。即使在程序中设置了断点,此方式运行的程序也无法调试。
  • 绿色三角形+小虫子(F5): 项目需要以Debug模式编译,点此按钮开始调试运行,可以在程序中设置断点。若是以 Release模式编译,点此按钮也无法进行调试。
  • 小铁锤(Ctrl+B): 编译当前项目。

运行新建的项目

创建完成以后,我们在右下角可以看到绿色的三角形按钮,点击即可。

关于相对路径的补充说明

相对路径和绝对路径在开发中是比较常见的普通问题。为了避免初学者在Qt学习中因为路径的问题受阻碍,经常抱怨打开某个相对路径的文件打不开,形如:

  • QPixmap("xx.png");// 加载图片不成功
  • QFile("xx.txt"); // 打开文件失败

为了解决这个问题,我们需要知道,在QT中的相对路径,是相对哪个目录的:

  • 明确一个概念:进程的"工作目录 "与程序所在的目录 ,是不同的。
  • 在Qt中,当程序是以Qt Creator 启动时,相对路径是以构建目录作为当前目录来相对的。当开启了shadow build以后,构建目录就以shadow build作为构建目录。

shadow build:将源码路径和构建路径分开(也就是工程生成的文件都不放到源码路径),以此来保证源码路径的清洁。从cmake的时候就已经有了这个概念。

相对路径转绝对路径:

QDir temDir("./dir1/2.swf");
QString absDir = temDir.absolutePath();

得到的路径是例如E:/aa/bb/cc.txt 格式的路径,但实际有些使用路径的函数中需要的路径格式为E:\aa\bb\cc.txt这种格式,所以需要对格式进行简单的转换,QString中有个replace函数可以帮我们完成。

absDir.replace(QString("/"),QString("\\")); // 后面之所以四个 ` \`是因为包含了两个转义字符
原文地址:https://www.cnblogs.com/schips/p/framework-cpp-qt-00-about.html