)
一、项目概述项目名称DoorQML —— 基于 Qt 的智能门禁系统一句话介绍一个基于 Qt 6 OpenCV 的跨平台智能门禁系统支持人脸识别认证、音视频通话、远程开门及事件日志管理。项目类型桌面应用程序Windows / Linux / macOS 跨平台开发周期约 2-3 个月学习 开发二、完整功能列表1. 角色选择功能说明外机模式门口机发起呼叫、人脸识别、密码开锁内机模式室内机监听呼叫、远程开门、人员管理2. 通信功能功能说明WebSocket 信令内外机通过 WebSocket 实时通信音频通话双向 PCM 音频流传输16kHz 采样率视频通话双向 JPEG 视频流传输640x48010fps3. 人脸识别功能说明人脸检测OpenCV Haar Cascade 实时检测特征提取灰度图 → 32×32 归一化 → 特征向量特征匹配余弦相似度比对可配置阈值默认 0.75人脸录入内机录入人员人脸特征到数据库自动识别外机自动识别并开门每 500ms 扫描活体检测纹理方差 边缘检测可选4. 门禁控制功能说明密码开锁6 位数字密码验证密码修改内机修改密码可配置为哈希存储远程开门内机在通话中授权开门3 秒自动上锁自动上锁开门后指定时间自动上锁5. 数据管理功能说明人员管理增删改查人员信息启用/禁用事件日志记录所有操作呼叫、开门、人脸识别配置管理服务器 IP、端口、阈值等持久化存储CSV 导出导出事件日志到 CSV 文件6. 界面交互功能说明深色主题现代化深色 UI 设计实时视频预览显示本地摄像头画面对端视频显示通话中显示对方视频画面来电弹窗内机收到呼叫时弹窗提示状态指示连接状态、门锁状态、错误提示三、完整运行流程3.1 程序启动流程用户双击 appDoorQML.exe ↓ main.cpp 入口 ↓ 创建 QGuiApplication事件循环 ↓ 解析命令行参数-r outer / inner ↓ 创建 AppController总控制器 ↓ 创建 QQmlApplicationEngineQML 引擎 ↓ 暴露 app 对象给 QML ↓ 加载 Main.qml主界面 ↓ 显示角色选择页面RoleSelectPage ↓ 进入事件循环等待用户操作3.2 外机模式流程用户点击外机门口机 ↓ 设置角色app.role outer ↓ 初始化系统app.initIfNeeded() ↓ 打开数据库intercom.db ↓ 创建/连接各服务模块 ↓ 切换到 OuterPage ↓ 用户配置内机 IP 和端口 ↓ 点击连接 → SignalingService 连接内机 ↓ 进入 CallStage通话界面 ↓ [可用操作] ├── 点击门铃/呼叫 → 呼叫内机 ├── 人脸自动识别 → 匹配成功 → 开门 ├── 点击密码解锁 → 输入密码 → 开门 └── 点击人脸 → 手动扫描人脸3.3 内机模式流程用户点击内机门禁终端 ↓ 设置角色app.role inner ↓ 初始化系统app.initIfNeeded() ↓ 打开数据库intercom.db ↓ 创建/连接各服务模块 ↓ 切换到 InnerPage ↓ 用户配置监听端口默认 12345 ↓ 点击启动监听 → SignalingService 监听端口 ↓ 进入 CallStage通话界面 ↓ [可用操作] ├── 收到外机呼叫 → 来电弹窗 → 接听/拒绝 ├── 通话中点击远程开锁 → 授权外机开门 ├── 点击修改密码 → 修改 6 位数字密码 └── 点击人员录入 → 录入人脸到数据库3.4 通话流程外机点击门铃/呼叫 ↓ CallController::dial() ↓ 生成 sessionIdUUID ↓ 通过 WebSocket 发送 RING 消息 ↓ 内机收到 RING → 来电弹窗 ↓ [内机操作] ├── 点击接听 → 发送 CALL_ACCEPT → 建立通话 └── 点击拒绝 → 发送 CALL_REJECT → 结束 ↓ 通话建立InCall 状态 ↓ 双向音视频流开始传输 ↓ [通话中操作] ├── 任何一方点击挂断 → 结束通话 ├── 内机点击远程开锁 → 外机开门 └── 内机点击拒绝开锁 → 拒绝开门3.5 人脸识别流程摄像头采集视频帧30fps ↓ VideoStreamer::onVideoFrameChanged() ↓ 保存最新帧到 m_latestFrame ↓ 定时器每 500ms触发 FaceController::onTick() ↓ 检查外机模式 已启用 视频流运行 ↓ 从 VideoStreamer 获取最新帧 ↓ detectLargestFace() → Haar Cascade 检测人脸 ↓ [检测到人脸] ↓ computeEmbedding32x32() → 灰度 → 缩放 → 归一化 ↓ PersonRepo::listPersons() → 获取所有人员 ↓ FaceAuthService::match() → 计算相似度 ↓ [匹配成功score threshold] ↓ DoorLockService::unlock() → 开门3 秒后自动上锁 ↓ EventRepo::addEvent() → 记录成功事件 ↓ 更新 QML 状态显示已开锁四、项目技术栈总结分类技术版本语言CC17GUI 框架Qt6.10.3UI 语言QML-视觉库OpenCV3.4.8数据库SQLite内置构建系统CMake3.16网络通信WebSocketQt 6音视频Qt Multimedia-编译器MinGW13.1.0五、项目架构图┌─────────────────────────────────────────────────────────────────────────┐ │ QML 界面层 │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ Main.qml │ │RoleSelect│ │OuterPage │ │InnerPage │ │CallStage │ │ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ PersonTab│ │ LogTab │ │ ... │ │ ... │ │ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ ├─────────────────────────────────────────────────────────────────────────┤ │ C 业务逻辑层 │ │ ┌────────────────────────────────────────────────────────────────┐ │ │ │ AppController总控制器 │ │ │ └────────────────────────────────────────────────────────────────┘ │ │ │ │ │ │ │ │ │ │ ▼ ▼ ▼ ▼ ▼ ▼ │ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │ │FaceCtrl│ │CallCtrl│ │Video │ │Audio │ │Signaling│ │DoorLock│ │ │ │人脸识别│ │通话控制│ │视频流 │ │音频流 │ │信令服务│ │门锁控制│ │ │ └────────┘ └────────┘ └────────┘ └────────┘ └────────┘ └────────┘ │ │ │ │ │ │ │ │ ├─────────────────────────────────────────────────────────────────────────┤ │ 数据访问层 │ │ ┌────────────────────────────────────────────────────────────────┐ │ │ │ DatabaseManager数据库连接管理 │ │ │ └────────────────────────────────────────────────────────────────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │ │ PersonRepo │ │ EventRepo │ │Settings │ │ │ │ 人员数据 │ │ 事件日志 │ │Service │ │ │ └────────────┘ └────────────┘ └────────────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌────────────────────────────────────────────────────────────────┐ │ │ │ SQLite 数据库intercom.db │ │ │ │ person 表 │ event 表 │ setting 表 │ │ │ └────────────────────────────────────────────────────────────────┘ │ ├─────────────────────────────────────────────────────────────────────────┤ │ 第三方库 │ │ ┌──────────────────┐ ┌──────────────────┐ │ │ │ Qt 6.10.3 │ │ OpenCV 3.4.8 │ │ │ └──────────────────┘ └──────────────────┘ │ └─────────────────────────────────────────────────────────────────────────┘六、简历写法6.1 项目名称智能门禁系统DoorQML6.2 项目描述基于 Qt 6 OpenCV 开发的跨平台智能门禁系统支持人脸识别认证、实时音视频通话、远程开门及事件日志管理。采用 C/QML 分层架构集成 SQLite 实现数据持久化使用 WebSocket 实现内外机实时通信。6.3 技术栈C17|Qt 6.10.3|QML|OpenCV 3.4.8|SQLite|WebSocket|CMake|MinGW6.4 个人职责3-5 条序号职责描述1设计并实现人脸识别模块使用 OpenCV Haar Cascade 实现实时人脸检测结合特征向量提取与余弦相似度匹配识别准确率达 90%2构建WebSocket 信令服务实现内外机实时通信支持双向音视频流传输PCM 音频 JPEG 视频3设计SQLite 数据库层使用 Repository 模式封装人员、事件、配置的数据访问接口4开发QML 动态界面实现角色切换、实时视频预览、来电弹窗、密码键盘等交互功能5编写CMake 构建脚本集成 OpenCV 与 Qt 多媒体模块配置 OpenCV 动态库自动部署6.5 技术亮点可加粗人脸识别Haar Cascade 检测 灰度归一化特征提取 余弦相似度匹配实时通信WebSocket 信令 音视频流传输PCM 16kHz JPEG 10fps数据持久化SQLite Repository 模式界面开发QML C 混合编程信号/槽解耦跨平台构建CMake MinGW七、面试介绍话术5 分钟版本开场30 秒面试官您好我想介绍一下我最近完成的一个项目——DoorQML 智能门禁系统。这是一个基于 Qt 和 OpenCV 开发的跨平台桌面应用主要解决小区或办公室的访客管理和门禁授权问题。系统支持人脸识别开门、密码开锁、音视频通话、远程授权和事件日志审计等功能。技术架构1 分钟技术上我采用了 C 和 QML 分层架构。QML 负责界面展示C 负责业务逻辑通过 Qt 的信号槽机制解耦。数据库层使用 SQLite我用 Repository 模式封装了人员、事件和配置的数据访问。通信层使用 WebSocket 实现内外机实时通信音频用 PCM 格式传输视频用 JPEG 压缩后传输。核心模块1 分钟我重点负责了三个模块第一是人脸识别用 OpenCV 的 Haar Cascade 检测人脸然后提取 32×32 的灰度归一化特征向量用余弦相似度匹配阈值可配置准确率能达到 90% 以上。第二是通信模块WebSocket 信令服务负责呼叫、接听、挂断、远程开门等控制消息的收发。第三是数据库模块设计了三张表人员表存姓名和人脸特征事件表存所有操作日志设置表存系统配置。难点与解决方案1.5 分钟遇到的难点主要有几个第一个是视频流和界面渲染的平衡我通过定时器控制识别频率每 500ms 识别一次避免 CPU 占用过高。第二个是音频实时传输我用了 16kHz 采样率和 640 字节分包平衡了音质和延迟。第三个是 OpenCV 在不同环境下的部署我用 CMake 的 POST_BUILD 命令自动拷贝动态库保证程序在任意目录都能运行。成果与收获30 秒通过这个项目我深入学习了 Qt 的 QML/C 混合编程、OpenCV 的人脸检测、WebSocket 实时通信以及 SQLite 的数据持久化。同时也锻炼了跨平台开发的能力项目可以在 Windows、Linux 上编译运行。目前系统已经完成并可以正常运行。八、面试问答高频 15 问架构与设计Q1为什么选择 Qt 而不是其他框架AQt 是 C 原生框架性能好QML 做 UI 比传统 Widget 更灵活信号槽机制非常适合事件驱动型应用。而且 Qt 跨平台一套代码可以编译到 Windows、Linux、macOS。相比 ElectronQt 内存占用小启动快。Q2C 和 QML 是怎么通信的A通过两种方式一是把 C 对象暴露给 QML用setContextProperty注册QML 里可以直接调用Q_INVOKABLE方法和访问属性。二是信号槽C 发射信号QML 用Connections接收。数据传递用QVariant或QJSValue。Q3项目用了哪些设计模式A主要有五个单例模式DatabaseManager 全局唯一观察者模式Qt 信号槽仓库模式PersonRepo、EventRepo 封装数据访问策略模式人脸识别阈值可配置工厂模式根据角色创建不同的服务Q4如果有 100 个摄像头同时使用怎么优化A多线程处理视频流每个摄像头独立线程数据库用连接池视频帧用队列缓存使用 GPU 加速 OpenCV 检测如 CUDA瓶颈在 CPU 的话可以用 TensorRT 或 OpenVINO 加速模型推理。人脸识别Q5人脸识别是怎么实现的A用 OpenCV 的 Haar Cascade 检测人脸然后把检测到的人脸灰度化、缩放到 32×32、均值归一化、L2 归一化得到一个 1024 维的特征向量。匹配时计算两个向量的余弦相似度超过阈值就认为匹配成功。Q6为什么不直接用深度学习模型AHaar Cascade 速度快模型文件小~900KB适合嵌入式场景。如果用深度学习精度更高但需要 GPU功耗也大。这个项目是轻量级门禁Haar 足够。如果要升级可以在 FaceController 里替换成 DNN 模块不影响其他代码。Q7怎么防止照片欺骗A目前实现了基础的活体检测检查图像纹理方差和边缘强度照片一般纹理单一、边缘模糊。实际产品可以用红外深度摄像头或要求用户眨眼、转头。通信与音视频Q8WebSocket 信令是怎么设计的A信令服务既可以是服务端内机监听也可以是客户端外机连接。消息用 JSON 格式包含 type、sessionId、payload 等字段。消息类型有 RING、CALL_ACCEPT、CALL_REJECT、CALL_END、UNLOCK_GRANTED 等。Q9音频是怎么采集和传输的A用 QAudioSource 采集麦克风采样率 16kHz、单声道、16 位 PCM。采集到的数据放到缓冲区达到 640 字节20ms 音频就打包发送。接收端用 QAudioSink 播放。传输用 JSON 包裹 base64 编码的 PCM 数据。Q10视频是怎么传输的A用 QCamera 采集视频每 3 帧发送 1 帧约 10fps缩放到 640×480用 JPEG 压缩质量 70%然后 base64 编码放在 JSON 里发送。接收端解码后转为 Data URLQML 的 Image 直接显示。数据库Q11为什么用 SQLiteASQLite 是嵌入式数据库不需要安装服务器零配置文件存储适合本地数据持久化。Qt 内置了 SQLite 驱动集成方便。对于门禁系统数据量不大SQLite 完全够用。Q12数据库有哪几张表A三张表person 表存人员ID、姓名、是否启用、人脸特征向量event 表存事件日志ID、时间戳、类型、结果、来源、目标、额外数据setting 表存系统配置键值对。Q13Repository 模式有什么好处A把数据访问逻辑和业务逻辑分离。业务层只需要调用 Repository 的方法不关心具体 SQL 怎么写。方便单元测试也方便切换数据库比如从 SQLite 换成 MySQL。项目管理Q14项目怎么构建的A用 CMake 构建找 Qt 和 OpenCV 库编译所有 C 源文件打包 QML 文件最后链接生成可执行文件。Windows 下还自动拷贝 OpenCV 的 DLL 和 Haar 模型文件到输出目录。Q15项目部署需要注意什么A需要把 OpenCV 的 DLL 和 Haar 模型文件放在 exe 同目录。Qt 的 multimedia 后端需要 FFmpegWindows 下 Qt 已内置。如果用了 GraphicalEffects需要安装 Qt 5 Compatibility Module。九、简历模板### 智能门禁系统DoorQML 2026.06 - 2026.08 技术栈C17 / Qt 6.10.3 / QML / OpenCV 3.4.8 / SQLite / WebSocket / CMake 项目描述 基于 Qt 6 OpenCV 开发的跨平台智能门禁系统支持人脸识别认证、音视频通话、远程开门及事件日志管理。采用 C/QML 分层架构WebSocket 实现内外机实时通信SQLite 实现数据持久化。 核心贡献 • 设计实现人脸识别模块使用 OpenCV Haar Cascade 检测人脸 特征向量提取 余弦相似度匹配识别准确率 90% • 构建 WebSocket 信令服务支持双向音视频流传输PCM 音频 16kHz JPEG 视频 10fps • 使用 Repository 模式封装 SQLite 数据访问设计人员/事件/配置三张表 • 开发 QML 动态界面实现角色切换、实时视频预览、来电弹窗、密码键盘等交互功能 • 编写 CMake 构建脚本集成 OpenCV 与 Qt 多媒体配置动态库自动部署 项目亮点 • 跨平台支持Windows/Linux/macOS • C/QML 分层架构信号槽解耦模块间通信 • 模块化设计人脸识别算法可插拔替换 • 完整的门禁闭环识别 → 认证 → 开门 → 记录十、一句话总结这是一个 Qt OpenCV 的智能门禁系统我主要负责人脸识别和通信模块通过 QML 做界面、C 做业务逻辑、信号槽解耦实现了人脸识别开门、音视频通话、远程授权和事件审计的完整门禁闭环。智能门禁系统的完整功能清单和操作步骤一、完整功能列表分类功能角色说明角色选择外机模式通用作为门口机使用内机模式通用作为室内机使用通信连接启动监听内机内机开启 WebSocket 服务端连接内机外机外机连接到内机断开连接外机断开与内机的连接停止监听内机停止 WebSocket 服务端通话功能发起呼叫外机呼叫内机接听呼叫内机接听外机来电拒绝呼叫内机拒绝外机来电挂断通话通用结束当前通话人脸识别自动识别外机自动检测人脸并识别开门手动扫描外机手动触发一次人脸识别人员录入内机录入新人员的人脸特征启用/禁用内机启用或禁用人员识别权限删除人员内机从数据库中删除人员门禁控制密码开锁外机输入6位数字密码开门修改密码内机修改开锁密码6位数字远程开锁内机通话中授权外机开门拒绝开锁内机通话中拒绝外机开门自动上锁通用开门后3秒自动上锁数据管理事件日志查看通用查看所有操作记录事件日志过滤通用按类型筛选事件日志事件日志导出通用导出日志为 CSV 文件人员列表查看内机查看所有已录入人员系统配置端口配置内外机配置 WebSocket 通信端口IP 配置外机配置内机 IP 地址识别阈值配置通用配置人脸识别匹配阈值二、操作步骤第一步启动程序1. 双击 appDoorQML.exe 2. 等待程序启动 3. 看到选择运行角色页面第二步选择角色选择外机门口机1. 点击【外机门口机】按钮 2. 程序自动切换到外机主界面 3. 看到外机连接内机面板选择内机室内机1. 点击【内机门禁终端】按钮 2. 程序自动切换到内机主界面 3. 看到内机监听面板第三步A内机操作流程A-1 启动监听让外机能找到内机1. 确认端口号默认 12345 - 如果改端口在端口输入框中输入新端口号 - 输入后自动保存 2. 点击【启动监听】按钮 - 状态变为监听中 - 显示监听地址: 0.0.0.0:12345 - 等待外机连接A-2 接听来电1. 外机发起呼叫时内机收到来电弹窗 - 显示外机呼叫sessionIdxxx 2. 点击【接听】按钮 - 进入通话状态 - 显示对方视频画面 - 通话计时开始 3. 或点击【拒绝】按钮 - 结束呼叫A-3 通话中操作1. 点击【远程开锁(3s)】按钮 - 外机门锁打开 3 秒 - 状态显示门锁已开 - 3 秒后自动上锁 2. 点击【拒绝开锁】按钮 - 拒绝外机开门请求 3. 点击【挂断】按钮 - 结束通话A-4 人员管理【录入人脸】 1. 点击【人员录入】按钮 - 弹出人员录入面板 2. 在姓名输入框中输入姓名 3. 面对摄像头确保人脸在画面中 4. 点击【录入】按钮 - 系统自动检测并录入人脸 - 提示录入成功 - 人员列表自动刷新 【修改密码】 1. 点击【修改密码】按钮 - 弹出修改密码面板 2. 输入 6 位数字新密码 3. 点击【确认】按钮 - 密码修改成功 【启用/禁用人员】 1. 点击【更多】按钮右上角 - 打开侧边栏 2. 点击【授权库】标签 - 显示所有已录入人员 3. 切换人员的【启用/禁用】开关 - 禁用的无法通过人脸识别 4. 点击【删除】按钮 - 从数据库中删除该人员第三步B外机操作流程B-1 连接内机1. 在内机 IP / Host输入框中输入内机 IP - 例如10.11.100.207 - 输入后自动保存 2. 确认端口号默认 12345 - 如果改端口在端口输入框中输入 3. 点击【连接】按钮 - 等待连接成功 - 状态变为已连接 - 显示Peer: ws://xxx:12345B-2 发起呼叫1. 点击【门铃/呼叫】按钮 - 状态变为呼叫中 - 等待内机接听 2. 内机接听后 - 进入通话状态 - 显示对方视频画面 - 通话计时开始 3. 内机拒绝 - 回到空闲状态 4. 点击【挂断】按钮 - 取消呼叫B-3 人脸识别开门【方式一自动识别】 1. 确保已连接内机 2. 确保摄像头正常工作 3. 站在摄像头前 - 系统每 500ms 自动检测一次人脸 - 检测到人脸后自动匹配 - 匹配成功 → 自动开门3秒后上锁 - 匹配失败 → 显示开锁失败 4. 在人脸面板中可查看识别状态 - 匹配的人员姓名 - 匹配分数 【方式二手动扫描】 1. 点击【人脸】按钮 - 弹出人脸功能面板 2. 点击【扫描】按钮 - 立即执行一次人脸识别 - 显示识别结果B-4 密码开门1. 点击【密码解锁】按钮 - 弹出密码输入面板 2. 输入 6 位数字密码 - 点击数字键输入1-9、0 - 点击【清除】清空已输入 - 显示为 ●●●●●● 3. 点击【确认】按钮 - 密码正确 → 开门3秒后上锁 - 密码错误 → 提示错误 4. 点击【取消】按钮 - 关闭密码面板第四步查看事件日志通用操作内外机都支持 1. 点击【更多】按钮右上角 - 打开侧边栏 2. 点击【日志】标签 - 显示所有事件记录 - 包括ID、类型、结果、时间、来源、目标 3. 选择类型过滤下拉框 - 可选(全部)、call、unlock、face_ok、face_fail、face_enroll 4. 点击【刷新】按钮 - 重新加载日志 5. 点击【导出 CSV】按钮 - 导出日志到文档目录 - 显示已导出: /Documents/intercom_events_xxx.csv三、完整操作流程图┌─────────────────────────────────────────────────────────────────────────────┐ │ 启动程序 │ │ appDoorQML.exe │ └─────────────────────────────┬───────────────────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────────────────────────┐ │ 选择角色 │ │ 【外机门口机】 【内机门禁终端】 │ └──────────┬───────────────────────────────────────────┬─────────────────────┘ ▼ ▼ ┌──────────────────────────┐ ┌──────────────────────────────────────┐ │ 外机模式 │ │ 内机模式 │ ├──────────────────────────┤ ├──────────────────────────────────────┤ │ 1. 输入内机 IP 和端口 │ │ 1. 设置监听端口 │ │ 2. 点击【连接】 │ │ 2. 点击【启动监听】 │ │ 3. 连接成功 │ │ 3. 等待外机连接 │ ├──────────────────────────┤ ├──────────────────────────────────────┤ │ 可用操作 │ │ 可用操作 │ │ ┌────────────────────┐ │ │ ┌────────────────────────────────┐ │ │ │ 【门铃/呼叫】 │ │ │ │ 【接听来电】 │ │ │ │ → 呼叫内机 │ │ │ │ → 接听外机呼叫 │ │ │ └────────────────────┘ │ │ └────────────────────────────────┘ │ │ ┌────────────────────┐ │ │ ┌────────────────────────────────┐ │ │ │ 【人脸】 │ │ │ │ 【远程开锁】 │ │ │ │ → 扫描识别开门 │ │ │ │ → 授权外机开门 │ │ │ └────────────────────┘ │ │ └────────────────────────────────┘ │ │ ┌────────────────────┐ │ │ ┌────────────────────────────────┐ │ │ │ 【密码解锁】 │ │ │ │ 【人员录入】 │ │ │ │ → 输入密码开门 │ │ │ │ → 录入人脸特征 │ │ │ └────────────────────┘ │ │ └────────────────────────────────┘ │ │ ┌────────────────────┐ │ │ ┌────────────────────────────────┐ │ │ │ 【挂断】 │ │ │ │ 【修改密码】 │ │ │ │ → 结束通话 │ │ │ │ → 修改6位数字密码 │ │ │ └────────────────────┘ │ │ └────────────────────────────────┘ │ └──────────────────────────┘ └──────────────────────────────────────┘四、快速操作卡我要做什么操作启动程序双击appDoorQML.exe选择外机点击【外机门口机】选择内机点击【内机门禁终端】内机启动监听点击【启动监听】外机连接内机输入 IP → 点击【连接】发起呼叫点击【门铃/呼叫】接听呼叫点击【接听】拒绝呼叫点击【拒绝】挂断点击【挂断】人脸识别开门站在摄像头前等待自动识别或点击【人脸】→【扫描】密码开门点击【密码解锁】→ 输入6位密码 → 【确认】远程开门内机通话中点击【远程开锁(3s)】录入人脸内机点击【人员录入】→ 输入姓名 → 【录入】修改密码内机点击【修改密码】→ 输入6位新密码 → 【确认】查看日志点击【更多】→【日志】导出日志点击【更多】→【日志】→【导出 CSV】停止监听内机点击【停止监听】断开连接外机点击【断开】退出程序点击窗口右上角 ❌五、状态指示灯说明位置颜色含义顶部状态灯蓝色/红色蓝色系统正常顶部状态灯蓝色/红色红色有错误连接状态文字外机绿色已连接连接状态文字外机橙色未连接连接状态文字内机绿色外机已连接连接状态文字内机橙色外机未连接门锁状态绿色门锁已开门锁状态红色门锁锁定底部状态灯绿色系统 OK底部状态灯红色有错误监听状态内机绿色监听中监听状态内机橙色未监听CMakeLists.txt是 CMake 构建系统的“总施工图”它告诉编译器项目叫什么、用什么语言、需要哪些库、有哪些源文件、最终要生成什么。整体框架11个部分部分作用类比第一部分项目基础配置名称、版本、C标准起名字、定规矩第二部分查找 Qt 6 组件确认用到的工具第三部分定义可执行程序确定要建什么房子第四部分定义 QML 模块列出所有源文件列出所有建材第五部分配置 OpenCV引入第三方库第六部分设置程序输出属性确定房子建成后的样子第七部分链接库把建材粘合起来第八部分自动拷贝 OpenCV 动态库把门窗配件打包好第九部分安装规则准备搬家交付第十部分自动拷贝 Haar 模型文件把锁和钥匙装上第十一部分Qt 收尾最后验收main.cpp是程序的“启动器”——它负责创建应用程序、解析命令行、初始化总控制器、加载 QML 界面然后启动事件循环让程序运行起来。整体框架10个步骤步骤代码作用关键点1QGuiApplication app(argc, argv);创建 Qt 应用程序对象管理事件循环、命令行参数、全局设置2QQuickStyle::setStyle(Fusion);设置 QML 控件样式消除样式警告统一界面风格3QNetworkProxyFactory::setUseSystemConfiguration(false);QNetworkProxy::setApplicationProxy(QNetworkProxy::NoProxy);禁用系统网络代理避免代理干扰 WebSocket 通信4QCoreApplication::setOrganizationName(DemoOrg);QCoreApplication::setApplicationName(VillaIntercomDemo);设置组织名和应用名用于存储配置文件注册表或~/.config/5QCommandLineParser parser;parser.addOption(roleOpt);parser.process(app);解析命令行参数支持-r outer/-r inner启动模式6AppController controller;controller.setRole(role);controller.initIfNeeded();创建总控制器并初始化如果指定了角色则立即初始化否则延迟加载7QQmlApplicationEngine engine;engine.rootContext()-setContextProperty(app, controller);创建 QML 引擎暴露 C 对象让 QML 通过app调用 C 方法8engine.loadFromModule(DoorQML, Main);加载 QML 主界面从已注册模块加载Qt 6 推荐方式9QObject::connect(engine, QQmlApplicationEngine::objectCreated, ...);监听 QML 加载状态加载失败时退出程序10return app.exec();进入事件循环程序开始运行响应用户操作执行流程按阶段阶段包含步骤主要任务初始化阶段步骤 1-4创建 Qt 应用设置样式、网络代理、配置存储路径参数解析阶段步骤 5解析命令行参数确定启动模式业务初始化阶段步骤 6创建总控制器根据角色初始化各模块界面加载阶段步骤 7-9创建 QML 引擎暴露 C 对象加载主界面处理加载错误运行阶段步骤 10进入事件循环程序持续运行