[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.mzph.cn/pingmian/71558.shtml

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

相关文章

BetaFlight源码解读01

1.打开main.c init();run(); void systemInit(void) {int ret;clock_gettime(CLOCK_MONOTONIC, &start_time);printf("[system]Init...\n");SystemCoreClock 500 * 1e6; // virtual 500MHzif (pthread_mutex_init(&updateLock, NULL) ! 0) {printf("Cr…

豆包大模型 MarsCode AI 刷题专栏 001

001.找单独的数 难度&#xff1a;易 问题描述 在一个班级中&#xff0c;每位同学都拿到了一张卡片&#xff0c;上面有一个整数。有趣的是&#xff0c;除了一个数字之外&#xff0c;所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上…

Spring Boot 消息队列(以RabbitMQ为例)

文章目录 RabbitMQ 简介与安装1. RabbitMQ 简介2. RabbitMQ 安装 Spring Boot 集成 RabbitMQ1. 创建 Spring Boot 项目2. 配置 RabbitMQ3. 定义消息队列和交换机4. 发送消息5. 接收消息6. 测试消息发送和接收 RabbitMQ 简介与安装 1. RabbitMQ 简介 RabbitMQ 是一个开源的消息…

C++ Boost库中Chrono时间模块的基本使用

以下是关于 Boost Chrono 库的常见操作及使用示例&#xff1a; 1. 基本概念 Boost Chrono 提供时间相关的工具&#xff0c;包括&#xff1a; 时钟&#xff08;Clocks&#xff09;&#xff1a;系统时钟、高精度时钟等。时间点&#xff08;Time Points&#xff09;&#xff1a;…

高效便捷的 Spring Boot 通用控制器框架

✨高效便捷的 Spring Boot 通用控制器框架✨ 一、简介 在 Java 开发中&#xff0c;重复性的基础接口编写工作常令人头疼。本框架基于 Spring Boot 与 MyBatis-Plus&#xff0c;精心构建通用控制器类BaseController&#xff0c;旨在为开发者排忧解难&#xff0c;极大减少繁琐的…

【蓝桥杯集训·每日一题2025】 AcWing 5539. 牛奶交换 python

AcWing 5539. 牛奶交换 Week 3 3月6日 题目描述 农夫约翰的 N N N 头奶牛排成一圈&#xff0c;使得对于 1 , 2 , … , N − 1 1,2,…,N−1 1,2,…,N−1 中的每个 i i i&#xff0c;奶牛 i i i 右边的奶牛是奶牛 i 1 i1 i1&#xff0c;而奶牛 N N N 右边的奶牛是奶牛 …

MacOS Big Sur 11 新机安装brew wget python3.12 exo

MacOS Big Sur 11,算是很老的系统了&#xff0c;所以装起来有点费劲。 首先安装brew 按照官网的方法&#xff0c;直接执行下面语句即可安装&#xff1a; export HOMEBREW_BREW_GIT_REMOTE"https://githubfast.com" # put your Git mirror of Homebrew/brew here …

【四.RAG技术与应用】【12.阿里云百炼应用(下):RAG的云端优化与扩展】

在上一篇文章中,我们聊了如何通过阿里云百炼平台快速搭建一个RAG(检索增强生成)应用,实现文档智能问答、知识库管理等基础能力。今天咱们继续深入,聚焦两个核心问题:如何通过云端技术优化RAG的效果,以及如何扩展RAG的应用边界。文章会穿插实战案例,手把手带你踩坑避雷。…

thingsboard edge 在windows 环境下的配置

按照官方文档&#xff1a;Installing ThingsBoard Edge on Windows | ThingsBoard Edge&#xff0c;配置好java环境和PostgreSQL。 下载对应的windows 环境下的tb-edge安装包。下载附件 接下来操作具体如下 步骤1&#xff0c;需要先在thingsboard 服务上开启edge 权限 步骤2…

vue实现一个pdf在线预览,pdf选择文本并提取复制文字触发弹窗效果

[TOC] 一、文件预览 1、安装依赖包 这里安装了disjs-dist2.16版本&#xff0c;安装过程中报错缺少worker-loader npm i pdfjs-dist2.16.105 worker-loader3.0.8 2、模板部分 <template><div id"pdf-view"><canvas v-for"page in pdfPages&qu…

vue3页面html导出word文档

一、第三方包下载 使用npm下载以下插件&#xff1a; npm install jszip-utils docxtemplater pizzip file-saver docxtemplater-image-module-free 二、总页面组件代码 <template> <summaryDetails :securityId"securityId" :symbol"symbol" …

基于 STC89C52 的 8x8 点阵显示数字

一、引言 在电子设计领域,信息的有效展示是众多项目的关键环节。8x8 点阵作为一种经济且实用的显示模块,能够呈现数字、简单字母及图形等信息,在电子时钟、简易游戏机等产品中广泛应用。STC89C52 单片机凭借其低成本、丰富的 I/O 资源与稳定的性能,成为驱动 8x8 点阵的理想…

MWC 2025|紫光展锐联手美格智能发布5G通信模组SRM812

在2025年世界移动通信大会&#xff08;MWC 2025&#xff09;期间&#xff0c;紫光展锐携手美格智能正式推出了基于紫光展锐V620平台的第二代5G Sub6G R16模组SRM812&#xff0c;以超高性价比方案&#xff0c;全面赋能合作伙伴&#xff0c;加速5G规模化应用在各垂直领域的全面落…

leetcode700-二叉搜索树中的搜索

leetcode 700 思路 我们需要先了解一下二叉搜索树的特性&#xff1a; 左子树的所有节点值 < 当前节点的值。右子树的所有节点值 > 当前节点的值。这个特性适用于树中的每个节点 那么根据这个特性&#xff0c;我们可以通过根节点的值和目标值的大小来判断后序的走向&…

算法之二维装水问题

目录 1. 题目2. 解释3. 思路4. 代码5. 总结 1. 题目 给定一个数组arr&#xff0c;已知其中所有的值都是非负的&#xff0c;将这个数组看作一个容器&#xff0c;请返回容器能装多少水 比如&#xff0c;arr {3&#xff0c;1&#xff0c;2&#xff0c;5&#xff0c;2&#xff0c…

SAP FI财务凭证冲销

冲销调用FUNCTION FI_REFERENCE_CREATE实现 主要参数&#xff1a;冲销凭证&#xff0c;会计年度&#xff0c;公司代码。冲销原因&#xff0c;本期冲销还是上期冲销期间的选择。 FUNCTION ZFIFM_XXXX. *"---------------------------------------------------------------…

【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-附录D-JavaScript 工具

附录D、JavaScript 工具 JavaScript 工具 编写 JavaScript 代码与编写其他编程语言代码类似&#xff0c;都有专门的工具帮助提高开发效率。JavaScript开发者可以使用的工具一直在增加&#xff0c;这些工具可以帮助开发者更容易定位问题、优化代码和部署上线。其中有些工具是在 …

【AI学习从零至壹】Pytorch逻辑回归

Pytorch逻辑回归 线性回归简单线性回归的参数估计概率和似然的区别 最⼤似然估计似然函数对数似然函数 逻辑回归梯度下降法下⼭问题梯度与学习率学习率 梯度下降法的模拟与可视化学习率对梯度的影响学习率的最佳取值 梯度更新逻辑回归模型构建及训练流程 线性回归 线性回归的⽬…

mybatisplus 开发流程

目录 什么是mybatisplus&#xff1f; 创建项目 先创建一个简单的Java项目​编辑 引入依赖 1.引入父依赖 2.引入其他依赖 springboot配置 application.yml qppication-dev.yml 创建包 实体类 映射&#xff08;创建一个接口&#xff09; 构建测试环境 进行方法的实…

使用 uniapp 开发标准体重计算小程序

引言 在现代生活中&#xff0c;健康管理越来越受到重视&#xff0c;而体重是衡量健康状况的重要指标之一。为了方便用户快速计算自己的标准体重并了解体重状态&#xff0c;我使用 uniapp 开发了一款简单的标准体重计算小程序。本文将详细介绍开发过程&#xff0c;并分享核心代…