当前位置: 首页 > news >正文

[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 中的坐标系设置控件的位置;

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

相关文章:

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

文章目录 Qt 框架入门与应用开发指南一、Qt 框架概述1.1 什么是 Qt1.2 Qt 的发展史1.3 Qt 支持的平台1.4 Qt 版本1.5 Qt 的优点1.6 Qt 的应用场景1.7 Qt 的成功案例 二、Qt 的开发工具概述Qt CreatorVisual StudioEclipse 三、认识 Qt Creator3.1 Qt Creator 概览3.2 使用 Qt C…...

进程控制 ─── linux第15课

目录 进程控制 1.进程创建 (fork前面讲过了) 写时拷贝 进程终止 进程退出场景 退出码 进程终止方法 进程控制 1.进程创建 (fork前面讲过了) 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父…...

uniapp:小程序将base64图片字符串保存到手机相册

一、需求分析 用户提供的是Base64格式的图片数据&#xff0c;而小程序保存图片到本地通常需要的是临时文件路径。 第一步可能需要将Base64数据转换成临时文件&#xff0c;然后再保存到手机相册。 第二步查阅UniApp的文档&#xff0c;关于保存图片到相册的相关API&#xff0c;…...

宇树科技再落一子!天羿科技落地深圳,加速机器人创世纪

2025年3月5日&#xff0c;机器人行业龙头宇树科技&#xff08;Unitree&#xff09;在深圳再添新动作——全资子公司深圳天羿科技有限公司正式成立。这家注册资本10万元、法定代表人周昌慧的新公司&#xff0c;聚焦智能机器人研发与销售&#xff0c;标志着宇树科技在华南市场的战…...

个推助力小米米家全场景智能生活体验再升级

当AI如同水电煤一般融入日常&#xff0c;万物互联的图景正从想象照进现实。作为智能家居领域的领跑者&#xff0c;小米米家凭借开放的生态战略&#xff0c;已连接了超8.6亿台设备&#xff0c;构建起全球领先的消费级AIoT平台。如今&#xff0c;小米米家携手个推&#xff0c;通过…...

四款GIS工具箱软件解析:满足企业多样化空间数据需求

概述 随着地理信息系统&#xff08;GIS&#xff09;在城市规划、环境监测、资源管理等领域的广泛应用&#xff0c;各种GIS工具箱软件不断涌现&#xff0c;为用户提供了强大的数据处理、空间分析和地图制图功能。本文将为大家介绍4款GIS工具箱软件&#xff0c;这些软件各具特色…...

Deepseek×ComfyUI革命性工作流:AI图像3倍速精修实战指南

一、为什么选择深度优化的AI精修方案&#xff08;H2&#xff09; 核心关键词&#xff1a;AI图像优化工作流、ComfyUI加速方案、Deepseek节点配置 ▸ 传统Stable Diffusion耗时痛点分析&#xff08;渲染时间/显存占用&#xff09; ▸ 深度神经网络的并行计算优势对比&#xff…...

IntelliJ IDEA 2024.3.4 版本无法正常加载maven项目

报错如下&#xff1a; Possible solutions: - Check that Maven settings.xml does not contain http repositories - Check that Maven pom files do not contain http repository http://192.168.22.76:9003/repository/thirdparty/ - Check that Maven pom files do not co…...

为什么过滤器需要一个 Wrapper 来 extends HttpServletRequestWrapper

为什么过滤器需要一个 Wrapper 来 extends HttpServletRequestWrapper 1. HttpServletRequest 不可直接修改2. 能够修改请求参数和请求体3. 方便扩展与重用4. 处理请求参数和请求体5. 避免对原始请求做修改 典型使用场景举个例子总结 在 Java Web 开发中&#xff0c;过滤器&…...

SpaCy处理NLP的详细工作原理及工作原理框图

spaCy处理NLP的详细工作原理及工作原理框图 spaCy处理NLP的详细工作原理 spaCy是一个基于Python的开源自然语言处理&#xff08;NLP&#xff09;库&#xff0c;它提供了一系列高效且易用的工具&#xff0c;用于执行各种NLP任务&#xff0c;如文本预处理、文本解析、命名实体识…...

数学软件Matlab下载|支持Win+Mac网盘资源分享

如大家所了解的&#xff0c;Matlab与Maple、Mathematica并称为三大数学软件。Matlab应用广泛&#xff0c;常被用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人&#xff0c;控制系统等领域。 Matlab将数值分析、矩阵计算、科学…...

OCPP与ISO 15118集成:实现即插即充与车网互动(V2G)- 慧知开源充电桩平台

OCPP与ISO 15118集成&#xff1a;实现即插即充与车网互动&#xff08;V2G&#xff09; 引言 随着电动汽车&#xff08;EV&#xff09;与电网双向能量交互&#xff08;V2G&#xff09;技术的成熟&#xff0c;OCPP协议与ISO 15118标准的协同成为智能充电基础设施的核心挑战。本文…...

【C++设计模式】第七篇:桥接模式(Bridge)

注意&#xff1a;复现代码时&#xff0c;确保 VS2022 使用 C17/20 标准以支持现代特性。 抽象与实现的解耦之道 1. 模式定义与用途​​ 核心思想​ ​桥接模式&#xff1a;将抽象部分与实现部分分离&#xff0c;使二者可以独立变化。​关键用途&#xff1a; ​1.拆分复杂继承…...

【SA8155】AIS Camera流程简述

目录 1 AIS Camera流程之初始化 2 AIS Camera流程之opencamera 3 AIS Camera流程之request处理流程 高通QNX车载系统 + LA虚拟机下Camera框图如下: 高通车载系统中,如上述框图所述,模组驱动在QNX侧,Android侧需要通过HAB Socket通信获取相机的数据。ais_v4l2_proxy将获取…...

容器 /dev/shm 泄漏学习

容器 /dev/shm 泄漏的介绍 在容器环境中&#xff0c;/dev/shm 是一个基于 tmpfs 的共享内存文件系统&#xff0c;通常用于进程间通信&#xff08;IPC&#xff09;和临时数据存储。由于其内存特性&#xff0c;/dev/shm 的大小是有限的&#xff0c;默认情况下 Docker 容器的 /de…...

【Deepseek基础】--3.版本对比

目录 1.Deepseek-v1&#xff1a;起步与编码强劲 2. DeepSeek-V2&#xff1a;性能提升与开源生态 3.DeepSeek-V2.5系列&#xff1a;数学与网络搜索突破 4.DeepSeek-R1-Lite系列&#xff1a;推理模型预览版上线 5. DeepSeek-V3系列&#xff1a;大规模模型与推理速度提升 6…...

一周学会Flask3 Python Web开发-WTForms表单验证

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 我们可以通过WTForms表单类属性的validators属性来实现表单验证。 常用的WTForms验证器 验证器说明DataRequired(messageNo…...

算法题笔记(自用)——Python

目录 一. 进制&位运算&ASCAII 二. format格式化输出 1. 基本用法 2. 位置参数 3. 格式化数字 4. 对齐和填充 5. 格式化二进制、八进制、十六进制 6. 格式化百分比 7. 格式化科学计数法 8. 格式化字符串字面量&#xff08;f-string&#xff09; 三. 字符串 使…...

Fiji图像处理

文章目录 一、Fiji —— 基于 imageJ 的免费且开源的图像处理软件1.1、工具安装&#xff08;免费&#xff09;1.2、源码下载&#xff08;免费&#xff09; 二、功能详解2.0、Fiji - ImageJ&#xff08;Web应用程序&#xff09;2.1、常用功能&#xff08;汇总&#xff09;2.2、F…...

【数据结构】堆和priority_queue

堆的定义 堆是什么&#xff1f;实际上堆是一种特殊的&#xff08;受限制的&#xff09;完全二叉树&#xff0c;它在完全二叉树的基础上要求每一个节点都要大于等于或者小于等于它的子树的所有节点。这个大于小于体现在节点的值或者权重。 如图所示&#xff1a; 根节点大于等于…...

Vue的简单入门 三

目录 侦听器 watch 注意 表单输入绑定 v-model v-model修饰符​编辑 lazy number Trim 模板引用 组件组成 组件引用三步走 组件的嵌套关系 header Main Aside Aritice Item App.vue组件引入三个子组件 组件的注册方式 全局注册组件的方法 (1) Vue 2 语…...

kotlin的val声明的变量是常量吗

kotlin的val声明的变量是常量吗 DeepSeek R1 思考 65 秒 思考过程 嗯&#xff0c;用户问的是Kotlin中的val声明的变量是不是常量。首先我需要回忆一下Kotlin的基础知识。记得在Kotlin里&#xff0c;val用来声明只读变量&#xff0c;也就是说一旦赋值之后就不能再重新赋值了。…...

C# | 委托 | 事件 | 异步

委托&#xff08;Delegate&#xff09;和事件&#xff08;Event&#xff09; 在C#和C中&#xff0c;委托&#xff08;Delegate&#xff09;与事件&#xff08;Event&#xff09;以及函数对象&#xff08;Function Object&#xff09;是实现回调机制或传递行为的重要工具。虽然…...

算法日记33:14届蓝桥C++B冶炼金属(二分答案)

一、题目&#xff1a; 二、题解&#xff1a; 1、思路解析&#xff1a; 1&#xff09;首先我们可以发现题目的样例数量为&#xff08; n < 1000 n<1000 n<1000&#xff09;&#xff0c;因此我们可以考虑 O ( n ∗ l o g n ) O(n*log^n) O(n∗logn)时间复杂度的算法 …...

【YOLO V5】目标检测 WSL2 AutoDL VScode SSH

【YOLO V5】目标检测 WSL2 AutoDL VScode SSH 前言整体思路理解向YOLO 目标检测完整流程 环境配置Anaconda 获取 YOLO 代码与预训练模型下载 YOLOv5 代码和预训练模型配置 YOLOV5 工程环境解压 YOLOv5 源代码 并 添加预训练模型调整依赖版本选择对应的 Python 解释器 数据集准备…...

前端基础之ajax

vue-cli配置代理服务器解决跨域问题 我们可以使用一个代理服务器8080&#xff0c;Vue项目8080发送请求向代理服务器8080发送请求&#xff0c;再由在理服务器转发给后端服务器 首先需要在vue.config.js中配置代理服务器 const { defineConfig } require(vue/cli-service) modul…...

vscode离线配置远程服务器

目录 一、前提 二、方法 2.1 查看vscode的commit_id 2.2 下载linux服务器安装包 2.3 安装包上传到远程服务器&#xff0c;并进行文件解压缩 三、常见错误 Failed to set up socket for dynamic port forward to remote port&#xff08;vscode报错解决方法&#xff09;-C…...

C语言——string.h下的特殊库函数

string.h下的特殊函数 strtok(分割字符串&#xff09;strerror(错误码信息&#xff09;memcpy(拷贝&#xff09;memmove(拷贝&#xff09;memset(设置内存&#xff09;memcmp(比较大小&#xff09; strtok(分割字符串&#xff09; char * strtok ( char * str, const char * s…...

烟花燃放安全管控:智能分析网关V4烟火检测技术保障安全

一、方案背景 在中国诸多传统节日的缤纷画卷中&#xff0c;烟花盛放、烧纸祭祀承载着人们的深厚情感。一方面&#xff0c;烟花璀璨&#xff0c;是对节日欢庆氛围的热烈烘托&#xff0c;寄托着大家对美好生活的向往与期许&#xff1b;另一方面&#xff0c;袅袅青烟、点点烛光&a…...

【一个月备战蓝桥算法】递归与递推

字典序 在刷题和计算机科学领域&#xff0c;字典序&#xff08;Lexicographical order&#xff09;也称为词典序、字典顺序、字母序&#xff0c;是一种对序列元素进行排序的方式&#xff0c;它模仿了字典中单词的排序规则。下面从不同的数据类型来详细解释字典序&#xff1a; …...

二、Java-封装playwright UI自动化(根据官网执行步骤,首先封装BrowserFactory枚举类及BrowserManager)

前言 查看playwright官网&#xff0c;api文档了解到&#xff0c;playwright的基本步骤&#xff1a; 1、实例化一个playwright 2、启动一个浏览器类型 3、打开一个页面 所以&#xff0c;在封装时需要有一个浏览器工厂类&#xff0c;定义不同的浏览器类型&#xff0c;在配置文…...

java项目之基于ssm的在线视频网站开发(源码+文档)

项目简介 基于ssm的在线视频网站开发实现了以下功能&#xff1a; 该系统的目标用户包括管理员&#xff0c;用户。管理员上传视频&#xff0c;管理视频&#xff0c;查看视频留言&#xff0c;回复视频留言&#xff0c;管理视频收藏信息&#xff0c;管理公告&#xff0c;管理用户…...

观察者模式的C++实现示例

核心思想 观察者模式是一种行为型设计模式&#xff0c;定义了对象之间的一对多依赖关系。当一个对象&#xff08;称为Subject&#xff0c;主题&#xff09;的状态发生改变时&#xff0c;所有依赖于它的对象&#xff08;称为Observer&#xff0c;观察者&#xff09;都会自动收到…...

c语言中的主要知识点

一、基础语法与结构 程序结构 包含顺序结构、选择结构&#xff08;if/switch&#xff09;、循环结构&#xff08;for/while/do-while&#xff09;。 程序必须包含且仅有一个main函数作为入口。 数据类型与变量 基本类型&#xff1a;整型&#xff08;int、long&#xff09;、浮…...

Pytorch构建LeNet进行MNIST识别 #自用

LeNet是一种经典的卷积神经网络&#xff08;CNN&#xff09;结构&#xff0c;由Yann LeCun等人在1998年提出&#xff0c;主要用于手写数字识别&#xff08;如MNIST数据集&#xff09;。作为最早的实用化卷积神经网络&#xff0c;LeNet为现代深度学习模型奠定了基础&#xff0c;…...

docker:Dockerfile案例之自定义centos7镜像

1 案例需求 自定义centos7镜像。要求&#xff1a; 默认登录路径为 /usr可以使用vim 2 实施步骤 编写dockerfile脚本 vim centos_dockerfile 内容如下&#xff1a; #定义父镜像 FROM centos:7#定义作者信息 MAINTAINER handsome <handsomehandsome.com># 设置阿里云…...

post get 给后端传参数

post 方式一 &#xff1a; data: params 作为请求体&#xff08;Request Body&#xff09;传递&#xff1a; 你已经展示了这种方式&#xff0c;通过data字段直接传递一个对象或数组。这种方式通常用于传递复杂的数据结构。dowmfrom: function (params) { return request({ u…...

Linux 系统不同分类的操作命令区别

Linux 系统有多种发行版,每种发行版都有其独特的操作命令和工具。以下是一些常见的分类及其操作命令的区别: 1. 基于 Red Hat 的发行版 (RHEL, CentOS, Fedora) 1.1 包管理 安装软件包: bash复制 sudo yum install <package> 更新软件包: bash复制 sudo yum update…...

Checkpoint 模型与Stable Diffusion XL(SDXL)模型的区别

Checkpoint 模型与 Stable Diffusion XL&#xff08;SDXL&#xff09;模型 在功能、架构和应用场景上有显著区别&#xff0c;以下是主要差异的总结&#xff1a; 1. 基础架构与定位 Checkpoint 模型 是基于 Stable Diffusion 官方基础模型&#xff08;如 SD 1.4/1.5&#xff09;…...

软件工程与实践(第4版 新形态) 练习与实践1

软件工程与实践&#xff08;第4版 新形态&#xff09; 练习与实践1 1.填空题 (1)程序&#xff0c;文档 (2)系统软件&#xff0c;支撑软件&#xff0c;应用软件 (3)系统方法 (4)软件开发和维护 (5)工程的概念、原理、技术和方法 (6)实现软件的优质高产 (7)软件开发技术和…...

探秘基带算法:从原理到5G时代的通信变革【九】QPSK调制/解调

文章目录 2.8 QPSK 调制 / 解调简介QPSK 发射机的实现与原理QPSK 接收机的实现与原理QPSK 性能仿真QPSK 变体分析 本博客为系列博客&#xff0c;主要讲解各基带算法的原理与应用&#xff0c;包括&#xff1a;viterbi解码、Turbo编解码、Polar编解码、CORDIC算法、CRC校验、FFT/…...

侯捷 C++ 课程学习笔记:深入理解智能指针

文章目录 每日一句正能量一、引言二、智能指针的核心概念&#xff08;一&#xff09;std::unique_ptr&#xff08;二&#xff09;std::shared_ptr&#xff08;三&#xff09;std::weak_ptr 三、学习心得四、实际应用案例五、总结 每日一句正能量 如果说幸福是一个悖论&#xff…...

基于Qwen-VL的手机智能体开发

先上Demo&#xff1a; vl_agent_demo 代码如下&#xff1a; 0 设置工作目录&#xff1a; 你的工作目录需要如下&#xff1a; 其中utils文件夹和qwenvl_agent.py均参考自 GitHub - QwenLM/Qwen2.5-VL: Qwen2.5-VL is the multimodal large language model series developed by …...

系统盘还原成正常U盘

选择格式化,等格式化完毕就完了 点击还原设备的默认值格式化就完了...

Leetcode 103: 二叉树的锯齿形层序遍历

Leetcode 103: 二叉树的锯齿形层序遍历 问题描述&#xff1a; 给定一个二叉树&#xff0c;返回其节点值的锯齿形层序遍历&#xff08;即第一层从左到右&#xff0c;第二层从右到左&#xff0c;第三层从左到右&#xff0c;依此类推&#xff09;。 适合面试的解法&#xff1a;广…...

FastGPT 引申:基于 Python 版本实现 Java 版本 RRF

文章目录 FastGPT 引申&#xff1a;基于 Python 版本实现 Java 版本 RRF函数定义使用示例 FastGPT 引申&#xff1a;基于 Python 版本实现 Java 版本 RRF 函数定义 使用 Java 实现 RRF 相关的两个函数&#xff1a;合并结果、过滤结果 import java.util.*;// 搜索结果类型定义…...

C++中的无锁编程

引言 在当今多核处理器普及的时代&#xff0c;并发编程已成为高性能应用程序开发的关键技术。传统的基于锁的同步机制虽然使用简单&#xff0c;但往往会带来性能瓶颈和死锁风险。无锁编程&#xff08;Lock-Free Programming&#xff09;作为一种先进的并发编程范式&#xff0c…...

【全栈开发】---- 一文掌握 Websocket 原理,并用 Django 框架实现

目录 介绍 底层原理 握手环节详解&#xff1a; 收发数据&#xff08;加密&#xff09; Django 中配置 channels 1、注册 channels 2、在 settings.py 中添加 asgi_application 3、修改 asgi.py 文件 4、routing 5、consumers 实现 聊天室 介绍 WebSocket是一种先进的通信协议&…...

游戏引擎学习第135天

仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾 game_asset.cpp 的创建 在开发过程中&#xff0c;不使用任何现成的游戏引擎或第三方库&#xff0c;而是直接基于 Windows 进行开发&#xff0c;因为 Windows 目前仍然是游戏的标准平台&#xff0c;因此首先在这个环境中进行…...

国内支持Stable Diffusion模型的平台

国内支持Stable Diffusion模型的平台 截至2025年3月&#xff0c;国内支持SD模型的平台主要包括以下六类&#xff0c;覆盖不同用户需求和技术层级&#xff1a; 一、模型分享与下载平台 Liblib.ai 描述&#xff1a;国内最大SD原创模型社区&#xff0c;提供海量基础模型、Lora…...