[QT]开发全解析:从概念到实战

文章目录

  • Qt 框架入门与应用开发指南
    • 一、Qt 框架概述
      • 1.1 什么是 Qt
      • 1.2 Qt 的发展史
      • 1.3 Qt 支持的平台
      • 1.4 Qt 版本
      • 1.5 Qt 的优点
      • 1.6 Qt 的应用场景
      • 1.7 Qt 的成功案例
    • 二、Qt 的开发工具概述
      • Qt Creator
      • Visual Studio
      • Eclipse
    • 三、认识 Qt Creator
      • 3.1 Qt Creator 概览
      • 3.2 使用 Qt Creator 新建项目
        • 3.2.1 新建项目
        • 3.2.2 选择项目模板
        • 3.2.3 选择项目路径
        • 3.2.4 选择构建系统
        • 3.2.5 填写类信息设置界面
        • 3.2.6 选择语言和翻译文件
        • 3.2.7 选择 Qt 套件
        • 3.2.8 选择版本控制系统
        • 3.2.9 最终效果
      • 3.3 认识 Qt Creator 界面
        • 3.3.1 左边栏
        • 3.3.2 代码编辑区![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/588890b0a1484b06bc5f5607e808d731.png)
        • 3.3.3 UI 设计界面
        • 3.3.4 构建区
    • 四、Qt Hello World 程序
      • 4.1 使用 "按钮" 实现
        • 4.1.1 纯代码方式实现
        • 4.1.2 可视化操作实现
      • 4.2 使用 "标签" 实现
        • 4.2.1 纯代码方式实现
        • 4.2.2 可视化操作实现
    • 五、项目文件解析
      • 5.1 .pro 文件解析
      • 5.2 widget.h 文件解析
      • 5.3 main.cpp 文件解析
      • 5.4 widget.cpp 文件解析
      • 5.5 widget.ui 文件解析
    • 六、Qt 编程注意事项
      • 6.1 Qt 中的命名规范
      • 6.2 Qt Creator 中的快捷键
      • 6.3 使用帮助文档
      • 6.4 认识对象模型(对象树)
      • 6.5 Qt 窗口坐标体系

Qt 框架入门与应用开发指南

一、Qt 框架概述

1.1 什么是 Qt

Qt 是一个跨平台的 C++ 图形用户界面应用程序框架。它为应用程序开发者提供了建立艺术级图形界面所需的所有功能。它是完全面向对象的,很容易扩展。Qt 为开发者提供了一种基于组件的开发模式,开发者可以通过简单的拖拽和组合来实现复杂的应⽤程序,同时也可以使⽤ C++ 语⾔进⾏⾼级开发。

1.2 Qt 的发展史

  • 1991 年 Qt 最早由奇趣科技开发。
  • 1996 年进⼊商业领域,它也是⽬前流⾏的 Linux 桌⾯环境 KDE 的基础。
  • 2008 年奇趣科技被诺基亚公司收购,Qt 成为诺基亚旗下的编程⼯具。
  • 2012 年 Qt 又被 Digia 公司收购。
  • 2014 年 4 ⽉跨平台的集成开发环境 Qt Creator 3.1.0 发布,同年 5 ⽉ 20 ⽇发布了 Qt 5.3 正式版,至此 Qt 实现了对 IOS、Android、Embedded 等各平台的全⾯⽀持。

1.3 Qt 支持的平台

  • Windows:XP、Vista、Win7、Win8、Win2008、Win10
  • Unix/X11:Linux、Sun Solaris、HP-UX、Compaq Tru64 UNIX、IBM AIX、SGI IRIX、FreeBSD、BSD/OS、和其他很多 X11 平台
  • Macintosh:Mac OS X
  • Embedded:有帧缓冲⽀持的嵌⼊式 Linux 平台,Windows CE
  • Android

1.4 Qt 版本

目前最新的版本是 Qt 6,但 Qt 6 和 Qt 5 之间的核⼼功能区别不⼤,企业中仍然有⼤量的项⽬在使⽤ Qt 5,因此课堂上仍然使⽤ Qt 5 版本来进⾏介绍。

Qt 在发布的时候还提供了两种许可证:

  • 商业许可:开发者以商业⽬的使⽤ Qt 框架进⾏开发和发布软件的许可,开发者需要购买商业许可并按照相关规定使⽤ Qt 框架。商业许可提供了更多的功能和服务,适合于商业软件开发。
  • 开源许可:开发者以⾮商业⽬的使⽤ Qt 框架进⾏开发和发布软件的许可,开发者可以免费使⽤ Qt 框架,但需要遵守开源许可协议的要求,如在软件中包含 Qt 许可协议的声明等。

1.5 Qt 的优点

  • 跨平台,⼏乎⽀持所有的平台。
  • 接⼝简单,容易上⼿,学习 QT 框架对学习其他框架有参考意义。
  • ⼀定程度上简化了内存回收机制。
  • 开发效率⾼,能够快速的构建应⽤程序。
  • 有很好的社区氛围,市场份额在缓慢上升。
  • 可以进⾏嵌⼊式开发。

1.6 Qt 的应用场景

  • 桌⾯应⽤程序:Qt 能够创建各种类型的桌⾯应⽤程序,包括⽂件管理器、媒体播放器、绘图程序等。Qt 应⽤程序⽀持多种操作系统,可以运⾏在 Windows、Linux、macOS 等桌⾯操作系统上。
  • 移动应⽤程序:Qt 支持 Android 和 IOS 移动操作系统,为应⽤程序提供了强⼤的跨平台能⼒。可以使⽤ Qt 构建各种移动应⽤程序,例如社交应⽤、游戏、娱乐等。
  • 嵌⼊式系统:Qt 在嵌⼊式领域应⽤⾮常⼴泛,它可以构建⾯向各种设备的图形应⽤程序,在机顶盒、⻋载娱乐系统、安防监控设备等领域具有⼴泛的应⽤。

1.7 Qt 的成功案例

  • Linux 桌⾯环境 KDE
  • WPS Office 办公软件
  • Skype 网络电话
  • Google Earth 谷歌地图
  • VLC 多媒体播放器
  • VirtualBox 虚拟机软件

二、Qt 的开发工具概述

Qt 支持多种开发工具,其中比较常用的开发工具包括 Qt Creator、Visual Studio、Eclipse。

Qt Creator

Qt Creator 是一个轻量级的跨平台集成开发环境(IDE),专为使用 Qt 框架进行应用程序开发而设计。它是一个功能强大、易于使用、快速且高效的工具,被广泛用于编写各种类型的应⽤程序,如桌⾯应⽤程序、移动应⽤程序和嵌⼊式系统等。

Qt Creator 的主要特点包括:

  • 紧密集成的 Qt 框架:Qt Creator 专⻔为 Qt 开发⽽设计,因此它与 Qt 框架集成得⾮常紧密,使开发者可以更容易地管理和部署他们的应⽤程序。
  • 强大的编辑器:Qt Creator 具有一些先进的编辑器功能,如语法⾼亮、代码折叠、智能提⽰、⾃动完成和代码重构。
  • 集成的调试器:Qt Creator 内置了调试器,允许开发⼈员在代码中设置断点以及检查变量、堆栈和调⽤树等信息。
  • ⾼效的构建系统:Qt Creator 提供了一个⾼效的构建系统,可以⾃动构建和部署应⽤程序,同时⽀持使⽤不同的编译器和平台。
  • 可视化界⾯设计器:Qt Creator 具有一个可视化界⾯设计器,它允许开发⼈员在没有编写代码的情况下创建复杂的⽤⼾界⾯。
  • 多语言支持:Qt Creator 支持多种编程语⾔,包括 C++、QML、JavaScript 等。

Visual Studio

Visual Studio 是由微软公司开发的集成开发环境(IDE)。它可以⽤来开发多种类型的应⽤程序,包括 Windows 桌⾯应⽤程序、Web 应⽤程序、移动应⽤程序、游戏等。Visual Studio 提供了丰富的开发⼯具和功能,包括代码编辑器、调试器、⾃动完成、代码重构、版本控制等等。它⽀持多种编程语⾔,如 C++、C#、Visual Basic、F#、Python 等。Visual Studio 还可以与其他开发⼯具和服务集成,如 Azure 云服务、GitHub、Jenkins 等。

Eclipse

Eclipse 是著名的跨平台的自由集成开发环境(IDE)。最初主要⽤来 Java 语⾔开发,但是⽬前亦有⼈通过插件使其作为其他计算机语⾔⽐如 C++ 和 Python 的开发⼯具。Eclipse 的本⾝只是⼀个框架平台,但是众多插件的⽀持使得 Eclipse 拥有其他功能相对固定的 IDE 软件很难具有的灵活性。许多软件开发商以 Eclipse 为框架开发⾃⼰的 IDE。Qt 框架可以与 Eclipse 集成,使开发者可以使⽤ Eclipse 的强⼤功能来开发 Qt 应⽤程序。

三、认识 Qt Creator

3.1 Qt Creator 概览

在这里插入图片描述

从开始菜单或者快捷方式打开 Qt Creator 集成开发环境,启动之后看到类似下面的界面:

  1. 菜单栏:菜单栏一共有 8 个菜单选项,包含了常用的功能菜单:

    • 文件:包含了新建、打开、关闭项目和文件、打印和退出等基本功能
    • 编辑:包含了撤销、剪切、复制、查找和选择编码等功能
    • 构建:包含构建和运行项目等相关功能。
    • 调试:包含调试运行项目等相关功能。
    • Analyze:包含 QML 分析器、Valgrind 内存和功能分析器等相关功能。
    • 工具:提供了快速定位菜单、外部工具菜单等。这里的选项菜单中包含了 Qt Creator 各个方面的设置选项:环境设置、文本编辑器设置、帮助设置、构建和运行设置、调试器设置和版本控制设置等。
    • 控件:包含了设置窗口布局的一些菜单,如全屏显示和隐藏边栏功能等。
    • 帮助:包含 Qt 帮助、Qt Creator 版本信息、报告 bug 和插件管理等菜单。
  2. 模式选择:

    • 欢迎模式:主要提供了一些功能的快捷入口,如打开帮助教程、打开示例程序、打开项目、新建项目、快速打开以前的项目和会话、联网查看 Qt 官方论坛和博客等。示例页面显示了 Qt 自带的大量示例程序,并提供了搜索栏从而实现快速查找;教程页面提供了一些视频教程资源,但是是英文的。
    • 编辑模式:主要用来查看和编辑程序代码,管理项目文件。Qt Creator 中的编辑器具有关键字特殊颜色显示、代码自动补全、声明定义间快捷切换、函数原型提示、F1 键快速打开相关帮助和全项目中进行查找等功能。也可以在 “工具---->选项” 菜单中对编辑器进行设置。
    • 设计模式:整合了 Qt Designer 的功能。可以设计图形界面,进行部件属性设置、信号和槽设置、布局设置等操作。
    • 调试模式:支持设置断点、单步调试和远程调试等功能,包含局部变量和监视器、断点、线程以及快照等查看窗口。
    • 项目模式:包含对特定项目的构建设置、运行设置、编辑器设置、代码风格设置和依赖关系等页面。构建设置中可以对项目的版本、使用的 Qt 版本和编译步骤进行设置;编辑器设置中可以设置文件的默认编码;在代码风格设置中可以设置自己的代码风格。
    • 帮助模式:在帮助模式中将 Qt 助手整合了进来,包含目录、索引、查找和书签等几个导航模式,可以在帮助中查看 Qt 和 Qt Creator 的各方面信息。
  3. 构建套件选择器:构建套件选择器包含了目标选择器(Target selector)、运行按钮(Run)、调试按钮(Debug)和构建按钮(Building)四个图标。

    • 目标选择器:目标选择器用来选择要构建哪个项目、使用哪个 Qt 库、这对于多个 Qt 库的项目很有用。还可以选择编译项目的 debug 版本或是 release 版本。
    • 运行按钮:运行按钮可以实现项目的构建和运行;
    • 调试按钮:运行按钮可以实现项目的调试;
    • 构建按钮:构建按钮完成项目的构建。
  4. 欢迎模式下的窗口工作方式:

    • Project:用来新建工程、打开工程
    • 示例:Qt 官方的一些示例
    • 教程:Qt 官方教程
  5. 定位器:使用定位器来快速定位项目、文件、类、方法、帮助文档以及文件系统。可以使用过滤器来更加准确地定位要查找的结果。

  6. 输出窗格:输出窗格包含了问题、搜索结果(Search Results)、应用程序输出、编译输出、Debugger Console、概要信息、测试结果(Test Results)7 个选项,它们分别对应一个输出窗口,响应的快捷键依次是 Alt+数字 1~7。

    • 问题:问题窗口显示程序编译时的错误和警告信息;
    • Search Results:搜索结果窗口显示执行了搜索操作后的结果信息;
    • 应用程序输出:应用程序窗口显示应用程序运行过程中输出的所有信息;
    • 编译输出:编译输出窗口显示程序编译过程输出的相关信息;
  7. 会话记录:可以对会话进行管理,包括 Clone。如果没打开工程,则显示的是最后一次打开的(会话)工程,否则,显示当前的会话(工程)。

  8. 新建项目;

  9. 打开已有项目;

3.2 使用 Qt Creator 新建项目

3.2.1 新建项目

打开 Qt Creator,在菜单栏中选中:“文件”--------->“新建文件或项目”;或者使用快捷键:Ctrl + n;或者直接点击:“new”;在这里插入图片描述

在欢迎模式下,直接点击 New,如下图示:在这里插入图片描述

3.2.2 选择项目模板

弹出如下对话框:

新建项目对话框里有五类项目模板:

  • Application:Qt 应用程序,包括普通窗体程序和 QtQuick 程序
  • Library:可以创建动态库、静态库以及 Qt Quick 扩展插件、QtCreator 自身插件
  • 其他项目:可以创建单元测试项目、Qt4 设计师自定义控件、子目录项目等
  • Non-Qt-Project:非 Qt 项目。可以创建纯 C 或纯 C++ 项目
  • Import Project:导入项目。从版本控制系统管理的软件项目导入旧的项目

常用的只有第一类 Application,选择它,在右侧会看到 Qt 应用程序的五个子模板:

  • Qt Widgets Application:普通窗体模板,传统基于部件的窗体界面程序。
  • Qt Console Application:Qt 控制台应用程序。因为 Qt 主要用于图形界面设计,这个控制台项目模板基本不用。
  • Qt for Python:在 Python 下用 LGPL 的许可来开发闭源 Qt 软件。
  • Qt Quick Application:Qt 提供的一种高级用户界面技术,使用它可以方便快速的为移动以及嵌入式设备开发流畅美观的用户界面。Qt Quick 模块是开发 QML 应用的标准库,提供了使用 QML 创建用户界面所需的一切,包括可视化、交互、动画、模型、视图、粒子效果以及着色效果等。
3.2.3 选择项目路径

给 Qt 项目命名及选择保存项目的路径;

3.2.4 选择构建系统

选择 Qt 项目的构建系统,使用默认的 “qmake” 即可。

Qt 中的构建工具有三种可供选择,分别是:qmake、CMake、Qbs,下面依次介绍。

  • qmake:qmake 是一个构建工具(build tool),用于自动生成 makefile 文件。qmake 支持跨平台构建。qmake 编辑的是一个后缀名为 .pro 的文件。
  • CMake:CMake 是一个跨平台的构建工具。CMake 本身不是一个编译器,其实就是生成一个让编译器能读懂编译流程的文件工具。让 CMake 自动生成构建系统,例如 Makefile 和 Visual Studio 项目文件。CMake 是一个第三方工具,有自己的文档。
  • Qbs:Qbs(Qt Build Suite:Qt 构建套件)同 qmake、CMake 一样都是构建工具。Qbs 号称是新一代的构建工具,比 qmake 编译速度更快。Qbs 没有绑定 Qt 版本,它从项目文件的高级项目描述中生成一个正确的依赖表。而传统的 MakeFile 生成工具如 qmake 和 CMake,其在生成 MakeFile 文件后将实际的命令交给 Make 工具去执行。
    Qt 官方声明,因市场原因,弃用 Qbs。对于 Qt 用户来说,qmake 是当前使用最广泛的构建工具,CMake 其次。
3.2.5 填写类信息设置界面

对于基类的选择,目前有三种基类:

  • QMainWindow:主窗口类,一般用于较为复杂的应⽤程序,除了中央客户区界面,还包括菜单栏、工具栏、状态栏以及多个可停靠的工具对话框等
  • QWidget:最简单、最基本的窗体程序,里面可以放置多个控件实现程序功能
  • QDialog:基于对话框的程序,对话框一般用于弹窗,也可以用于主界面显示。对话框是从 QWidget 继承而来的,并丰富了一些功能,如模态显示和返回值等

上述三个类之间的关系如下图:在这里插入图片描述

3.2.6 选择语言和翻译文件

点击 “下一步” 进入如下界面:在这里插入图片描述

此处选择的语言是 “汉语”、“英语” 这样的语言。而不是 “编程语言”。由于我们暂时不考虑国际化问题,直接下一步即可。

3.2.7 选择 Qt 套件

默认只有第一个 “Desktop Qt 5.14.2 MinGW 64-bit”,如果安装配置了多个 Qt 套件,就可以都选上。

Qt 套件是指 Qt 程序从编译链接到运行环境的全部工具和 Qt 类库的集合,对于 MinGW 版本 Qt 程序生成和调试,至少需要 MinGW 中的编译器 g++(自动调用链接器)、g++ 配套的基础库、调试器 gdb 还有使用 MinGW 环境编译而成的 Qt 类库自身。默认情况下,在上面 Kit Selection 里选中全部套件。

3.2.8 选择版本控制系统

点击 “下一步” 进入项目管理界面;在项目管理界面可以设置作为子项目,以及加入版本控制系统管理。这两个功能暂时用不到,都用默认的 ,然后点击 “完成”。

如果想把代码提交到码云或者 github,可以在此处选择 git 作为版本控制系统。

3.2.9 最终效果

通过上述 8 个步骤,完成了项目的创建。

项目创建完成之后,Qt Creator 会直接进入代码编辑模式,可以看到类似下图界面:在这里插入图片描述

3.3 认识 Qt Creator 界面

3.3.1 左边栏

在编辑模式下,左边竖排的两个窗口叫做 “边栏”。① 是项目文件管理窗口,② 是打开文件列表窗口。

在 QtCreator 菜单 “控件”------->“Show Left Sidebar”,或者使用快捷键:“Alt + 0” 可以控制边栏的显示和隐藏。

边栏里的窗口数目可以增加,边栏子窗口标题栏有一排小按钮,最右边的是关闭按钮,倒数第二个是增加分栏按钮,可以添加多个边栏子窗口。

边栏子窗口标题栏第一个控件是组合框,可以选择该子窗口的功能视图类型,目前可以选择 8 个视图类型:在这里插入图片描述

视图类型说明
项目即项目文件管理视图,可以选择项目里的文件进行编辑,包括 pro 文件也可以手动编辑。
打开文档当前已经打开的文件列表,文件名右边如果有 * 号,是该文件被修改了但尚未保存。
书签右击代码编辑器行号位置,看到 “切换书签”,可以给代码行添加书签,方便跳转到该位置。
文件系统相当于系统里的文件资源管理器,可以查看项目文件夹在磁盘里的实际文件列表。
类视图可以查看项目里包含的类及相应源代码文件里的成员函数、成员变量。
Git Branches查看当前分支
大纲编辑器所显示的当前文件的大纲列表,如名字空间、类名、成员函数、成员变量等。
Tests测试
类型层次当前项目包含的类及其基类、派生类列表。
Include Hierarchy包含视图,显示当前项目里 .h、.cpp 以及 Qt 类库头文件之间的包含关系。
3.3.2 代码编辑区在这里插入图片描述

① 和 ②:导航按钮 “返回” 和 “前进”,这与网页浏览器的前进和后退按钮类似,可以在之前浏览的多个代码文件或一个代码文件里多个位置之间快速切换。

③:标识当前显示的文件是只读还是可写,一般都是可写的。

④:文件类型图标,当前显示文件的类型,这个控件其实是一个菜单按钮,点击可以弹出丰富的文件处理功能菜单。

⑤:打开的文件名,可以在多个打开的文件之间选择切换,与边栏的 “打开文档” 视图是对应的。

⑥:关闭当前显示的文档。

⑦:为当前显示的文件添加额外的 C++ 预处理指令,一般用不着。

⑧:选择符号,可以在当前显示的文件里多个函数、类、成员变量等之前快速切换,与边栏 “大纲” 视图是对应的。

⑨:编辑区光标的行号和列号。

⑩:代码编辑区分栏,可以增加多个编辑器窗口,显示多个打开的文档或显示较大源码文件的多个位置。

行首区:主要用来显示代码行号,以及调试断点标志和代码书签标志。右击行首区可以弹出右键菜单,菜单里可以切换书签、编辑书签以及设置或取消断点。

同一行是既可以打断点也可以设置书签的,二者不冲突,其实它们根本就没关系。单击行号前面的浅灰色空白区可以直接打断点,再次单击可以取消断点,另外也可以用快捷键 F9 设置或取消断点。代码书签一般用右键菜单来设置,也可以用快捷键 Ctrl+M 设置或取消书签。

编辑区:写代码的区域。

3.3.3 UI 设计界面

双击 widget.ui 文件,Qt Creator 会自动进入设计模式,可以对图形界面进行可视化编辑:在这里插入图片描述

①:组件选择窗口。组件选择窗口分为多个组,如 Layouts、Buttons、Display Widgets 等,界面设计的常见组件都可以在组件选择窗口中找到。

②:UI 设计窗口。如果要将某个组件放置到该窗口上时,从组件选择窗口上拖放一个组件到窗体上即可。

③:动作编辑窗口。动作编辑窗口包括 Action Editor 以及 Signals 和 Slots 编辑器。Action Editor 主要是用来新建 Action,并且通过拖拽的动作,将新建好的 Action 添加到菜单栏和工具栏上;Signals 和 Slots 编辑器用于可视化地进行信号与槽的关联。

④:对象浏览窗口。用树状视图显示窗体上各组件之间的布局包含关系,视图有两列,显示每个组件的对象名称(ObjectName)和类名称。

⑤:属性设置窗口。显示某个选中的组件或窗体的各种属性及其取值,可以在属性设置窗口里修改这些属性的值。

3.3.4 构建区

在这里插入图片描述
左下角一共有四个按钮,下面分别介绍一下:

  • 第一个按钮是选择构建项目使用的 Qt 套件和构建目标程序的类型(Debug 或 Release)。

对于第一个按钮,默认的是 Debug,构建的是 Debug 类型的目标程序。如果需要构建 Release 版目标程序,点开左下角第一个按钮:
在这里插入图片描述

这里有三种构建模式:

模式说明
Debug以 “-g” 模式编译,带着符号信息,优点是便于调试
Profileprofile 则是在 “Debug” 和 “Release” 之间取一个平衡,兼顾性能和调试,可以类似的看做是性能更优又方便调试的版本。
Release“Release” 是经过优化之后,性能比 Debug 更上一个档次

上图是针对项目只用到单一 Qt 套件的,如果之前配置了多个 Qt 套件,看到的类似下图:在这里插入图片描述

如果项目配置了多个可用的 Qt 套件,点开左下角第一个按钮后,会看到各个套件以及构建类型,如果要切换 Qt 套件或构建类型,直接选中相应条目,然后点击运行按钮就行了。如果构建和运行时没出错,就会显示出构建好的目标程序界面。

  • 第二个是运行按钮,快捷键是 Ctrl+R,如果还没构建项目或刚修改了代码,直接点击运行的话,Qt Creator 会自动构建生成新的目标程序并运行。

  • 第三个是调试按钮,快捷键是 F5。调试程序之前,Qt Creator 会自动构建生成最新的目标程序,并进入调试模式。

  • 第四个是构建按钮,快捷键是 Ctrl+B,只构建最新的目标程序,但不运行。

四、Qt Hello World 程序

4.1 使用 “按钮” 实现

4.1.1 纯代码方式实现

在这里插入图片描述
实现效果如下图:在这里插入图片描述

4.1.2 可视化操作实现

(1)双击:“widget.ui” 文件;在这里插入图片描述

(2)拖拽控件至 UI 界面窗口并修改内容;
在这里插入图片描述

(3)构建并运行,效果如下所示:
在这里插入图片描述

4.2 使用 “标签” 实现

4.2.1 纯代码方式实现

在这里插入图片描述
实现效果:
在这里插入图片描述

4.2.2 可视化操作实现

(1)双击:“widget.ui” 文件;在这里插入图片描述

(2)拖拽 “标签” 至 UI 设计界面中,并双击修改标签内容;
在这里插入图片描述

(3)实现效果如下图所示:
在这里插入图片描述

五、项目文件解析

5.1 .pro 文件解析

工程新建好之后,在工程目录列表中有一个后缀为 “.pro” 的文件,“.pro” 文件就是工程文件 (project),它是 qmake 自动生成的用于生产 makefile 的配置文件。在这里插入图片描述
在这里插入图片描述

双击进入该文件,该文件的核心内容如下:

QT += core guigreaterThan(QT_MAJOR_VERSION, 4):QT += widgetsTARGET = QtFirstTEMPLATE = appSOURCES += main.cpp \widget.cppHEADERS += widget.h

.pro 文件的写法如下:

  1. 注释:从 “#” 开始,到这一行结束。

  2. QT += core gui // Qt 包含的模块在这里插入图片描述

  3. greaterThan(QT_MAJOR_VERSION, 4):QT += widgets // 这条语句的含义是,如果 QT_MAJOR_VERSION 大于 4(也就是当前使用的 Qt5 及更高版本)需要增加 widgets 模块。如果项目仅需支持 Qt5,也可以直接添加 “QT += widgets” 一句。不过为了保持代码兼容,最好还是按照 QtCreator 生成的语句编写。

  4. 指定生成的应用程序名:TARGET = QtDemo

  5. TEMPLATE = app // 模板。告诉 qmake 为这个应用程序生成哪种 makefile。下面是可供选择的模板:

    • app:建立一个应用程序的 makefile。这是默认值,所以如果模板没有被指定,这个将被使用。
    • lib:建立一个库的 makefile。
    • vcapp:建立一个应用程序的 VisualStudio 项目文件。
    • vclib:建立一个库的 VisualStudio 项目文件。
    • subdirs:这是一个特殊的模板,它可以创建一个能够进入特定目录的 makefile 并且为它调用 make 的 makefile。
  6. 工程中包含的源文件:SOURCES += main.cpp \ widget.cpp

  7. 工程中包含的头文件:HEADERS += widget.h

  8. 工程中包含的资源文件:RESOURCES += painter.qrc

  9. 工程中包含的 “ui” 设计文件:FORMS += widget.ui

  10. 配置信息:CONFIG += c++11 (使用 c++11 的特性) CONFIG 用来告诉 qmake 关于应用程序的配置信息。

5.2 widget.h 文件解析

在 Qt 中,如果要使用信号与槽(signal 和 slot)的机制就必须加入 Q_OBJECT 宏;

Ui::Widget *ui; // 这个指针是用前面声明的 namespace Ui 里的 Widget 类定义的,所以指针 ui 是指向可视化设计的界面,后面要访问界面上的组件,都需要通过这个指针 ui 去访问。在这里插入图片描述

5.3 main.cpp 文件解析

使用 Qt Creator 新建任意工程之后,main.cpp 文件中都会自动生成如下代码:

#include <QApplication>
#include "widget.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

解释:

  1. Qt 系统提供的标准类名声明头文件没有 .h 后缀;
  2. Qt 一个类对应一个头文件,类名就是头文件名;
  3. QApplication 为应用程序类;QApplication a;(a 为应用程序对象,有且仅有一个。)
    • QApplication 管理图形用户界面应用程序的控制流和主要设置。
    • QApplication 是 Qt 的整个后台管理的命脉。它包含主事件循环,在其中来自窗口系统和其它资源的所有事件处理和调度。它也处理应用程序的初始化和结束,并且提供对话管理。
    • 对于任何一个使用 Qt 的图形用户界面应用程序,都正好存在一个 QApplication 对象,而不论这个应用程序在同一时间内是不是有 0、1、2 或更多个窗口。
  4. myWidget w; // 实例化窗口对象
  5. w.show(); // 调用 show 函数显示窗口
  6. a.exec(): 程序进入消息循环,等待对用户输入进行响应。这里 main() 把控制权转交给 Qt,Qt 完成事件处理工作,当应用程序退出的时候 exec() 的值就会返回。在 exec() 中,Qt 接受并处理用户和系统的事件并且把它们传递给适当的窗口部件。

5.4 widget.cpp 文件解析

widget.cpp 文件是类 Widget 的实现代码,所有在窗体上要实现的功能添加在此文件中;在这里插入图片描述

5.5 widget.ui 文件解析

在这里插入图片描述

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

六、Qt 编程注意事项

6.1 Qt 中的命名规范

  • 类名:首字母大写,单词和单词之间首字母大写;
  • 函数名及变量名:首字母小写,单词和单词之间首字母大写;

💡 Qt 偏好驼峰命名法.这⼀点不像C++偏好蛇形命名.

6.2 Qt Creator 中的快捷键

  • 注释:ctrl + /
  • 运行:ctrl + R
  • 编译:ctrl + B
  • 字体缩放:ctrl + 鼠标滑轮
  • 查找:ctrl + F
  • 整行移动:ctrl + shift + ↑/↓
  • 帮助文档:F1
  • 自动对齐:ctrl + i;
  • 同名之间的 .h 和 .cpp 的切换:F4
  • 生成函数声明的对应定义: alt + enter

6.3 使用帮助文档

打开帮助文档有三种方式,实际编程中使用哪种都可以:

  1. 光标放到要查询的类名/方法名上,直接按 F1

  2. Qt Creator 左侧边栏中直接用鼠标单击 “帮助” 按钮:在这里插入图片描述

    点击 “帮助” 之后,出现如下图示界面:在这里插入图片描述

  3. 找到 Qt Creator 的安装路径,在 “bin” 文件夹下找到 assistant.exe,双击打开;在这里插入图片描述
    在这里插入图片描述

使用示例:

  1. 新建项目,在新建的项目中使用 Qt 中的 “QPushButton” 控件。
  2. 打开帮助手册,在 “索引” 里面输入 “QPushButton”;
    在这里插入图片描述

6.4 认识对象模型(对象树)

在 Qt 中创建很多对象的时候会提供一个 Parent 对象指针,下面来解释这个 parent 到底是干什么的。在这里插入图片描述

  • QObject 是以对象树的形式组织起来的。
    • 当创建一个 QObject 对象时,会看到 QObject 的构造函数接收一个 QObject 指针作为参数,这个参数就是 parent,也就是父对象指针。
    • 这相当于,在创建 QObject 对象时,可以提供一个其父对象,我们创建的这个 QObject 对象会自动添加到其父对象的 children() 列表。
    • 当父对象析构的时候,这个列表中的所有对象也会被析构。(注意,这里的父对象并不是继承意义上的父类!)
    • 这种机制在 GUI 程序设计中相当有用。例如,一个按钮有一个 QShortcut(快捷键)对象作为其子对象。当删除按钮的时候,这个快捷键理应被删除。这是合理的。
  • QWidget 是能够在屏幕上显示的一切组件的父类。
    • QWidget 继承自 QObject,因此也继承了这种对象树关系。一个孩子自动地成为父组件的一个子组件。因此,它会显示在父组件的坐标系统中,被父组件的边界剪裁。例如,当用户关闭一个对话框的时候,应用程序将其删除,那么,我们希望属于这个对话框的按钮、图标等应该一起被删除。事实就是如此,因为这些都是对话框的子组件。
    • 当然,我们也可以自己删除子对象,它们会自动从其父对象列表中删除。比如,当我们删除了一个工具栏时,其所在的主窗口会自动将该工具栏从其子对象列表中删除,并且自动调整屏幕显示。
    • Qt 引入对象树的概念,在一定程度上解决了内存问题。
    • 当一个 QObject 对象在堆上创建的时候,Qt 会同时为其创建一个对象树。不过,对象树中对象的顺序是没有定义的。这意味着,销毁这些对象的顺序也是未定义的。
    • 任何对象树中的 QObject 对象 delete 的时候,如果这个对象有 parent,则自动将其从 parent 的 children() 列表中删除;如果有孩子,则自动 delete 每一个孩子。Qt 保证没有 QObject 会被 delete 两次,这是由析构顺序决定的。
    • 如果 QObject 在栈上创建,Qt 保持同样的行为。正常情况下,这也不会发生什么问题。来看下面的代码片段:

6.5 Qt 窗口坐标体系

坐标体系:以左上角为原点(0,0),X 向右增加,Y 向下增加。在这里插入图片描述

对于嵌套窗口,其坐标是相对于父窗口来说的。

示例:使用 Qt 中的坐标系设置控件的位置;

运行结果如下图示:在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/28500.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 718.最长重复子数组(动态规划,Python)

给两个整数数组 nums1 和 nums2 &#xff0c;返回 两个数组中 公共的 、长度最长的子数组的长度 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,3,2,1], nums2 [3,2,1,4,7] 输出&#xff1a;3 解释&#xff1a;长度最长的公共子数组是 [3,2,1] 。 示例 2&#xff1a; 输…

从厨电模范到数字先锋,看永洪科技如何助力方太集团开启数字新征程

在数字化洪流席卷全球的宏大背景下&#xff0c;企业转型升级的紧迫性与重要性日益凸显&#xff0c;成为驱动行业进步的关键引擎。在这一波澜壮阔的转型浪潮中&#xff0c;方太集团——厨电领域的璀璨明珠&#xff0c;以其前瞻性的战略视野和不懈的创新精神&#xff0c;携手数据…

C++11中atomic

C11中atomic 在C中&#xff0c;std::atomic 是一个非常重要的工具&#xff0c;主要用于实现线程安全的操作。它属于C11标准引入的 <atomic> 头文件的一部分&#xff0c;用于处理多线程环境下的原子操作。以下是 std::atomic 的主要作用和特点&#xff1a; 1. 保证操作的…

尚庭公寓项目记录

数据库准备 保留图像时&#xff0c;保存图像地址就可以数据表不是越多越好&#xff0c;可以用中间表来实现俩个表之间的联立这样方便查数据但是却带来性能问题而减少表的jion但是提高性能&#xff0c;以冗余来换去性能采用MySQL&#xff0c;InnoDB存储引擎物理删除和逻辑删除逻…

unity6 打包webgl注意事项

webgl使用资源需要异步加载 使用localization插件时要注意&#xff0c;webgl不支持WaitForCompletion&#xff0c;LocalizationSettings.InitializationOperation和LocalizationSettings.StringDatabase.GetTable都不能用 web里想要看到具体的报错信息调试开启这两个&#xf…

wxWidgets GUI 跨平台 入门学习笔记

准备 参考 https://wiki.wxwidgets.org/Microsoft_Visual_C_NuGethttps://wiki.wxwidgets.org/Tools#Rapid_Application_Development_.2F_GUI_Buildershttps://docs.wxwidgets.org/3.2/https://docs.wxwidgets.org/latest/overview_helloworld.htmlhttps://wizardforcel.gitb…

C++20 中使用括号进行聚合初始化:新特性与实践指南

文章目录 1. 聚合初始化简介2. C20 中的括号聚合初始化2.1 指定初始化器&#xff08;Designated Initializers&#xff09;2.2 嵌套聚合初始化 3. 使用括号初始化数组4. 注意事项5. 实际应用场景6. 总结 在 C20 中&#xff0c;聚合初始化&#xff08;Aggregate Initialization&…

TomcatServlet

https://www.bilibili.com/video/BV1UN411x7xe tomcat tomcat 架构图&#xff0c;与 jre&#xff0c;应用程序之前的关系 安装使用 tomcat 10 开始&#xff0c;api 从 javax.* 转为使用 jakarta.*&#xff0c;需要至少使用 jdk 11 cmd 中默认 gbk 编码&#xff0c;解决控制…

android接入rocketmq

一 前言 RocketMQ 作为一个功能强大的消息队列系统&#xff0c;不仅支持基本的消息发布与订阅&#xff0c;还提供了顺序消息、延时消息、事务消息等高级功能&#xff0c;适应了复杂的分布式系统需求。其高可用性架构、多副本机制、完善的运维管理工具&#xff0c;以及安全控制…

有关Java中的集合(1):List<T>和Set<T>

学习目标 核心掌握List集合了解Set集合 1.List<T> ● java.util.List。有序列表。 ● List集合元素的特点&#xff1a;有序表示存取有序&#xff08;因为有索引&#xff09;而且可以重复 ● List常用实现类&#xff1a; ArrayList、LinkedList、Vector等 1.1 常用方法…

DeepSeek+Graphrag检索增强

用于增强的文章为一篇机器学习的文章&#xff0c;以及本人自己的论文 对于此感兴趣的可私聊我&#xff0c;过多细节不便展示 实现方法 图构建 数据收集&#xff1a;收集与检索相关的各种数据&#xff0c;如文本、图像、元数据等。实体识别和关系抽取&#xff1a;从收集的数据…

利用opencv_python(pdf2image、poppler)将pdf每页转为图片

1、安装依赖pdf2image pip install pdf2image 运行.py报错&#xff0c;因为缺少了poppler支持。 2、安装pdf2image的依赖poppler 以上命令直接报错。 改为手工下载&#xff1a; github: Releases oschwartz10612/poppler-windows GitHub 百度网盘&#xff1a; 百度网盘…

C# Unity 面向对象补全计划 之 [反射]自动处理带有自定义[特性]的类

本文仅作学习笔记与交流&#xff0c;不作任何商业用途&#xff0c;作者能力有限&#xff0c;如有不足还请斧正 有一些插件就是利用本篇的方法做"自动"处理的 目录 1.情景: 2.介绍与举例: 自定义特性API与使用 反射搜索自定义API 3.优化 4.处理带有自定义特性的类…

AI-Deepseek + PPT

01--Deepseek提问 首先去Deepseek问一个问题&#xff1a; Deepseek的回答&#xff1a; 在汽车CAN总线通信中&#xff0c;DBC文件里的信号处理&#xff08;如初始值、系数、偏移&#xff09;主要是为了 将原始二进制数据转换为实际物理值&#xff0c;确保不同电子控制单元&…

SpringMVC控制器定义:@Controller注解详解

文章目录 引言一、Controller注解基础二、RequestMapping与请求映射三、参数绑定与数据校验四、RestController与RESTful API五、控制器建议与全局处理六、控制器测试策略总结 引言 在SpringMVC框架中&#xff0c;控制器(Controller)是整个Web应用的核心组件&#xff0c;负责处…

自然语言处理:文本分类

介绍 大家好&#xff0c;我这个热衷于分享知识的博主又来啦&#xff01;之前我们一起深入探讨了自然语言处理领域中非常重要的两个方法&#xff1a;朴素贝叶斯和逻辑斯谛回归。在探索的过程中&#xff0c;我们剖析了朴素贝叶斯如何基于概率原理和特征条件独立假设&#xff0c;…

鸿蒙通过用户首选项实现数据持久化

鸿蒙通过用户首选项实现数据持久化 1.1 场景介绍 用户首选项为应用提供Key-Value键值型的数据处理能力&#xff0c;支持应用持久化轻量级数据&#xff0c;并对其修改和查询。当用户希望有一个全局唯一存储的地方&#xff0c;可以采用用户首选项来进行存储。Preferences会将该…

单元测试-pytest框架实践

文章目录 1. 单元测试用例目录2. 自动化测试用例编写步骤3. 命名规则4. 环境安装5. pytest语法5.1 unittest与pytest对比5.2 pytest运行插件5.3 fixture5.4 装饰器 6. pytest.ini7. conftest.py8. 用例编写步骤8.1 按照以下方式检查用例 9. 单元测试示例10. 运行11. 覆盖率12. …

嵌入式 ARM Linux 系统构成(1):Bootloader层

目录 一、Bootloader 概述 1.1 核心作用 1.2 典型启动流程 二、ARM Bootloader 架构详解 2.1 多阶段启动设计 2.2 关键代码流程 2.3. Bootloader的加载过程 2.4. Bootloader的加载方式 2.5. Bootloader 的移植 三、常见的Bootloader介绍 3.1. U-Boot 3.2. vivi …

Ubuntu20.04双系统安装及软件安装(九):谷歌浏览器

Ubuntu20.04双系统安装及软件安装&#xff08;九&#xff09;&#xff1a;谷歌浏览器 打开终端&#xff0c;下载谷歌浏览器软件包&#xff1a; wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb下载完成后直接在原终端执行&#xff1a; sudo…