一、项目概述
项目名称
DoorQML ------ 基于 Qt 的智能门禁系统
一句话介绍
一个基于 Qt 6 + OpenCV 的跨平台智能门禁系统,支持人脸识别认证、音视频通话、远程开门及事件日志管理。
项目类型
桌面应用程序(Windows / Linux / macOS 跨平台)
开发周期
约 2-3 个月(学习 + 开发)
二、完整功能列表
1. 角色选择
功能 说明 外机模式 门口机,发起呼叫、人脸识别、密码开锁 内机模式 室内机,监听呼叫、远程开门、人员管理 2. 通信功能
功能 说明 WebSocket 信令 内外机通过 WebSocket 实时通信 音频通话 双向 PCM 音频流传输(16kHz 采样率) 视频通话 双向 JPEG 视频流传输(640x480,10fps) 3. 人脸识别
功能 说明 人脸检测 OpenCV Haar Cascade 实时检测 特征提取 灰度图 → 32×32 归一化 → 特征向量 特征匹配 余弦相似度比对,可配置阈值(默认 0.75) 人脸录入 内机录入人员人脸特征到数据库 自动识别 外机自动识别并开门(每 500ms 扫描) 活体检测 纹理方差 + 边缘检测(可选) 4. 门禁控制
功能 说明 密码开锁 6 位数字密码验证 密码修改 内机修改密码(可配置为哈希存储) 远程开门 内机在通话中授权开门(3 秒自动上锁) 自动上锁 开门后指定时间自动上锁 5. 数据管理
功能 说明 人员管理 增删改查人员信息(启用/禁用) 事件日志 记录所有操作(呼叫、开门、人脸识别) 配置管理 服务器 IP、端口、阈值等持久化存储 CSV 导出 导出事件日志到 CSV 文件 6. 界面交互
功能 说明 深色主题 现代化深色 UI 设计 实时视频预览 显示本地摄像头画面 对端视频显示 通话中显示对方视频画面 来电弹窗 内机收到呼叫时弹窗提示 状态指示 连接状态、门锁状态、错误提示 三、完整运行流程
3.1 程序启动流程
cpp用户双击 appDoorQML.exe ↓ main.cpp 入口 ↓ 创建 QGuiApplication(事件循环) ↓ 解析命令行参数(-r outer / inner) ↓ 创建 AppController(总控制器) ↓ 创建 QQmlApplicationEngine(QML 引擎) ↓ 暴露 "app" 对象给 QML ↓ 加载 Main.qml(主界面) ↓ 显示角色选择页面(RoleSelectPage) ↓ 进入事件循环,等待用户操作3.2 外机模式流程
cpp用户点击"外机(门口机)" ↓ 设置角色:app.role = "outer" ↓ 初始化系统:app.initIfNeeded() ↓ 打开数据库(intercom.db) ↓ 创建/连接各服务模块 ↓ 切换到 OuterPage ↓ 用户配置内机 IP 和端口 ↓ 点击"连接" → SignalingService 连接内机 ↓ 进入 CallStage(通话界面) ↓ [可用操作] ├── 点击"门铃/呼叫" → 呼叫内机 ├── 人脸自动识别 → 匹配成功 → 开门 ├── 点击"密码解锁" → 输入密码 → 开门 └── 点击"人脸" → 手动扫描人脸3.3 内机模式流程
cpp用户点击"内机(门禁终端)" ↓ 设置角色:app.role = "inner" ↓ 初始化系统:app.initIfNeeded() ↓ 打开数据库(intercom.db) ↓ 创建/连接各服务模块 ↓ 切换到 InnerPage ↓ 用户配置监听端口(默认 12345) ↓ 点击"启动监听" → SignalingService 监听端口 ↓ 进入 CallStage(通话界面) ↓ [可用操作] ├── 收到外机呼叫 → 来电弹窗 → 接听/拒绝 ├── 通话中点击"远程开锁" → 授权外机开门 ├── 点击"修改密码" → 修改 6 位数字密码 └── 点击"人员录入" → 录入人脸到数据库3.4 通话流程
cpp外机点击"门铃/呼叫" ↓ CallController::dial() ↓ 生成 sessionId(UUID) ↓ 通过 WebSocket 发送 RING 消息 ↓ 内机收到 RING → 来电弹窗 ↓ [内机操作] ├── 点击"接听" → 发送 CALL_ACCEPT → 建立通话 └── 点击"拒绝" → 发送 CALL_REJECT → 结束 ↓ 通话建立(InCall 状态) ↓ 双向音视频流开始传输 ↓ [通话中操作] ├── 任何一方点击"挂断" → 结束通话 ├── 内机点击"远程开锁" → 外机开门 └── 内机点击"拒绝开锁" → 拒绝开门3.5 人脸识别流程
cpp摄像头采集视频帧(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 状态(显示"已开锁")四、项目技术栈总结
分类 技术 版本 语言 C++ C++17 GUI 框架 Qt 6.10.3 UI 语言 QML - 视觉库 OpenCV 3.4.8 数据库 SQLite 内置 构建系统 CMake 3.16+ 网络通信 WebSocket Qt 6 音视频 Qt Multimedia - 编译器 MinGW 13.1.0
五、项目架构图
cpp┌─────────────────────────────────────────────────────────────────────────┐ │ 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 项目名称
智能门禁系统(DoorQML)
6.2 项目描述
基于 Qt 6 + OpenCV 开发的跨平台智能门禁系统,支持人脸识别认证、实时音视频通话、远程开门及事件日志管理。采用 C++/QML 分层架构,集成 SQLite 实现数据持久化,使用 WebSocket 实现内外机实时通信。
6.3 技术栈
C++17|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 而不是其他框架?
A:Qt 是 C++ 原生框架,性能好,QML 做 UI 比传统 Widget 更灵活,信号槽机制非常适合事件驱动型应用。而且 Qt 跨平台,一套代码可以编译到 Windows、Linux、macOS。相比 Electron,Qt 内存占用小,启动快。
Q2:C++ 和 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:为什么不直接用深度学习模型?
A:Haar Cascade 速度快,模型文件小(~900KB),适合嵌入式场景。如果用深度学习,精度更高但需要 GPU,功耗也大。这个项目是轻量级门禁,Haar 足够。如果要升级,可以在 FaceController 里替换成 DNN 模块,不影响其他代码。
Q7:怎么防止照片欺骗?
A:目前实现了基础的活体检测,检查图像纹理方差和边缘强度,照片一般纹理单一、边缘模糊。实际产品可以用红外深度摄像头或要求用户眨眼、转头。
通信与音视频
Q8:WebSocket 信令是怎么设计的?
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 URL,QML 的 Image 直接显示。
数据库
Q11:为什么用 SQLite?
A:SQLite 是嵌入式数据库,不需要安装服务器,零配置,文件存储,适合本地数据持久化。Qt 内置了 SQLite 驱动,集成方便。对于门禁系统,数据量不大,SQLite 完全够用。
Q12:数据库有哪几张表?
A:三张表:person 表存人员(ID、姓名、是否启用、人脸特征向量);event 表存事件日志(ID、时间戳、类型、结果、来源、目标、额外数据);setting 表存系统配置(键值对)。
Q13:Repository 模式有什么好处?
A:把数据访问逻辑和业务逻辑分离。业务层只需要调用 Repository 的方法,不关心具体 SQL 怎么写。方便单元测试,也方便切换数据库(比如从 SQLite 换成 MySQL)。
项目管理
Q14:项目怎么构建的?
A:用 CMake 构建,找 Qt 和 OpenCV 库,编译所有 C++ 源文件,打包 QML 文件,最后链接生成可执行文件。Windows 下还自动拷贝 OpenCV 的 DLL 和 Haar 模型文件到输出目录。
Q15:项目部署需要注意什么?
A:需要把 OpenCV 的 DLL 和 Haar 模型文件放在 exe 同目录。Qt 的 multimedia 后端需要 FFmpeg(Windows 下 Qt 已内置)。如果用了 GraphicalEffects,需要安装 Qt 5 Compatibility Module。
九、简历模板
cpp### 智能门禁系统(DoorQML) 2026.06 - 2026.08 技术栈:C++17 / 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 地址 识别阈值配置 通用 配置人脸识别匹配阈值 二、操作步骤
第一步:启动程序
cpp1. 双击 appDoorQML.exe 2. 等待程序启动 3. 看到"选择运行角色"页面第二步:选择角色
选择外机(门口机):
cpp1. 点击【外机(门口机)】按钮 2. 程序自动切换到外机主界面 3. 看到"外机连接内机"面板选择内机(室内机):
cpp1. 点击【内机(门禁终端)】按钮 2. 程序自动切换到内机主界面 3. 看到"内机监听"面板第三步A:内机操作流程
A-1 启动监听(让外机能找到内机)
cpp1. 确认端口号(默认 12345) - 如果改端口,在"端口"输入框中输入新端口号 - 输入后自动保存 2. 点击【启动监听】按钮 - 状态变为"监听中" - 显示"监听地址: 0.0.0.0:12345" - 等待外机连接A-2 接听来电
cpp1. 外机发起呼叫时,内机收到来电弹窗 - 显示"外机呼叫(sessionId=xxx)" 2. 点击【接听】按钮 - 进入通话状态 - 显示对方视频画面 - 通话计时开始 3. 或点击【拒绝】按钮 - 结束呼叫A-3 通话中操作
cpp1. 点击【远程开锁(3s)】按钮 - 外机门锁打开 3 秒 - 状态显示"门锁:已开" - 3 秒后自动上锁 2. 点击【拒绝开锁】按钮 - 拒绝外机开门请求 3. 点击【挂断】按钮 - 结束通话A-4 人员管理
cpp【录入人脸】 1. 点击【人员录入】按钮 - 弹出人员录入面板 2. 在"姓名"输入框中输入姓名 3. 面对摄像头,确保人脸在画面中 4. 点击【录入】按钮 - 系统自动检测并录入人脸 - 提示"录入成功" - 人员列表自动刷新 【修改密码】 1. 点击【修改密码】按钮 - 弹出修改密码面板 2. 输入 6 位数字新密码 3. 点击【确认】按钮 - 密码修改成功 【启用/禁用人员】 1. 点击【更多】按钮(右上角) - 打开侧边栏 2. 点击【授权库】标签 - 显示所有已录入人员 3. 切换人员的【启用/禁用】开关 - 禁用的无法通过人脸识别 4. 点击【删除】按钮 - 从数据库中删除该人员第三步B:外机操作流程
B-1 连接内机
cpp1. 在"内机 IP / Host"输入框中输入内机 IP - 例如:10.11.100.207 - 输入后自动保存 2. 确认端口号(默认 12345) - 如果改端口,在"端口"输入框中输入 3. 点击【连接】按钮 - 等待连接成功 - 状态变为"已连接" - 显示"Peer: ws://xxx:12345"B-2 发起呼叫
cpp1. 点击【门铃/呼叫】按钮 - 状态变为"呼叫中" - 等待内机接听 2. 内机接听后: - 进入通话状态 - 显示对方视频画面 - 通话计时开始 3. 内机拒绝: - 回到空闲状态 4. 点击【挂断】按钮 - 取消呼叫B-3 人脸识别开门
cpp【方式一:自动识别】 1. 确保已连接内机 2. 确保摄像头正常工作 3. 站在摄像头前 - 系统每 500ms 自动检测一次人脸 - 检测到人脸后自动匹配 - 匹配成功 → 自动开门(3秒后上锁) - 匹配失败 → 显示"开锁失败" 4. 在"人脸"面板中可查看识别状态 - 匹配的人员姓名 - 匹配分数 【方式二:手动扫描】 1. 点击【人脸】按钮 - 弹出人脸功能面板 2. 点击【扫描】按钮 - 立即执行一次人脸识别 - 显示识别结果B-4 密码开门
cpp1. 点击【密码解锁】按钮 - 弹出密码输入面板 2. 输入 6 位数字密码 - 点击数字键输入(1-9、0) - 点击【清除】清空已输入 - 显示为 ●●●●●● 3. 点击【确认】按钮 - 密码正确 → 开门(3秒后上锁) - 密码错误 → 提示错误 4. 点击【取消】按钮 - 关闭密码面板第四步:查看事件日志
cpp通用操作(内外机都支持): 1. 点击【更多】按钮(右上角) - 打开侧边栏 2. 点击【日志】标签 - 显示所有事件记录 - 包括:ID、类型、结果、时间、来源、目标 3. 选择类型过滤下拉框 - 可选:(全部)、call、unlock、face_ok、face_fail、face_enroll 4. 点击【刷新】按钮 - 重新加载日志 5. 点击【导出 CSV】按钮 - 导出日志到文档目录 - 显示"已导出: /Documents/intercom_events_xxx.csv"三、完整操作流程图
cpp┌─────────────────────────────────────────────────────────────────────────────┐ │ 启动程序 │ │ appDoorQML.exe │ └─────────────────────────────┬───────────────────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────────────────────────┐ │ 选择角色 │ │ 【外机(门口机)】 【内机(门禁终端)】 │ └──────────┬───────────────────────────────────────────┬─────────────────────┘ ▼ ▼ ┌──────────────────────────┐ ┌──────────────────────────────────────┐ │ 外机模式 │ │ 内机模式 │ ├──────────────────────────┤ ├──────────────────────────────────────┤ │ 1. 输入内机 IP 和端口 │ │ 1. 设置监听端口 │ │ 2. 点击【连接】 │ │ 2. 点击【启动监听】 │ │ 3. 连接成功 │ │ 3. 等待外机连接 │ ├──────────────────────────┤ ├──────────────────────────────────────┤ │ 可用操作: │ │ 可用操作: │ │ ┌────────────────────┐ │ │ ┌────────────────────────────────┐ │ │ │ 【门铃/呼叫】 │ │ │ │ 【接听来电】 │ │ │ │ → 呼叫内机 │ │ │ │ → 接听外机呼叫 │ │ │ └────────────────────┘ │ │ └────────────────────────────────┘ │ │ ┌────────────────────┐ │ │ ┌────────────────────────────────┐ │ │ │ 【人脸】 │ │ │ │ 【远程开锁】 │ │ │ │ → 扫描识别开门 │ │ │ │ → 授权外机开门 │ │ │ └────────────────────┘ │ │ └────────────────────────────────┘ │ │ ┌────────────────────┐ │ │ ┌────────────────────────────────┐ │ │ │ 【密码解锁】 │ │ │ │ 【人员录入】 │ │ │ │ → 输入密码开门 │ │ │ │ → 录入人脸特征 │ │ │ └────────────────────┘ │ │ └────────────────────────────────┘ │ │ ┌────────────────────┐ │ │ ┌────────────────────────────────┐ │ │ │ 【挂断】 │ │ │ │ 【修改密码】 │ │ │ │ → 结束通话 │ │ │ │ → 修改6位数字密码 │ │ │ └────────────────────┘ │ │ └────────────────────────────────┘ │ └──────────────────────────┘ └──────────────────────────────────────┘四、快速操作卡
我要做什么 操作 启动程序 双击 appDoorQML.exe选择外机 点击【外机(门口机)】 选择内机 点击【内机(门禁终端)】 内机启动监听 点击【启动监听】 外机连接内机 输入 IP → 点击【连接】 发起呼叫 点击【门铃/呼叫】 接听呼叫 点击【接听】 拒绝呼叫 点击【拒绝】 挂断 点击【挂断】 人脸识别开门 站在摄像头前等待自动识别,或点击【人脸】→【扫描】 密码开门 点击【密码解锁】→ 输入6位密码 → 【确认】 远程开门(内机) 通话中点击【远程开锁(3s)】 录入人脸(内机) 点击【人员录入】→ 输入姓名 → 【录入】 修改密码(内机) 点击【修改密码】→ 输入6位新密码 → 【确认】 查看日志 点击【更多】→【日志】 导出日志 点击【更多】→【日志】→【导出 CSV】 停止监听(内机) 点击【停止监听】 断开连接(外机) 点击【断开】 退出程序 点击窗口右上角 ❌ 五、状态指示灯说明
位置 颜色 含义 顶部状态灯(蓝色/红色) 蓝色 系统正常 顶部状态灯(蓝色/红色) 红色 有错误 连接状态文字(外机) 绿色 已连接 连接状态文字(外机) 橙色 未连接 连接状态文字(内机) 绿色 外机已连接 连接状态文字(内机) 橙色 外机未连接 门锁状态 绿色 门锁已开 门锁状态 红色 门锁锁定 底部状态灯 绿色 系统 OK 底部状态灯 红色 有错误 监听状态(内机) 绿色 监听中 监听状态(内机) 橙色 未监听
基于 Qt 的智能门禁系统(三)
丰锋ff2026-08-27 12:39
相关推荐
消费知多少1 小时前
解析勤策签约大西洋焊接费用核销实践案例LabVIEW开发1 小时前
LabVIEW按段拆分TDMS文件的格式边界与重构asdzx672 小时前
使用 Python 为 Excel 添加各类数据验证规则Romantic_love_2 小时前
理解USART真实收发过程撩得Android一次心动2 小时前
Kotlin 语言【知识点整理3】2601_966949652 小时前
如何利用 1 分钟 K 线在 14:50 精准捕捉尾盘异动?Python 量化实战:1 分钟 K 线 + 全市场扫描CarIise2 小时前
JavaScript基础语法与DOM操作实战课堂笔记林森lsjs2 小时前
零基础吃透二叉树:定义、遍历与高频算法 —数据结构柒wind100323 小时前
Qt5Widgets.dll 缺失报错|游戏软件无法启动完整修复教程