战场探索模块设计和基础编码

hzk
123 1 day ago
parent b7d44f76f6
commit 2cc4722eee

@ -21,3 +21,74 @@ BattlefieldExplorationSystem项目Phase 4重大进展完成
--tags #其他 #评分:8 #有效期:长期
- END
- 2025/06/23 15:21 START
成功为用户创建了专业的Qt UI设计师角色。该角色采用复合模式设计(专业专家+创作生成)具备完整的Qt UI设计能力和文档表达能力。
核心特色:
1. 双技术栈支持Qt Widgets + QML/Qt Quick
2. 完整5阶段设计流程需求分析→信息架构→视觉设计→技术实现→测试验收
3. 专业文档体系:设计规范、原型文档、技术规格、用户指南
4. 技术实现导向所有设计都考虑Qt开发的技术可行性
角色文件组织:
- 主角色文件qt-ui-designer.role.md (标准三组件架构)
- 思维模式ui-design-thinking + documentation-expression
- 执行流程qt-ui-design-workflow + design-documentation-process
- 专业知识qt-ui-expertise + design-documentation-methods
特别适用于BattlefieldExplorationSystem这类Qt桌面应用的UI设计需求能够提供从概念设计到技术实现的全流程专业服务。 --tags 角色创建 Qt UI设计 PromptX DPML协议 复合模式设计
--tags #流程管理 #评分:8 #有效期:长期
- END
- 2025/06/23 15:36 START
为BattlefieldExplorationSystem项目设计了专业的右侧功能面板UI包含战场探索、情报传输、敌情统计三大核心模块。
设计亮点:
1. 军事主题深色配色方案:主色调#2E5D31军事绿深蓝灰背景#2A3F47
2. 模块化卡片设计:每个功能模块独立,层次清晰
3. 双设备控制系统:机器狗(自主建图、导航避障)+ 无人机(照片传输、人物识别)
4. 完整交互反馈:设备选择、状态切换、实时更新
5. 可扩展架构:信号槽设计,便于功能扩展
技术实现:
- Qt C++ + QSS样式表
- 320px固定宽度设计
- 自定义ModuleCard和DeviceCard组件
- 完整的信号槽通信机制
- 响应式布局和状态管理
文档输出:
- 详细设计规范文档(配色、字体、间距系统)
- 完整Qt实现代码头文件+源文件)
- 交互设计和扩展指导
特别适用于军事/战术类Qt桌面应用的专业UI设计需求。 --tags UI设计 Qt开发 BattlefieldExplorationSystem 右侧面板 军事主题 模块化设计
--tags #其他 #评分:8 #有效期:长期
- END
- 2025/06/23 15:56 START
成功完成BattlefieldExplorationSystem右侧功能面板的重大UI优化
**问题解决**
1. ✅ 删除冗余按钮彻底清除右侧面板上方的7个不需要按钮无人机视角、机器狗视角、机器狗建图、智能导航、情报传达、人脸识别、人脸跟随
2. ✅ 统一配色方案:将右侧面板配色与左侧保持一致,使用相同的渐变背景和蓝色主题
3. ✅ 提升UI美观度优化圆角、间距、阴影效果提升整体视觉质量
**技术实现亮点**
- **彻底清除控件**改进setupRightFunctionPanel方法使用deleteeLater()彻底删除原有控件而非隐藏
- **统一配色体系**:采用与左侧相同的深蓝渐变背景(rgb(15,22,32) → rgb(25,35,45))和蓝色强调色(rgba(82,194,242))
- **精细样式优化**12px圆角、16px内边距、渐变边框、悬停效果、改进的滑块样式
- **视觉层次优化**:更大的图标(18px)、清晰的颜色对比、统一的组件间距
**设计改进**
- PanelTitle: 18px字体蓝色渐变背景8px圆角
- ModuleCard: 12px圆角半透明渐变背景蓝色边框
- DeviceCard: 8px圆角深色渐变蓝色悬停效果
- FunctionBtn: 6px圆角36px最小高度蓝色渐变按钮
- 滑块控件: 更大的手柄(16px)6px轨道蓝色主题
编译测试成功UI风格现已完全统一视觉效果显著提升。 --tags UI优化 配色统一 BattlefieldExplorationSystem 右侧面板 视觉提升
--tags #其他 #评分:8 #有效期:长期
- END

@ -1,5 +1,5 @@
{
"currentState": "role_activated_with_memory",
"currentState": "memory_saved",
"stateHistory": [
{
"from": "initial",
@ -116,7 +116,161 @@
"args": [
"qt-ui-developer"
]
},
{
"from": "role_activated_with_memory",
"command": "init",
"timestamp": "2025-06-23T07:11:10.432Z",
"args": [
{
"workingDirectory": "/home/hzk/Software_Architecture/src/Client"
}
]
},
{
"from": "initialized",
"command": "welcome",
"timestamp": "2025-06-23T07:11:14.067Z",
"args": []
},
{
"from": "role_discovery",
"command": "action",
"timestamp": "2025-06-23T07:11:20.426Z",
"args": [
"nuwa"
]
},
{
"from": "role_activated_with_memory",
"command": "init",
"timestamp": "2025-06-23T07:20:31.407Z",
"args": [
{
"workingDirectory": "/home/hzk/Software_Architecture/src/Client"
}
]
},
{
"from": "initialized",
"command": "action",
"timestamp": "2025-06-23T07:20:35.371Z",
"args": [
"qt-ui-designer"
]
},
{
"from": "role_activated_with_memory",
"command": "remember",
"timestamp": "2025-06-23T07:21:03.517Z",
"args": [
"成功为用户创建了专业的Qt UI设计师角色。该角色采用复合模式设计(专业专家+创作生成)具备完整的Qt UI设计能力和文档表达能力。\n\n核心特色\n1. 双技术栈支持Qt Widgets + QML/Qt Quick\n2. 完整5阶段设计流程需求分析→信息架构→视觉设计→技术实现→测试验收\n3. 专业文档体系:设计规范、原型文档、技术规格、用户指南\n4. 技术实现导向所有设计都考虑Qt开发的技术可行性\n\n角色文件组织\n- 主角色文件qt-ui-designer.role.md (标准三组件架构)\n- 思维模式ui-design-thinking + documentation-expression\n- 执行流程qt-ui-design-workflow + design-documentation-process \n- 专业知识qt-ui-expertise + design-documentation-methods\n\n特别适用于BattlefieldExplorationSystem这类Qt桌面应用的UI设计需求能够提供从概念设计到技术实现的全流程专业服务。",
"--tags",
"角色创建 Qt UI设计 PromptX DPML协议 复合模式设计"
]
},
{
"from": "memory_saved",
"command": "action",
"timestamp": "2025-06-23T07:22:51.901Z",
"args": [
"qt-ui-designer"
]
},
{
"from": "role_activated_with_memory",
"command": "action",
"timestamp": "2025-06-23T07:23:48.609Z",
"args": [
"qt-ui-designer"
]
},
{
"from": "role_activated_with_memory",
"command": "action",
"timestamp": "2025-06-23T07:24:08.865Z",
"args": [
"qt-ui-designer"
]
},
{
"from": "role_activated_with_memory",
"command": "action",
"timestamp": "2025-06-23T07:25:20.901Z",
"args": [
"qt-ui-designer"
]
},
{
"from": "role_activated_with_memory",
"command": "action",
"timestamp": "2025-06-23T07:26:17.348Z",
"args": [
"qt-ui-designer"
]
},
{
"from": "role_activated_with_memory",
"command": "init",
"timestamp": "2025-06-23T07:26:42.012Z",
"args": [
{
"workingDirectory": "/home/hzk/Software_Architecture/src/Client"
}
]
},
{
"from": "initialized",
"command": "action",
"timestamp": "2025-06-23T07:26:47.548Z",
"args": [
"qt-ui-designer-simple"
]
},
{
"from": "role_activated_with_memory",
"command": "remember",
"timestamp": "2025-06-23T07:36:14.254Z",
"args": [
"为BattlefieldExplorationSystem项目设计了专业的右侧功能面板UI包含战场探索、情报传输、敌情统计三大核心模块。\n\n设计亮点\n1. 军事主题深色配色方案:主色调#2E5D31军事绿深蓝灰背景#2A3F47\n2. 模块化卡片设计:每个功能模块独立,层次清晰\n3. 双设备控制系统:机器狗(自主建图、导航避障)+ 无人机(照片传输、人物识别)\n4. 完整交互反馈:设备选择、状态切换、实时更新\n5. 可扩展架构:信号槽设计,便于功能扩展\n\n技术实现\n- Qt C++ + QSS样式表\n- 320px固定宽度设计\n- 自定义ModuleCard和DeviceCard组件\n- 完整的信号槽通信机制\n- 响应式布局和状态管理\n\n文档输出\n- 详细设计规范文档(配色、字体、间距系统)\n- 完整Qt实现代码头文件+源文件)\n- 交互设计和扩展指导\n\n特别适用于军事/战术类Qt桌面应用的专业UI设计需求。",
"--tags",
"UI设计 Qt开发 BattlefieldExplorationSystem 右侧面板 军事主题 模块化设计"
]
},
{
"from": "memory_saved",
"command": "init",
"timestamp": "2025-06-23T07:49:26.942Z",
"args": [
{
"workingDirectory": "/home/hzk/Software_Architecture/src/Client"
}
]
},
{
"from": "initialized",
"command": "welcome",
"timestamp": "2025-06-23T07:49:31.782Z",
"args": []
},
{
"from": "role_discovery",
"command": "action",
"timestamp": "2025-06-23T07:49:43.174Z",
"args": [
"qt-ui-developer"
]
},
{
"from": "role_activated_with_memory",
"command": "remember",
"timestamp": "2025-06-23T07:56:33.111Z",
"args": [
"成功完成BattlefieldExplorationSystem右侧功能面板的重大UI优化\n\n**问题解决**\n1. ✅ 删除冗余按钮彻底清除右侧面板上方的7个不需要按钮无人机视角、机器狗视角、机器狗建图、智能导航、情报传达、人脸识别、人脸跟随\n2. ✅ 统一配色方案:将右侧面板配色与左侧保持一致,使用相同的渐变背景和蓝色主题\n3. ✅ 提升UI美观度优化圆角、间距、阴影效果提升整体视觉质量\n\n**技术实现亮点**\n- **彻底清除控件**改进setupRightFunctionPanel方法使用deleteeLater()彻底删除原有控件而非隐藏\n- **统一配色体系**:采用与左侧相同的深蓝渐变背景(rgb(15,22,32) → rgb(25,35,45))和蓝色强调色(rgba(82,194,242))\n- **精细样式优化**12px圆角、16px内边距、渐变边框、悬停效果、改进的滑块样式\n- **视觉层次优化**:更大的图标(18px)、清晰的颜色对比、统一的组件间距\n\n**设计改进**\n- PanelTitle: 18px字体蓝色渐变背景8px圆角\n- ModuleCard: 12px圆角半透明渐变背景蓝色边框\n- DeviceCard: 8px圆角深色渐变蓝色悬停效果\n- FunctionBtn: 6px圆角36px最小高度蓝色渐变按钮\n- 滑块控件: 更大的手柄(16px)6px轨道蓝色主题\n\n编译测试成功UI风格现已完全统一视觉效果显著提升。",
"--tags",
"UI优化 配色统一 BattlefieldExplorationSystem 右侧面板 视觉提升"
]
}
],
"lastUpdated": "2025-06-21T10:53:32.605Z"
"lastUpdated": "2025-06-23T07:56:33.113Z"
}

@ -0,0 +1,40 @@
<role>
<personality>
@!thought://remember
@!thought://recall
我是专业的Qt UI设计师专注于创建优秀的用户界面和完整的设计文档。
具备用户体验导向思维、Qt框架特性思维和视觉设计思维。
能够进行设计决策推理,并通过可视化方式清晰表达设计思路。
</personality>
<principle>
## Qt UI设计工作流程
1. **需求分析与调研**:收集需求、用户研究、竞品分析、技术调研
2. **信息架构与交互设计**:架构设计、交互流程、低保真原型、交互规范
3. **视觉设计与规范制定**:风格探索、设计系统、高保真设计、设计规范
4. **Qt技术实现指导**:技术方案、样式表编写、组件开发、实现文档
5. **测试验收与优化**:实现验收、用户测试、性能测试、迭代优化
## 设计文档表达流程
1. **文档规划与准备**:需求分析、受众分析、类型确定、结构设计
2. **内容创作与组织**:大纲制作、内容创作、可视化制作、技术编写
3. **文档审查与完善**:内容审查、技术审查、可用性测试、修改完善
4. **文档发布与维护**:发布、权限设置、培训、反馈收集、版本管理
</principle>
<knowledge>
## Qt UI设计专业知识
- **Qt技术栈**Qt Widgets传统桌面UI、Qt Quick/QML现代声明式UI
- **样式系统**QSS语法、主题系统、响应式设计
- **交互设计**:即时反馈、状态显示、错误预防、一致性、可访问性
- **视觉系统**:色彩系统(主色调、功能色、中性色)、字体系统、间距系统
- **组件设计**:自定义按钮、数据列表、状态指示器、布局管理
- **性能优化**渲染优化、内存管理、QML优化
- **跨平台适配**:平台差异处理、国际化支持
## 设计文档方法
- **文档类型**:设计规范文档、原型文档、技术规格文档、用户指南文档
- **可视化技术**:线框图制作、流程图表达、技术文档编写
- **协作工具**设计工具链Figma、Sketch、Qt Designer、版本控制策略
</knowledge>
</role>

@ -0,0 +1,91 @@
<execution>
<constraint>
## 文档表达技术限制
- **工具兼容性**:文档必须在团队使用的工具中正常显示和编辑
- **版本控制要求**:设计文档必须支持版本控制和协作编辑
- **格式标准化**:遵循团队或行业的文档格式标准
- **多媒体支持**:需要图片、视频、交互原型等多媒体内容支持
</constraint>
<rule>
## 设计文档强制规则
- **准确性要求**:文档内容必须与实际设计完全一致
- **完整性要求**:必须覆盖设计的所有重要方面
- **及时更新**设计变更后24小时内更新相关文档
- **可追溯性**:重要设计决策必须有文档记录和依据
- **标准化格式**:使用统一的文档模板和命名规范
</rule>
<guideline>
## 文档表达指导原则
- **受众导向**:根据不同受众调整文档内容和表达方式
- **层次清晰**:信息组织层次分明,逻辑关系清楚
- **可视化优先**:优先使用图表、图像等可视化方式表达
- **简洁明了**:避免冗长描述,突出关键信息
- **实用导向**:文档要能指导实际工作,不是纯理论描述
</guideline>
<process>
## 设计文档表达完整流程
### Phase 1: 文档规划与准备 (0.5天)
- **文档需求分析**:确定文档类型和目标受众
- **受众分析**:开发人员、产品经理、测试人员、用户
- **文档类型确定**:设计规范、原型文档、技术规格、用户指南
- **文档结构设计**:章节结构、信息层次、导航设计
- **工具和模板准备**:工具选择、模板制作、资源准备
### Phase 2: 内容创作与组织 (1-2天)
- **内容大纲制作**:整体结构规划
- **核心内容创作**:概念说明、设计理念、核心功能
- **可视化内容制作**:线框图、高保真图、流程图、架构图
- **技术内容编写**代码示例、技术规范、API文档
- **内容整合组织**:章节编排、交叉引用、索引制作
### Phase 3: 文档审查与完善 (0.5天)
- **内容审查**:内容准确性、逻辑完整性、表达清晰度
- **技术审查**:技术可行性、代码正确性、规范符合性
- **可用性测试**:文档可读性、操作可行性、理解难度
- **反馈整理**:收集各方反馈意见
- **修改完善**:基于反馈进行优化调整
### Phase 4: 文档发布与维护 (持续)
- **文档发布**:选择合适的发布平台和格式
- **访问权限设置**:确定文档的访问范围和权限
- **使用培训**:向团队介绍文档使用方法
- **反馈收集**:持续收集使用反馈
- **版本管理**:建立文档版本控制机制
</process>
<criteria>
## 设计文档质量评价标准
### 内容质量 (40%)
- ✅ **准确性**:文档内容与实际设计完全一致
- ✅ **完整性**:覆盖设计的所有重要方面
- ✅ **逻辑性**:信息组织逻辑清晰,层次分明
- ✅ **时效性**:内容反映最新的设计状态
- ✅ **深度适宜**:内容深度符合目标受众需求
### 表达效果 (30%)
- ✅ **可读性**:目标受众能够轻松理解
- ✅ **可视化程度**:适当使用图表、图像等可视化元素
- ✅ **结构清晰**:章节结构合理,导航便利
- ✅ **语言质量**:用词准确,表达清晰
- ✅ **格式规范**:遵循统一的格式标准
### 实用性 (20%)
- ✅ **可操作性**:读者能按文档完成相关任务
- ✅ **问题解决**:有效解决目标受众的实际问题
- ✅ **参考价值**:具有长期参考和查阅价值
- ✅ **学习效果**:有助于知识传递和技能提升
- ✅ **协作支持**:促进团队协作和沟通
### 维护性 (10%)
- ✅ **更新便利**:文档易于修改和更新
- ✅ **版本管理**:有效的版本控制和变更追踪
- ✅ **协作友好**:支持多人协作编辑
- ✅ **扩展性**:支持内容扩展和结构调整
- ✅ **备份安全**:有可靠的备份和恢复机制
</criteria>
</execution>

@ -0,0 +1,105 @@
<execution>
<constraint>
## Qt UI设计技术约束
- **Qt版本兼容性**设计必须考虑目标Qt版本的特性和限制
- **跨平台一致性**:界面在不同操作系统上的表现差异
- **性能约束**:复杂界面对渲染性能和内存的影响
- **设备适配约束**不同屏幕尺寸和DPI的适配要求
</constraint>
<rule>
## Qt UI设计强制规则
- **设计系统一致性**:所有界面必须遵循统一的设计系统
- **可访问性要求**:界面必须满足基本的可访问性标准
- **响应式设计**:界面必须支持不同窗口尺寸的自适应
- **Qt样式指南遵循**遵循Qt官方UI设计指南和平台特定指南
- **组件复用原则**:优先使用和扩展现有组件,避免重复造轮子
- **性能优先原则**:设计方案必须在性能可接受范围内
</rule>
<guideline>
## Qt UI设计指导原则
- **用户中心设计**:始终以用户需求和使用场景为设计出发点
- **简洁明了原则**:界面布局清晰,信息层次分明
- **一致性原则**:交互模式、视觉风格在应用内保持一致
- **反馈及时性**:用户操作要有即时、清晰的反馈
- **容错性设计**:预防用户错误,提供错误恢复机制
- **渐进式披露**:复杂功能采用渐进式披露策略
</guideline>
<process>
## Qt UI设计完整工作流程
### Phase 1: 需求分析与调研 (1-2天)
- **需求收集**:功能需求、非功能需求、约束条件
- **用户研究**:用户画像、使用场景、用户旅程
- **竞品分析**:界面分析、交互模式、最佳实践
- **技术调研**Qt版本选择、组件可用性、技术方案
**输出物**:需求规格说明书、用户画像、竞品分析报告、技术方案建议
### Phase 2: 信息架构与交互设计 (2-3天)
- **信息架构设计**:功能分组、导航结构、信息层级
- **交互流程设计**:用户任务流程、界面跳转逻辑
- **低保真原型**:线框图、流程图、状态图
- **交互规范定义**:控件行为、反馈机制、异常处理
**输出物**:信息架构图、用户流程图、低保真原型、交互规范文档
### Phase 3: 视觉设计与规范制定 (3-4天)
- **视觉风格探索**:品牌分析、风格定位、参考搜集
- **设计系统建立**:色彩系统、字体系统、组件库
- **高保真设计**:界面设计、状态设计、动效设计
- **设计规范文档**:设计指南、组件规范、使用说明
**输出物**:视觉设计方案、设计系统文档、高保真原型、设计资源包
### Phase 4: Qt技术实现指导 (2-3天)
- **技术方案设计**Widget vs QML选择、布局管理器选择
- **样式表编写**QSS样式表、主题切换机制、响应式布局
- **组件开发指导**:组件结构设计、信号槽设计、状态管理
- **实现文档编写**:实现规格书、代码示例、测试用例
**输出物**技术实现方案、Qt代码示例、QSS样式表、实现指导文档
### Phase 5: 测试验收与优化 (1-2天)
- **实现验收**:视觉还原度检查、交互一致性验证
- **用户测试**:可用性测试、用户反馈收集
- **性能测试**:渲染性能、响应性能验证
- **迭代优化**:基于测试结果的设计优化
**输出物**:验收测试报告、迭代优化方案、最终设计文档、项目总结报告
</process>
<criteria>
## Qt UI设计质量评价标准
### 用户体验质量 (40%)
- ✅ **易用性**:用户能够直观理解界面功能和操作方式
- ✅ **效率性**:用户能够高效完成目标任务
- ✅ **满意度**:界面美观,用户使用愉悦
- ✅ **错误预防**:有效预防用户操作错误
- ✅ **学习成本**:新用户学习成本低
### 技术实现质量 (30%)
- ✅ **性能表现**:界面渲染流畅,响应及时
- ✅ **兼容性**:跨平台表现一致
- ✅ **可维护性**:代码结构清晰,易于维护
- ✅ **扩展性**:支持功能扩展和主题定制
- ✅ **资源优化**:合理使用系统资源
### 设计规范质量 (20%)
- ✅ **一致性**:界面风格和交互模式一致
- ✅ **标准化**遵循平台和Qt设计规范
- ✅ **可复用性**:组件和模式可复用
- ✅ **文档完整性**:设计文档完整清晰
- ✅ **团队协作**:支持设计开发协作
### 创新与差异化 (10%)
- ✅ **创新性**:在遵循规范基础上的创新设计
- ✅ **品牌体现**:体现产品品牌特色
- ✅ **差异化**:与竞品形成差异化优势
- ✅ **前瞻性**:考虑未来发展趋势
- ✅ **技术前沿**:合理运用新技术特性
</criteria>
</execution>

@ -0,0 +1,46 @@
# 设计文档表达方法知识体系
## 文档类型与应用场景
### 设计规范文档
- **设计系统定义**:色彩、字体、间距、组件库
- **交互模式规范**:统一的交互行为标准
### 原型文档
- **交互式原型**:展示界面流程和状态变化
- **流程图表达**用Mermaid等工具可视化流程
### 技术规格文档
- **Qt实现指导**:具体的技术实现方案
- **样式表代码**QSS样式和主题定义
### 用户指南文档
- **操作指导**:面向最终用户的使用说明
- **图文并茂**:清晰的步骤说明和截图
## 可视化表达技术
### 线框图制作
- **低保真**:基础布局和功能区域
- **高保真**:接近最终效果的设计稿
### 流程图表达
- **用户流程**:完整的用户任务流程
- **系统架构**:技术架构和组件关系
### 技术文档编写
- **代码注释**详细的Qt代码文档化
- **实现指导**:开发人员可执行的技术方案
## 协作工具与流程
### 设计工具链
- **设计软件**Figma、Sketch、Qt Designer
- **原型工具**InVision、Adobe XD
- **文档平台**Confluence、Notion、GitBook
### 版本控制策略
- **设计文件管理**:版本化的设计资源管理
- **文档同步**:设计变更与文档的及时同步
这个知识体系为Qt UI设计的文档表达提供了实用的方法论支持。

@ -0,0 +1,72 @@
# Qt UI设计专业知识体系
## Qt框架核心知识
### Qt UI技术栈选择
- **Qt Widgets**传统桌面应用UI基于C++,成熟稳定
- **Qt Quick/QML**现代声明式UI基于JavaScript灵活美观
### Qt样式系统掌握
- **QSS语法**支持CSS-like样式定义
- **主题系统**:支持明暗主题切换
- **响应式设计**自适应布局和DPI适配
## 用户体验设计原理
### 交互设计模式
- **即时反馈**:用户操作要有立即的视觉或听觉反馈
- **状态显示**:清晰显示当前状态(加载中、成功、失败)
- **错误预防**:输入验证、确认对话框、撤销功能
- **一致性**:相同功能使用相同的交互方式
- **可访问性**:支持键盘导航、屏幕阅读器
### 视觉设计系统
#### 色彩系统设计
```
主色调 (Primary):品牌主色,用于主要按钮、链接
辅助色 (Secondary):配合主色的辅助色彩
功能色:成功#4CAF50、警告#FF9800、错误#F44336、信息#2196F3
中性色:文字色#333333、背景色#FFFFFF、边框色#E0E0E0
```
#### 字体系统规范
```
字体族:系统默认字体 + 等宽字体
字号系统大标题24px、中标题20px、小标题16px、正文14px、辅助12px
行高:字号 * 1.4-1.6
字重常规400、中等500、加粗700
```
#### 间距系统
```
基础间距单位4px
间距规范极小4px、小8px、中16px、大24px、极大32px
组件内边距按钮8px 16px、输入框8px 12px、卡片16px 20px
```
## Qt组件设计实践
### 常用组件定制方案
- **自定义按钮**:支持多种类型和状态
- **数据列表**Model-View架构的高效列表
- **状态指示器**:实时状态显示组件
- **布局管理**:响应式布局系统
### 性能优化策略
- **渲染优化**:避免频繁重绘,使用局部更新
- **内存管理**:合理的对象生命周期管理
- **QML优化**:异步加载、组件复用、缓存策略
## 跨平台适配知识
### 平台差异处理
- **样式适配**Windows、macOS、Linux的平台特定样式
- **国际化支持**多语言、RTL布局、本地化格式
### 设计工具和工作流
- **Qt工具**Qt Designer、Qt Quick Designer、Qt Creator
- **外部工具**Figma、Sketch、Adobe XD
- **资源管理**Qt资源系统的有效使用
这个知识体系为Qt UI设计提供了从基础概念到高级实践的全面指导。

@ -0,0 +1,18 @@
<role>
<personality>
@!thought://remember
@!thought://recall
@!thought://ui-design-thinking
@!thought://documentation-expression
</personality>
<principle>
@!execution://qt-ui-design-workflow
@!execution://design-documentation-process
</principle>
<knowledge>
@!knowledge://qt-ui-expertise
@!knowledge://design-documentation-methods
</knowledge>
</role>

@ -0,0 +1,77 @@
<thought>
<exploration>
## 文档表达思维探索
### 可视化表达思维
- **图形化思维**:用线框图、流程图、架构图表达设计思路
- **原型化思维**:通过可交互原型展示设计方案
- **故事化思维**:用用户故事和场景描述设计背景
- **分层表达思维**:从概念到细节的层次化文档结构
### 技术文档思维
- **规范化思维**:建立标准化的设计规范和组件库文档
- **实现导向思维**:文档要能指导开发人员准确实现设计
- **维护性思维**:文档要易于更新和维护
- **版本控制思维**:设计文档的版本管理和变更追踪
### 沟通协作思维
- **受众导向思维**:针对不同角色(开发、产品、测试)定制文档
- **共识建立思维**:通过文档建立团队对设计的共识
- **反馈整合思维**:文档要能承载和整合各方反馈
- **知识传承思维**:文档要能传承设计决策和经验
</exploration>
<reasoning>
## 文档表达推理逻辑
### 文档类型选择推理
- **设计规范文档**建立UI组件、交互模式、视觉规范
- **原型文档**:展示交互流程和界面状态变化
- **技术规格文档**:详细的实现规格和约束条件
- **用户指南文档**:面向最终用户的使用说明
### 表达方式推理
- **文字描述**:概念说明、设计理念、使用指南
- **图表展示**:架构图、流程图、状态图、时序图
- **代码示例**Qt代码片段、QML示例、样式表示例
- **视觉素材**:界面截图、图标资源、色彩板
### 工具选择推理
- **Markdown**:轻量级、版本控制友好的文档格式
- **Mermaid**:流程图、架构图的代码化表达
- **Figma/Sketch**:高保真原型和设计规范
- **Qt Designer**:界面设计和布局展示
</reasoning>
<challenge>
## 文档表达挑战
### 准确性挑战
- **设计意图传达**:如何准确传达设计背后的思考?
- **技术细节描述**:如何准确描述技术实现细节?
- **交互行为说明**:如何清晰描述复杂的交互行为?
- **视觉效果表达**:如何用文字准确描述视觉效果?
### 完整性挑战
- **覆盖度问题**:是否覆盖了所有重要的设计决策?
- **边界情况**:是否考虑了异常情况和边界条件?
- **更新及时性**:设计变更后文档是否及时更新?
- **版本一致性**:不同版本间的文档是否保持一致?
</challenge>
<plan>
## 文档表达能力提升计划
### 表达技能培养
1. **可视化技能**:掌握各种图表和原型工具
2. **技术写作技能**:提高技术文档的写作水平
3. **沟通技能**:提高跨角色沟通的效果
4. **工具掌握**:熟练使用各种文档和设计工具
### 文档标准建立
1. **模板标准化**:建立各类文档的标准模板
2. **命名规范**:统一文档和资源的命名规范
3. **版本管理**:建立文档版本管理机制
4. **质量标准**:建立文档质量评估标准
</plan>
</thought>

@ -0,0 +1,71 @@
<thought>
<exploration>
## UI设计思维探索
### 用户体验导向思维
- **用户中心设计**:始终以用户需求和使用场景为设计核心
- **信息架构思维**:合理组织界面信息层级和导航结构
- **交互流程思维**:考虑用户完成任务的完整路径和体验
- **可用性思维**:确保界面易用、直观、符合用户预期
### Qt框架特性思维
- **组件化思维**充分利用Qt的组件体系进行模块化设计
- **响应式思维**:考虑不同屏幕尺寸和分辨率的适配
- **主题化思维**:设计支持主题切换的界面系统
- **性能优化思维**:考虑渲染性能和内存占用优化
### 视觉设计思维
- **一致性原则**:保持界面风格、配色、字体的统一性
- **层次化思维**:通过视觉权重引导用户注意力
- **品牌化思维**:将品牌元素融入界面设计中
- **无障碍思维**:考虑色盲、视觉障碍用户的使用需求
</exploration>
<reasoning>
## 设计决策推理过程
### 需求分析推理
- **功能需求分析**:理解核心功能和业务逻辑
- **用户画像推理**:分析目标用户群体特征和偏好
- **场景分析推理**:考虑不同使用场景下的界面需求
- **约束条件推理**:技术约束、时间约束、资源约束的综合考虑
### 设计方案推理
- **布局方案推理**:基于内容重要性和用户习惯确定布局
- **交互方案推理**:选择最适合的交互模式和反馈机制
- **视觉方案推理**:配色、字体、图标的选择依据
- **技术实现推理**Qt技术栈下的最佳实现方案
</reasoning>
<challenge>
## 设计挑战与质疑
### 设计假设质疑
- **用户需求假设**:设计是否真正满足用户需求?
- **使用场景假设**:是否考虑了所有重要使用场景?
- **技术可行性**设计方案在Qt框架下是否可行
- **性能影响**:设计是否会影响应用性能?
### 设计权衡挑战
- **美观与实用性**:如何平衡视觉美观和功能实用?
- **简单与功能完整**:如何在简洁性和功能完整性间平衡?
- **一致性与创新性**:如何在保持一致性的同时创新?
- **开发成本与设计理想**:如何在资源约束下实现设计理想?
</challenge>
<plan>
## 设计思维结构化计划
### 思维框架建立
1. **用户研究思维**培养:深入理解用户心智模型
2. **系统性思维**训练:整体考虑设计系统的一致性
3. **迭代思维**建立:快速原型、测试、改进的循环
4. **协作思维**培养:与开发团队、产品团队的有效协作
### 设计方法论应用
1. **设计思维流程**:理解→定义→构思→原型→测试
2. **用户体验地图**:绘制用户完整的使用旅程
3. **信息架构设计**:构建清晰的信息层级结构
4. **交互设计原则**:应用交互设计的基本原则和模式
</plan>
</thought>

@ -4,11 +4,115 @@
"metadata": {
"version": "2.0.0",
"description": "project 级资源注册表",
"createdAt": "2025-06-21T10:53:24.437Z",
"updatedAt": "2025-06-21T10:53:24.439Z",
"resourceCount": 1
"createdAt": "2025-06-23T07:49:26.943Z",
"updatedAt": "2025-06-23T07:49:26.945Z",
"resourceCount": 9
},
"resources": [
{
"id": "qt-ui-designer",
"source": "project",
"protocol": "role",
"name": "Qt Ui Designer 角色",
"description": "专业角色,提供特定领域的专业能力",
"reference": "@project://.promptx/resource/domain/qt-ui-designer/qt-ui-designer.role.md",
"metadata": {
"createdAt": "2025-06-23T07:49:26.944Z",
"updatedAt": "2025-06-23T07:49:26.944Z",
"scannedAt": "2025-06-23T07:49:26.944Z"
}
},
{
"id": "documentation-expression",
"source": "project",
"protocol": "thought",
"name": "Documentation Expression 思维模式",
"description": "思维模式指导AI的思考方式",
"reference": "@project://.promptx/resource/domain/qt-ui-designer/thought/documentation-expression.thought.md",
"metadata": {
"createdAt": "2025-06-23T07:49:26.944Z",
"updatedAt": "2025-06-23T07:49:26.944Z",
"scannedAt": "2025-06-23T07:49:26.944Z"
}
},
{
"id": "ui-design-thinking",
"source": "project",
"protocol": "thought",
"name": "Ui Design Thinking 思维模式",
"description": "思维模式指导AI的思考方式",
"reference": "@project://.promptx/resource/domain/qt-ui-designer/thought/ui-design-thinking.thought.md",
"metadata": {
"createdAt": "2025-06-23T07:49:26.944Z",
"updatedAt": "2025-06-23T07:49:26.944Z",
"scannedAt": "2025-06-23T07:49:26.944Z"
}
},
{
"id": "design-documentation-process",
"source": "project",
"protocol": "execution",
"name": "Design Documentation Process 执行模式",
"description": "执行模式,定义具体的行为模式",
"reference": "@project://.promptx/resource/domain/qt-ui-designer/execution/design-documentation-process.execution.md",
"metadata": {
"createdAt": "2025-06-23T07:49:26.944Z",
"updatedAt": "2025-06-23T07:49:26.944Z",
"scannedAt": "2025-06-23T07:49:26.944Z"
}
},
{
"id": "qt-ui-design-workflow",
"source": "project",
"protocol": "execution",
"name": "Qt Ui Design Workflow 执行模式",
"description": "执行模式,定义具体的行为模式",
"reference": "@project://.promptx/resource/domain/qt-ui-designer/execution/qt-ui-design-workflow.execution.md",
"metadata": {
"createdAt": "2025-06-23T07:49:26.944Z",
"updatedAt": "2025-06-23T07:49:26.944Z",
"scannedAt": "2025-06-23T07:49:26.944Z"
}
},
{
"id": "design-documentation-methods",
"source": "project",
"protocol": "knowledge",
"name": "Design Documentation Methods 知识库",
"description": "知识库,提供专业知识和信息",
"reference": "@project://.promptx/resource/domain/qt-ui-designer/knowledge/design-documentation-methods.knowledge.md",
"metadata": {
"createdAt": "2025-06-23T07:49:26.945Z",
"updatedAt": "2025-06-23T07:49:26.945Z",
"scannedAt": "2025-06-23T07:49:26.945Z"
}
},
{
"id": "qt-ui-expertise",
"source": "project",
"protocol": "knowledge",
"name": "Qt Ui Expertise 知识库",
"description": "知识库,提供专业知识和信息",
"reference": "@project://.promptx/resource/domain/qt-ui-designer/knowledge/qt-ui-expertise.knowledge.md",
"metadata": {
"createdAt": "2025-06-23T07:49:26.945Z",
"updatedAt": "2025-06-23T07:49:26.945Z",
"scannedAt": "2025-06-23T07:49:26.945Z"
}
},
{
"id": "qt-ui-designer-simple",
"source": "project",
"protocol": "role",
"name": "Qt Ui Designer Simple 角色",
"description": "专业角色,提供特定领域的专业能力",
"reference": "@project://.promptx/resource/domain/qt-ui-designer-simple/qt-ui-designer-simple.role.md",
"metadata": {
"createdAt": "2025-06-23T07:49:26.945Z",
"updatedAt": "2025-06-23T07:49:26.945Z",
"scannedAt": "2025-06-23T07:49:26.945Z"
}
},
{
"id": "qt-ui-developer",
"source": "project",
@ -17,19 +121,22 @@
"description": "专业角色,提供特定领域的专业能力",
"reference": "@project://.promptx/resource/domain/qt-ui-developer/qt-ui-developer.role.md",
"metadata": {
"createdAt": "2025-06-21T10:53:24.438Z",
"updatedAt": "2025-06-21T10:53:24.438Z",
"scannedAt": "2025-06-21T10:53:24.438Z"
"createdAt": "2025-06-23T07:49:26.945Z",
"updatedAt": "2025-06-23T07:49:26.945Z",
"scannedAt": "2025-06-23T07:49:26.945Z"
}
}
],
"stats": {
"totalResources": 1,
"totalResources": 9,
"byProtocol": {
"role": 1
"role": 3,
"thought": 2,
"execution": 2,
"knowledge": 2
},
"bySource": {
"project": 1
"project": 9
}
}
}

@ -29,6 +29,7 @@ SOURCES += \
src/ui/components/DeviceCard.cpp \
src/ui/components/DeviceListPanel.cpp \
src/ui/components/SystemLogPanel.cpp \
src/ui/components/RightFunctionPanel.cpp \
src/utils/SystemLogger.cpp
# Header files - 按模块组织
@ -40,6 +41,7 @@ HEADERS += \
include/ui/components/DeviceCard.h \
include/ui/components/DeviceListPanel.h \
include/ui/components/SystemLogPanel.h \
include/ui/components/RightFunctionPanel.h \
include/utils/SystemLogger.h
# UI forms - 按模块组织

@ -0,0 +1,348 @@
# BattlefieldExplorationSystem 右侧功能面板设计规范
## 设计概述
为BattlefieldExplorationSystem项目的右侧功能面板设计包含战场探索、情报传输、敌情统计三大核心模块。
## 视觉设计系统
### 色彩方案(军事主题)
```css
/* 主色调 - 军事绿 */
--primary-color: #2E5D31;
--primary-hover: #245429;
--primary-active: #1a3d1d;
/* 功能色彩 */
--success-color: #4CAF50; /* 在线/成功状态 */
--warning-color: #FF8C00; /* 警告状态 */
--danger-color: #DC143C; /* 危险/敌情 */
--info-color: #1E88E5; /* 信息提示 */
/* 背景色彩 */
--panel-bg: #2A3F47; /* 面板主背景(深蓝灰) */
--module-bg: #354A54; /* 模块背景 */
--card-bg: #3D525E; /* 卡片背景 */
--hover-bg: #4A6572; /* 悬停背景 */
/* 文字色彩 */
--text-primary: #FFFFFF; /* 主要文字 */
--text-secondary: #B0BEC5; /* 次要文字 */
--text-muted: #78909C; /* 提示文字 */
/* 边框色彩 */
--border-color: #546E7A; /* 主边框 */
--border-accent: #2E5D31; /* 强调边框 */
```
### 字体系统
```css
--font-title: 16px; /* 模块标题 */
--font-subtitle: 14px; /* 子标题 */
--font-body: 12px; /* 正文 */
--font-small: 10px; /* 小号文字 */
--font-weight-normal: 400;
--font-weight-medium: 500;
--font-weight-bold: 600;
```
### 间距系统
```css
--spacing-xs: 4px;
--spacing-sm: 8px;
--spacing-md: 12px;
--spacing-lg: 16px;
--spacing-xl: 20px;
--spacing-xxl: 24px;
--panel-padding: 16px; /* 面板内边距 */
--module-gap: 12px; /* 模块间距 */
--card-padding: 12px; /* 卡片内边距 */
```
## 组件设计规范
### 1. 面板容器
```css
.function-panel {
width: 320px;
background: var(--panel-bg);
border-left: 2px solid var(--border-color);
padding: var(--panel-padding);
height: 100%;
overflow-y: auto;
}
.panel-title {
font-size: var(--font-title);
font-weight: var(--font-weight-bold);
color: var(--text-primary);
margin-bottom: var(--spacing-lg);
text-align: center;
border-bottom: 1px solid var(--border-color);
padding-bottom: var(--spacing-sm);
}
```
### 2. 功能模块卡片
```css
.module-card {
background: var(--module-bg);
border: 1px solid var(--border-color);
border-radius: 8px;
margin-bottom: var(--module-gap);
padding: var(--card-padding);
transition: all 0.3s ease;
}
.module-card:hover {
border-color: var(--border-accent);
background: var(--hover-bg);
}
.module-header {
display: flex;
align-items: center;
margin-bottom: var(--spacing-md);
}
.module-icon {
width: 20px;
height: 20px;
margin-right: var(--spacing-sm);
color: var(--primary-color);
}
.module-title {
font-size: var(--font-subtitle);
font-weight: var(--font-weight-medium);
color: var(--text-primary);
}
```
### 3. 设备控制卡片(战场探索模块)
```css
.device-controls {
display: flex;
gap: var(--spacing-sm);
margin-bottom: var(--spacing-md);
}
.device-card {
flex: 1;
background: var(--card-bg);
border: 1px solid var(--border-color);
border-radius: 6px;
padding: var(--spacing-md);
text-align: center;
cursor: pointer;
transition: all 0.2s ease;
}
.device-card:hover {
background: var(--hover-bg);
border-color: var(--primary-color);
}
.device-card.active {
border-color: var(--primary-color);
background: rgba(46, 93, 49, 0.2);
}
.device-icon {
width: 32px;
height: 32px;
margin: 0 auto var(--spacing-xs);
background-size: contain;
}
.device-name {
font-size: var(--font-body);
color: var(--text-primary);
margin-bottom: var(--spacing-xs);
}
.device-status {
font-size: var(--font-small);
color: var(--text-muted);
}
```
### 4. 功能按钮组
```css
.function-buttons {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--spacing-sm);
margin-top: var(--spacing-md);
}
.function-btn {
background: var(--primary-color);
color: var(--text-primary);
border: none;
border-radius: 4px;
padding: var(--spacing-sm) var(--spacing-md);
font-size: var(--font-body);
cursor: pointer;
transition: all 0.2s ease;
display: flex;
align-items: center;
justify-content: center;
gap: var(--spacing-xs);
}
.function-btn:hover {
background: var(--primary-hover);
}
.function-btn:active {
background: var(--primary-active);
}
.function-btn:disabled {
background: var(--text-muted);
cursor: not-allowed;
}
/* 不同类型按钮 */
.function-btn.warning {
background: var(--warning-color);
}
.function-btn.danger {
background: var(--danger-color);
}
.function-btn.info {
background: var(--info-color);
}
```
### 5. 状态指示器
```css
.status-indicator {
display: inline-block;
width: 8px;
height: 8px;
border-radius: 50%;
margin-right: var(--spacing-xs);
}
.status-online {
background: var(--success-color);
box-shadow: 0 0 4px var(--success-color);
}
.status-warning {
background: var(--warning-color);
animation: blink 1s infinite;
}
.status-offline {
background: var(--text-muted);
}
@keyframes blink {
0%, 50% { opacity: 1; }
51%, 100% { opacity: 0.3; }
}
```
### 6. 统计信息面板
```css
.stats-panel {
background: var(--card-bg);
border-radius: 6px;
padding: var(--spacing-md);
margin-top: var(--spacing-md);
}
.stat-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: var(--spacing-xs) 0;
border-bottom: 1px solid var(--border-color);
}
.stat-item:last-child {
border-bottom: none;
}
.stat-label {
font-size: var(--font-body);
color: var(--text-secondary);
}
.stat-value {
font-size: var(--font-body);
font-weight: var(--font-weight-medium);
color: var(--text-primary);
}
.stat-value.danger {
color: var(--danger-color);
}
.stat-value.warning {
color: var(--warning-color);
}
.stat-value.success {
color: var(--success-color);
}
```
## 模块具体设计
### 战场探索模块
- **机器狗控制区域**:自主建图、导航避障功能按钮
- **无人机控制区域**:照片传输、人物识别功能按钮
- **状态显示**:设备在线状态、电池电量、信号强度
### 情报传输模块
- **通话控制**:开始通话、结束通话、静音按钮
- **频道设置**:频道选择、音量调节
- **通话状态**:当前通话状态、通话时长
### 敌情统计模块
- **统计信息**:已发现目标数量、威胁等级分布
- **快速操作**刷新数据、导出报告、AI分析
- **可视化图表**:敌情分布图、时间趋势图
## 交互设计
### 状态反馈
- **悬停效果**:按钮和卡片悬停时边框高亮
- **点击反馈**:按钮点击时的缩放效果
- **状态指示**:不同颜色表示不同的设备和功能状态
### 响应式考虑
- **固定宽度**320px适合1920x1080及以上分辨率
- **滚动支持**:内容超出时支持垂直滚动
- **最小高度**:每个模块保持合适的最小高度
## 技术实现要点
### Qt实现建议
- 使用`QWidget`作为主容器
- 使用`QVBoxLayout`进行垂直布局
- 使用`QGroupBox`或自定义`QFrame`实现模块卡片
- 使用`QGridLayout`实现按钮网格布局
- 使用QSS样式表实现视觉效果
### 信号槽设计
```cpp
// 主要信号定义
signals:
void startMapping(); // 开始建图
void startNavigation(); // 开始导航
void startPhotoTransmission(); // 开始照片传输
void startPersonRecognition(); // 开始人物识别
void startVoiceCall(); // 开始语音通话
void refreshEnemyStats(); // 刷新敌情统计
void requestAIAnalysis(); // 请求AI分析
```
这个设计规范确保了界面的专业性、可用性和可扩展性,同时保持了军事应用的严肃性和实用性。

@ -0,0 +1,682 @@
// RightFunctionPanel.h
#ifndef RIGHTFUNCTIONPANEL_H
#define RIGHTFUNCTIONPANEL_H
#include <QWidget>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGridLayout>
#include <QGroupBox>
#include <QLabel>
#include <QPushButton>
#include <QFrame>
#include <QProgressBar>
#include <QSlider>
class ModuleCard : public QFrame
{
Q_OBJECT
public:
explicit ModuleCard(const QString &title, const QString &icon, QWidget *parent = nullptr);
void addContent(QWidget *content);
private:
QVBoxLayout *m_contentLayout;
QLabel *m_titleLabel;
};
class DeviceCard : public QFrame
{
Q_OBJECT
public:
explicit DeviceCard(const QString &name, const QString &iconPath, QWidget *parent = nullptr);
void setStatus(const QString &status, const QColor &color);
void setActive(bool active);
signals:
void deviceSelected(const QString &deviceName);
protected:
void mousePressEvent(QMouseEvent *event) override;
void paintEvent(QPaintEvent *event) override;
private:
QString m_deviceName;
QLabel *m_iconLabel;
QLabel *m_nameLabel;
QLabel *m_statusLabel;
bool m_isActive = false;
};
class RightFunctionPanel : public QWidget
{
Q_OBJECT
public:
explicit RightFunctionPanel(QWidget *parent = nullptr);
signals:
// 战场探索信号
void startMapping();
void stopMapping();
void startNavigation();
void stopNavigation();
void startPhotoTransmission();
void stopPhotoTransmission();
void startPersonRecognition();
void stopPersonRecognition();
// 情报传输信号
void startVoiceCall();
void endVoiceCall();
void muteCall(bool muted);
void setCallVolume(int volume);
// 敌情统计信号
void refreshEnemyStats();
void exportReport();
void requestAIAnalysis();
public slots:
void updateEnemyStats(int totalEnemies, const QString &threatLevel);
void updateDeviceStatus(const QString &deviceName, bool online, int battery);
private slots:
void onDeviceSelected(const QString &deviceName);
void onMappingToggle();
void onNavigationToggle();
void onPhotoTransmissionToggle();
void onPersonRecognitionToggle();
void onVoiceCallToggle();
void onRefreshStats();
void onAIAnalysis();
private:
void setupUI();
void setupBattlefieldExplorationModule();
void setupIntelligenceModule();
void setupEnemyStatsModule();
void applyStyles();
// UI组件
QVBoxLayout *m_mainLayout;
// 战场探索模块
ModuleCard *m_explorationCard;
DeviceCard *m_robotDogCard;
DeviceCard *m_droneCard;
QPushButton *m_mappingBtn;
QPushButton *m_navigationBtn;
QPushButton *m_photoBtn;
QPushButton *m_recognitionBtn;
QString m_selectedDevice;
// 情报传输模块
ModuleCard *m_intelligenceCard;
QPushButton *m_voiceCallBtn;
QPushButton *m_muteBtn;
QSlider *m_volumeSlider;
QLabel *m_callStatusLabel;
bool m_isInCall = false;
// 敌情统计模块
ModuleCard *m_statsCard;
QLabel *m_totalEnemiesLabel;
QLabel *m_threatLevelLabel;
QPushButton *m_refreshBtn;
QPushButton *m_aiAnalysisBtn;
QPushButton *m_exportBtn;
};
#endif // RIGHTFUNCTIONPANEL_H
// RightFunctionPanel.cpp
#include "RightFunctionPanel.h"
#include <QMouseEvent>
#include <QPainter>
#include <QTimer>
// ModuleCard实现
ModuleCard::ModuleCard(const QString &title, const QString &icon, QWidget *parent)
: QFrame(parent)
{
setObjectName("ModuleCard");
setFrameStyle(QFrame::StyledPanel);
QVBoxLayout *layout = new QVBoxLayout(this);
layout->setSpacing(12);
layout->setContentsMargins(12, 12, 12, 12);
// 标题栏
QHBoxLayout *headerLayout = new QHBoxLayout();
QLabel *iconLabel = new QLabel();
iconLabel->setObjectName("ModuleIcon");
iconLabel->setText(icon); // 使用Unicode图标或设置图片
iconLabel->setFixedSize(20, 20);
m_titleLabel = new QLabel(title);
m_titleLabel->setObjectName("ModuleTitle");
headerLayout->addWidget(iconLabel);
headerLayout->addWidget(m_titleLabel);
headerLayout->addStretch();
layout->addLayout(headerLayout);
// 内容区域
m_contentLayout = new QVBoxLayout();
m_contentLayout->setSpacing(8);
layout->addLayout(m_contentLayout);
}
void ModuleCard::addContent(QWidget *content)
{
m_contentLayout->addWidget(content);
}
// DeviceCard实现
DeviceCard::DeviceCard(const QString &name, const QString &iconPath, QWidget *parent)
: QFrame(parent), m_deviceName(name)
{
setObjectName("DeviceCard");
setFrameStyle(QFrame::StyledPanel);
setCursor(Qt::PointingHandCursor);
setFixedHeight(80);
QVBoxLayout *layout = new QVBoxLayout(this);
layout->setAlignment(Qt::AlignCenter);
layout->setSpacing(4);
m_iconLabel = new QLabel();
m_iconLabel->setObjectName("DeviceIcon");
m_iconLabel->setFixedSize(32, 32);
m_iconLabel->setAlignment(Qt::AlignCenter);
// 设置图标,这里用文字代替
m_iconLabel->setText(name.contains("机器狗") ? "🐕" : "🚁");
m_nameLabel = new QLabel(name);
m_nameLabel->setObjectName("DeviceName");
m_nameLabel->setAlignment(Qt::AlignCenter);
m_statusLabel = new QLabel("离线");
m_statusLabel->setObjectName("DeviceStatus");
m_statusLabel->setAlignment(Qt::AlignCenter);
layout->addWidget(m_iconLabel);
layout->addWidget(m_nameLabel);
layout->addWidget(m_statusLabel);
}
void DeviceCard::setStatus(const QString &status, const QColor &color)
{
m_statusLabel->setText(status);
m_statusLabel->setStyleSheet(QString("color: %1;").arg(color.name()));
}
void DeviceCard::setActive(bool active)
{
m_isActive = active;
update();
}
void DeviceCard::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
emit deviceSelected(m_deviceName);
}
QFrame::mousePressEvent(event);
}
void DeviceCard::paintEvent(QPaintEvent *event)
{
QFrame::paintEvent(event);
if (m_isActive) {
QPainter painter(this);
painter.setPen(QPen(QColor("#2E5D31"), 2));
painter.drawRect(rect().adjusted(1, 1, -1, -1));
}
}
// RightFunctionPanel实现
RightFunctionPanel::RightFunctionPanel(QWidget *parent)
: QWidget(parent)
{
setupUI();
applyStyles();
}
void RightFunctionPanel::setupUI()
{
m_mainLayout = new QVBoxLayout(this);
m_mainLayout->setSpacing(12);
m_mainLayout->setContentsMargins(16, 16, 16, 16);
// 面板标题
QLabel *titleLabel = new QLabel("功能面板");
titleLabel->setObjectName("PanelTitle");
titleLabel->setAlignment(Qt::AlignCenter);
m_mainLayout->addWidget(titleLabel);
setupBattlefieldExplorationModule();
setupIntelligenceModule();
setupEnemyStatsModule();
m_mainLayout->addStretch();
}
void RightFunctionPanel::setupBattlefieldExplorationModule()
{
m_explorationCard = new ModuleCard("战场探索", "🔍", this);
// 设备选择
QHBoxLayout *deviceLayout = new QHBoxLayout();
m_robotDogCard = new DeviceCard("机器狗", "robot_dog.png", this);
m_droneCard = new DeviceCard("无人机", "drone.png", this);
connect(m_robotDogCard, &DeviceCard::deviceSelected, this, &RightFunctionPanel::onDeviceSelected);
connect(m_droneCard, &DeviceCard::deviceSelected, this, &RightFunctionPanel::onDeviceSelected);
deviceLayout->addWidget(m_robotDogCard);
deviceLayout->addWidget(m_droneCard);
QWidget *deviceWidget = new QWidget();
deviceWidget->setLayout(deviceLayout);
m_explorationCard->addContent(deviceWidget);
// 功能按钮
QGridLayout *buttonLayout = new QGridLayout();
m_mappingBtn = new QPushButton("自主建图");
m_navigationBtn = new QPushButton("导航避障");
m_photoBtn = new QPushButton("照片传输");
m_recognitionBtn = new QPushButton("人物识别");
// 设置按钮样式类名
m_mappingBtn->setObjectName("FunctionBtn");
m_navigationBtn->setObjectName("FunctionBtn");
m_photoBtn->setObjectName("FunctionBtn");
m_recognitionBtn->setObjectName("FunctionBtn");
buttonLayout->addWidget(m_mappingBtn, 0, 0);
buttonLayout->addWidget(m_navigationBtn, 0, 1);
buttonLayout->addWidget(m_photoBtn, 1, 0);
buttonLayout->addWidget(m_recognitionBtn, 1, 1);
connect(m_mappingBtn, &QPushButton::clicked, this, &RightFunctionPanel::onMappingToggle);
connect(m_navigationBtn, &QPushButton::clicked, this, &RightFunctionPanel::onNavigationToggle);
connect(m_photoBtn, &QPushButton::clicked, this, &RightFunctionPanel::onPhotoTransmissionToggle);
connect(m_recognitionBtn, &QPushButton::clicked, this, &RightFunctionPanel::onPersonRecognitionToggle);
QWidget *buttonWidget = new QWidget();
buttonWidget->setLayout(buttonLayout);
m_explorationCard->addContent(buttonWidget);
m_mainLayout->addWidget(m_explorationCard);
}
void RightFunctionPanel::setupIntelligenceModule()
{
m_intelligenceCard = new ModuleCard("情报传输", "📡", this);
// 通话控制
QHBoxLayout *callLayout = new QHBoxLayout();
m_voiceCallBtn = new QPushButton("开始通话");
m_muteBtn = new QPushButton("静音");
m_voiceCallBtn->setObjectName("FunctionBtn");
m_muteBtn->setObjectName("FunctionBtn");
m_muteBtn->setEnabled(false);
callLayout->addWidget(m_voiceCallBtn);
callLayout->addWidget(m_muteBtn);
connect(m_voiceCallBtn, &QPushButton::clicked, this, &RightFunctionPanel::onVoiceCallToggle);
QWidget *callWidget = new QWidget();
callWidget->setLayout(callLayout);
m_intelligenceCard->addContent(callWidget);
// 音量控制
QHBoxLayout *volumeLayout = new QHBoxLayout();
QLabel *volumeLabel = new QLabel("音量:");
m_volumeSlider = new QSlider(Qt::Horizontal);
m_volumeSlider->setRange(0, 100);
m_volumeSlider->setValue(70);
volumeLayout->addWidget(volumeLabel);
volumeLayout->addWidget(m_volumeSlider);
QWidget *volumeWidget = new QWidget();
volumeWidget->setLayout(volumeLayout);
m_intelligenceCard->addContent(volumeWidget);
// 通话状态
m_callStatusLabel = new QLabel("未连接");
m_callStatusLabel->setObjectName("CallStatus");
m_intelligenceCard->addContent(m_callStatusLabel);
m_mainLayout->addWidget(m_intelligenceCard);
}
void RightFunctionPanel::setupEnemyStatsModule()
{
m_statsCard = new ModuleCard("敌情统计", "📊", this);
// 统计信息
QVBoxLayout *statsLayout = new QVBoxLayout();
m_totalEnemiesLabel = new QLabel("已发现目标: 0");
m_threatLevelLabel = new QLabel("威胁等级: 无");
m_totalEnemiesLabel->setObjectName("StatLabel");
m_threatLevelLabel->setObjectName("StatLabel");
statsLayout->addWidget(m_totalEnemiesLabel);
statsLayout->addWidget(m_threatLevelLabel);
QWidget *statsWidget = new QWidget();
statsWidget->setLayout(statsLayout);
m_statsCard->addContent(statsWidget);
// 操作按钮
QHBoxLayout *statsButtonLayout = new QHBoxLayout();
m_refreshBtn = new QPushButton("刷新");
m_aiAnalysisBtn = new QPushButton("AI分析");
m_exportBtn = new QPushButton("导出报告");
m_refreshBtn->setObjectName("FunctionBtn");
m_aiAnalysisBtn->setObjectName("FunctionBtn");
m_exportBtn->setObjectName("FunctionBtn");
statsButtonLayout->addWidget(m_refreshBtn);
statsButtonLayout->addWidget(m_aiAnalysisBtn);
connect(m_refreshBtn, &QPushButton::clicked, this, &RightFunctionPanel::onRefreshStats);
connect(m_aiAnalysisBtn, &QPushButton::clicked, this, &RightFunctionPanel::onAIAnalysis);
QWidget *statsButtonWidget = new QWidget();
statsButtonWidget->setLayout(statsButtonLayout);
m_statsCard->addContent(statsButtonWidget);
// 导出按钮单独一行
m_statsCard->addContent(m_exportBtn);
m_mainLayout->addWidget(m_statsCard);
}
void RightFunctionPanel::applyStyles()
{
QString styles = R"(
QWidget {
font-family: "Microsoft YaHei", "SimHei", sans-serif;
}
RightFunctionPanel {
background-color: #2A3F47;
border-left: 2px solid #546E7A;
}
#PanelTitle {
font-size: 16px;
font-weight: bold;
color: #FFFFFF;
border-bottom: 1px solid #546E7A;
padding-bottom: 8px;
margin-bottom: 12px;
}
#ModuleCard {
background-color: #354A54;
border: 1px solid #546E7A;
border-radius: 8px;
padding: 12px;
}
#ModuleCard:hover {
border-color: #2E5D31;
background-color: #4A6572;
}
#ModuleTitle {
font-size: 14px;
font-weight: 500;
color: #FFFFFF;
}
#ModuleIcon {
font-size: 16px;
color: #2E5D31;
}
#DeviceCard {
background-color: #3D525E;
border: 1px solid #546E7A;
border-radius: 6px;
padding: 8px;
}
#DeviceCard:hover {
background-color: #4A6572;
border-color: #2E5D31;
}
#DeviceName {
font-size: 12px;
color: #FFFFFF;
font-weight: 500;
}
#DeviceStatus {
font-size: 10px;
color: #78909C;
}
#FunctionBtn {
background-color: #2E5D31;
color: #FFFFFF;
border: none;
border-radius: 4px;
padding: 8px 12px;
font-size: 12px;
font-weight: 500;
min-height: 32px;
}
#FunctionBtn:hover {
background-color: #245429;
}
#FunctionBtn:pressed {
background-color: #1a3d1d;
}
#FunctionBtn:disabled {
background-color: #78909C;
}
#StatLabel {
font-size: 12px;
color: #B0BEC5;
padding: 4px 0;
}
#CallStatus {
font-size: 11px;
color: #78909C;
font-style: italic;
text-align: center;
}
QSlider::groove:horizontal {
border: 1px solid #546E7A;
height: 4px;
background: #3D525E;
border-radius: 2px;
}
QSlider::handle:horizontal {
background: #2E5D31;
border: 1px solid #546E7A;
width: 12px;
margin: -4px 0;
border-radius: 6px;
}
QSlider::handle:horizontal:hover {
background: #245429;
}
)";
setStyleSheet(styles);
}
// 槽函数实现
void RightFunctionPanel::onDeviceSelected(const QString &deviceName)
{
m_selectedDevice = deviceName;
// 更新设备选择状态
m_robotDogCard->setActive(deviceName.contains("机器狗"));
m_droneCard->setActive(deviceName.contains("无人机"));
// 根据设备类型启用/禁用相应按钮
bool isRobotDog = deviceName.contains("机器狗");
m_mappingBtn->setEnabled(isRobotDog);
m_navigationBtn->setEnabled(isRobotDog);
m_photoBtn->setEnabled(!isRobotDog);
m_recognitionBtn->setEnabled(!isRobotDog);
}
void RightFunctionPanel::onMappingToggle()
{
static bool isMappingActive = false;
isMappingActive = !isMappingActive;
m_mappingBtn->setText(isMappingActive ? "停止建图" : "自主建图");
if (isMappingActive) {
emit startMapping();
} else {
emit stopMapping();
}
}
void RightFunctionPanel::onNavigationToggle()
{
static bool isNavigationActive = false;
isNavigationActive = !isNavigationActive;
m_navigationBtn->setText(isNavigationActive ? "停止导航" : "导航避障");
if (isNavigationActive) {
emit startNavigation();
} else {
emit stopNavigation();
}
}
void RightFunctionPanel::onPhotoTransmissionToggle()
{
static bool isTransmissionActive = false;
isTransmissionActive = !isTransmissionActive;
m_photoBtn->setText(isTransmissionActive ? "停止传输" : "照片传输");
if (isTransmissionActive) {
emit startPhotoTransmission();
} else {
emit stopPhotoTransmission();
}
}
void RightFunctionPanel::onPersonRecognitionToggle()
{
static bool isRecognitionActive = false;
isRecognitionActive = !isRecognitionActive;
m_recognitionBtn->setText(isRecognitionActive ? "停止识别" : "人物识别");
if (isRecognitionActive) {
emit startPersonRecognition();
} else {
emit stopPersonRecognition();
}
}
void RightFunctionPanel::onVoiceCallToggle()
{
m_isInCall = !m_isInCall;
m_voiceCallBtn->setText(m_isInCall ? "结束通话" : "开始通话");
m_muteBtn->setEnabled(m_isInCall);
m_callStatusLabel->setText(m_isInCall ? "通话中..." : "未连接");
if (m_isInCall) {
emit startVoiceCall();
} else {
emit endVoiceCall();
}
}
void RightFunctionPanel::onRefreshStats()
{
emit refreshEnemyStats();
// 模拟刷新效果
m_refreshBtn->setText("刷新中...");
m_refreshBtn->setEnabled(false);
QTimer::singleShot(2000, [this]() {
m_refreshBtn->setText("刷新");
m_refreshBtn->setEnabled(true);
});
}
void RightFunctionPanel::onAIAnalysis()
{
emit requestAIAnalysis();
// 显示分析状态
m_aiAnalysisBtn->setText("分析中...");
m_aiAnalysisBtn->setEnabled(false);
QTimer::singleShot(3000, [this]() {
m_aiAnalysisBtn->setText("AI分析");
m_aiAnalysisBtn->setEnabled(true);
});
}
void RightFunctionPanel::updateEnemyStats(int totalEnemies, const QString &threatLevel)
{
m_totalEnemiesLabel->setText(QString("已发现目标: %1").arg(totalEnemies));
m_threatLevelLabel->setText(QString("威胁等级: %1").arg(threatLevel));
// 根据威胁等级设置颜色
if (threatLevel == "") {
m_threatLevelLabel->setStyleSheet("color: #DC143C;");
} else if (threatLevel == "") {
m_threatLevelLabel->setStyleSheet("color: #FF8C00;");
} else {
m_threatLevelLabel->setStyleSheet("color: #4CAF50;");
}
}
void RightFunctionPanel::updateDeviceStatus(const QString &deviceName, bool online, int battery)
{
DeviceCard *deviceCard = nullptr;
if (deviceName.contains("机器狗")) {
deviceCard = m_robotDogCard;
} else if (deviceName.contains("无人机")) {
deviceCard = m_droneCard;
}
if (deviceCard) {
if (online) {
deviceCard->setStatus(QString("在线 %1%").arg(battery), QColor("#4CAF50"));
} else {
deviceCard->setStatus("离线", QColor("#78909C"));
}
}
}
#include "RightFunctionPanel.moc"

@ -0,0 +1,333 @@
/**
* @file RightFunctionPanel.h
* @brief
* @author BattlefieldExplorationSystem Team
* @date 2024-01-15
* @version 1.0
*
*
* -
* -
* - AI
*
* @note Qt GUI
* @since 1.0
*/
#ifndef RIGHTFUNCTIONPANEL_H
#define RIGHTFUNCTIONPANEL_H
#include <QWidget>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGridLayout>
#include <QGroupBox>
#include <QLabel>
#include <QPushButton>
#include <QFrame>
#include <QProgressBar>
#include <QSlider>
/**
* @class ModuleCard
* @brief
*
*
*/
class ModuleCard : public QFrame
{
Q_OBJECT
public:
/**
* @brief
* @param title
* @param icon Unicode
* @param parent
*/
explicit ModuleCard(const QString &title, const QString &icon, QWidget *parent = nullptr);
/**
* @brief
* @param content
*/
void addContent(QWidget *content);
private:
QVBoxLayout *m_contentLayout; ///< 内容区域布局
QLabel *m_titleLabel; ///< 标题标签
};
/**
* @class RightDeviceCard
* @brief
*
*
*/
class RightDeviceCard : public QFrame
{
Q_OBJECT
public:
/**
* @brief
* @param name
* @param iconPath
* @param parent
*/
explicit RightDeviceCard(const QString &name, const QString &iconPath, QWidget *parent = nullptr);
/**
* @brief
* @param status
* @param color
*/
void setStatus(const QString &status, const QColor &color);
/**
* @brief
* @param active
*/
void setActive(bool active);
signals:
/**
* @brief
* @param deviceName
*/
void deviceSelected(const QString &deviceName);
protected:
/**
* @brief
* @param event
*/
void mousePressEvent(QMouseEvent *event) override;
/**
* @brief
* @param event
*/
void paintEvent(QPaintEvent *event) override;
private:
QString m_deviceName; ///< 设备名称
QLabel *m_iconLabel; ///< 图标标签
QLabel *m_nameLabel; ///< 名称标签
QLabel *m_statusLabel; ///< 状态标签
bool m_isActive = false; ///< 是否选中状态
};
/**
* @class RightFunctionPanel
* @brief
*
*
*/
class RightFunctionPanel : public QWidget
{
Q_OBJECT
public:
/**
* @brief
* @param parent
*/
explicit RightFunctionPanel(QWidget *parent = nullptr);
signals:
// 战场探索模块信号
/**
* @brief
*/
void startMapping();
/**
* @brief
*/
void stopMapping();
/**
* @brief
*/
void startNavigation();
/**
* @brief
*/
void stopNavigation();
/**
* @brief
*/
void startPhotoTransmission();
/**
* @brief
*/
void stopPhotoTransmission();
/**
* @brief
*/
void startPersonRecognition();
/**
* @brief
*/
void stopPersonRecognition();
// 情报传输模块信号
/**
* @brief
*/
void startVoiceCall();
/**
* @brief
*/
void endVoiceCall();
/**
* @brief
* @param muted
*/
void muteCall(bool muted);
/**
* @brief
* @param volume 0-100
*/
void setCallVolume(int volume);
// 敌情统计模块信号
/**
* @brief
*/
void refreshEnemyStats();
/**
* @brief
*/
void exportReport();
/**
* @brief AI
*/
void requestAIAnalysis();
public slots:
/**
* @brief
* @param totalEnemies
* @param threatLevel
*/
void updateEnemyStats(int totalEnemies, const QString &threatLevel);
/**
* @brief
* @param deviceName
* @param online 线
* @param battery
*/
void updateDeviceStatus(const QString &deviceName, bool online, int battery);
private slots:
/**
* @brief
* @param deviceName
*/
void onDeviceSelected(const QString &deviceName);
/**
* @brief
*/
void onMappingToggle();
/**
* @brief
*/
void onNavigationToggle();
/**
* @brief
*/
void onPhotoTransmissionToggle();
/**
* @brief
*/
void onPersonRecognitionToggle();
/**
* @brief
*/
void onVoiceCallToggle();
/**
* @brief
*/
void onRefreshStats();
/**
* @brief AI
*/
void onAIAnalysis();
private:
/**
* @brief UI
*/
void setupUI();
/**
* @brief
*/
void setupBattlefieldExplorationModule();
/**
* @brief
*/
void setupIntelligenceModule();
/**
* @brief
*/
void setupEnemyStatsModule();
/**
* @brief
*/
void applyStyles();
// UI组件
QVBoxLayout *m_mainLayout; ///< 主布局
// 战场探索模块
ModuleCard *m_explorationCard; ///< 探索模块卡片
RightDeviceCard *m_robotDogCard; ///< 机器狗设备卡片
RightDeviceCard *m_droneCard; ///< 无人机设备卡片
QPushButton *m_mappingBtn; ///< 建图按钮
QPushButton *m_navigationBtn; ///< 导航按钮
QPushButton *m_photoBtn; ///< 照片传输按钮
QPushButton *m_recognitionBtn; ///< 人物识别按钮
QString m_selectedDevice; ///< 当前选择的设备
// 情报传输模块
ModuleCard *m_intelligenceCard; ///< 情报模块卡片
QPushButton *m_voiceCallBtn; ///< 语音通话按钮
QPushButton *m_muteBtn; ///< 静音按钮
QSlider *m_volumeSlider; ///< 音量滑块
QLabel *m_callStatusLabel; ///< 通话状态标签
bool m_isInCall = false; ///< 是否在通话中
// 敌情统计模块
ModuleCard *m_statsCard; ///< 统计模块卡片
QLabel *m_totalEnemiesLabel; ///< 敌人总数标签
QLabel *m_threatLevelLabel; ///< 威胁等级标签
QPushButton *m_refreshBtn; ///< 刷新按钮
QPushButton *m_aiAnalysisBtn; ///< AI分析按钮
QPushButton *m_exportBtn; ///< 导出按钮
};
#endif // RIGHTFUNCTIONPANEL_H

@ -42,6 +42,7 @@
// #include "AudioModule/IntelligenceUI.h" // 暂时注释掉,待实现
#include "ui/components/DeviceListPanel.h"
#include "ui/components/SystemLogPanel.h"
#include "ui/components/RightFunctionPanel.h"
// 标准库头文件
#include <string>
@ -221,6 +222,73 @@ private slots:
*/
void onAddDeviceRequested(const QString &deviceType);
private slots:
// 右侧功能面板信号处理槽函数
/**
* @brief
*/
void onStartMapping();
/**
* @brief
*/
void onStopMapping();
/**
* @brief
*/
void onStartNavigation();
/**
* @brief
*/
void onStopNavigation();
/**
* @brief
*/
void onStartPhotoTransmission();
/**
* @brief
*/
void onStopPhotoTransmission();
/**
* @brief
*/
void onStartPersonRecognition();
/**
* @brief
*/
void onStopPersonRecognition();
/**
* @brief
*/
void onStartVoiceCall();
/**
* @brief
*/
void onEndVoiceCall();
/**
* @brief
*/
void onRefreshEnemyStats();
/**
* @brief AI
*/
void onRequestAIAnalysis();
/**
* @brief
*/
void onExportReport();
private:
/**
* @brief UI
@ -237,6 +305,11 @@ private:
*/
void setupSystemLogPanel();
/**
* @brief
*/
void setupRightFunctionPanel();
/**
* @brief
*/
@ -257,6 +330,7 @@ private:
// IntelligenceUI *m_intelligenceUI; ///< 情报传达界面指针(暂时注释掉)
DeviceListPanel *m_deviceListPanel; ///< 设备列表面板组件
SystemLogPanel *m_systemLogPanel; ///< 系统日志面板组件
RightFunctionPanel *m_rightFunctionPanel; ///< 右侧功能面板组件
QSplitter *m_leftPanelSplitter; ///< 左侧面板分割器
QVector<QPair<QString, QString>> m_robotList; ///< 机器人列表(名称-IP地址对
QVector<QPair<QString, QString>> m_uavList; ///< 无人机列表(名称-IP地址对

@ -0,0 +1,631 @@
/**
* @file RightFunctionPanel.cpp
* @brief
* @author BattlefieldExplorationSystem Team
* @date 2024-01-15
* @version 1.0
*/
#include "ui/components/RightFunctionPanel.h"
#include <QMouseEvent>
#include <QPainter>
#include <QTimer>
// ModuleCard实现
ModuleCard::ModuleCard(const QString &title, const QString &icon, QWidget *parent)
: QFrame(parent)
{
setObjectName("ModuleCard");
setFrameStyle(QFrame::StyledPanel);
QVBoxLayout *layout = new QVBoxLayout(this);
layout->setSpacing(12);
layout->setContentsMargins(12, 12, 12, 12);
// 标题栏
QHBoxLayout *headerLayout = new QHBoxLayout();
QLabel *iconLabel = new QLabel();
iconLabel->setObjectName("ModuleIcon");
iconLabel->setText(icon); // 使用Unicode图标
iconLabel->setFixedSize(20, 20);
m_titleLabel = new QLabel(title);
m_titleLabel->setObjectName("ModuleTitle");
headerLayout->addWidget(iconLabel);
headerLayout->addWidget(m_titleLabel);
headerLayout->addStretch();
layout->addLayout(headerLayout);
// 内容区域
m_contentLayout = new QVBoxLayout();
m_contentLayout->setSpacing(8);
layout->addLayout(m_contentLayout);
}
void ModuleCard::addContent(QWidget *content)
{
m_contentLayout->addWidget(content);
}
// RightDeviceCard实现
RightDeviceCard::RightDeviceCard(const QString &name, const QString &iconPath, QWidget *parent)
: QFrame(parent), m_deviceName(name)
{
setObjectName("RightDeviceCard");
setFrameStyle(QFrame::StyledPanel);
setCursor(Qt::PointingHandCursor);
setFixedHeight(80);
QVBoxLayout *layout = new QVBoxLayout(this);
layout->setAlignment(Qt::AlignCenter);
layout->setSpacing(4);
m_iconLabel = new QLabel();
m_iconLabel->setObjectName("DeviceIcon");
m_iconLabel->setFixedSize(32, 32);
m_iconLabel->setAlignment(Qt::AlignCenter);
// 设置图标根据设备类型使用不同的Unicode字符
if (name.contains("机器狗") || name.contains("robot") || name.contains("dog")) {
m_iconLabel->setText("🐕");
m_iconLabel->setStyleSheet("font-size: 24px;");
} else if (name.contains("无人机") || name.contains("drone") || name.contains("uav")) {
m_iconLabel->setText("🚁");
m_iconLabel->setStyleSheet("font-size: 24px;");
} else {
m_iconLabel->setText("📡");
m_iconLabel->setStyleSheet("font-size: 24px;");
}
m_nameLabel = new QLabel(name);
m_nameLabel->setObjectName("DeviceName");
m_nameLabel->setAlignment(Qt::AlignCenter);
m_statusLabel = new QLabel("离线");
m_statusLabel->setObjectName("DeviceStatus");
m_statusLabel->setAlignment(Qt::AlignCenter);
layout->addWidget(m_iconLabel);
layout->addWidget(m_nameLabel);
layout->addWidget(m_statusLabel);
}
void RightDeviceCard::setStatus(const QString &status, const QColor &color)
{
m_statusLabel->setText(status);
m_statusLabel->setStyleSheet(QString("color: %1;").arg(color.name()));
}
void RightDeviceCard::setActive(bool active)
{
m_isActive = active;
update();
}
void RightDeviceCard::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
emit deviceSelected(m_deviceName);
}
QFrame::mousePressEvent(event);
}
void RightDeviceCard::paintEvent(QPaintEvent *event)
{
QFrame::paintEvent(event);
if (m_isActive) {
QPainter painter(this);
painter.setPen(QPen(QColor("#2E5D31"), 2));
painter.drawRect(rect().adjusted(1, 1, -1, -1));
}
}
// RightFunctionPanel实现
RightFunctionPanel::RightFunctionPanel(QWidget *parent)
: QWidget(parent)
{
setupUI();
applyStyles();
}
void RightFunctionPanel::setupUI()
{
setFixedWidth(320);
m_mainLayout = new QVBoxLayout(this);
m_mainLayout->setSpacing(12);
m_mainLayout->setContentsMargins(16, 16, 16, 16);
// 面板标题
QLabel *titleLabel = new QLabel("功能面板");
titleLabel->setObjectName("PanelTitle");
titleLabel->setAlignment(Qt::AlignCenter);
m_mainLayout->addWidget(titleLabel);
setupBattlefieldExplorationModule();
setupIntelligenceModule();
setupEnemyStatsModule();
m_mainLayout->addStretch();
}
void RightFunctionPanel::setupBattlefieldExplorationModule()
{
m_explorationCard = new ModuleCard("战场探索", "🔍", this);
// 设备选择
QHBoxLayout *deviceLayout = new QHBoxLayout();
m_robotDogCard = new RightDeviceCard("机器狗", "", this);
m_droneCard = new RightDeviceCard("无人机", "", this);
connect(m_robotDogCard, &RightDeviceCard::deviceSelected, this, &RightFunctionPanel::onDeviceSelected);
connect(m_droneCard, &RightDeviceCard::deviceSelected, this, &RightFunctionPanel::onDeviceSelected);
deviceLayout->addWidget(m_robotDogCard);
deviceLayout->addWidget(m_droneCard);
QWidget *deviceWidget = new QWidget();
deviceWidget->setLayout(deviceLayout);
m_explorationCard->addContent(deviceWidget);
// 功能按钮
QGridLayout *buttonLayout = new QGridLayout();
m_mappingBtn = new QPushButton("自主建图");
m_navigationBtn = new QPushButton("导航避障");
m_photoBtn = new QPushButton("照片传输");
m_recognitionBtn = new QPushButton("人物识别");
// 设置按钮样式类名
m_mappingBtn->setObjectName("FunctionBtn");
m_navigationBtn->setObjectName("FunctionBtn");
m_photoBtn->setObjectName("FunctionBtn");
m_recognitionBtn->setObjectName("FunctionBtn");
// 初始状态:禁用所有按钮,等待设备选择
m_mappingBtn->setEnabled(false);
m_navigationBtn->setEnabled(false);
m_photoBtn->setEnabled(false);
m_recognitionBtn->setEnabled(false);
buttonLayout->addWidget(m_mappingBtn, 0, 0);
buttonLayout->addWidget(m_navigationBtn, 0, 1);
buttonLayout->addWidget(m_photoBtn, 1, 0);
buttonLayout->addWidget(m_recognitionBtn, 1, 1);
connect(m_mappingBtn, &QPushButton::clicked, this, &RightFunctionPanel::onMappingToggle);
connect(m_navigationBtn, &QPushButton::clicked, this, &RightFunctionPanel::onNavigationToggle);
connect(m_photoBtn, &QPushButton::clicked, this, &RightFunctionPanel::onPhotoTransmissionToggle);
connect(m_recognitionBtn, &QPushButton::clicked, this, &RightFunctionPanel::onPersonRecognitionToggle);
QWidget *buttonWidget = new QWidget();
buttonWidget->setLayout(buttonLayout);
m_explorationCard->addContent(buttonWidget);
m_mainLayout->addWidget(m_explorationCard);
}
void RightFunctionPanel::setupIntelligenceModule()
{
m_intelligenceCard = new ModuleCard("情报传输", "📡", this);
// 通话控制
QHBoxLayout *callLayout = new QHBoxLayout();
m_voiceCallBtn = new QPushButton("开始通话");
m_muteBtn = new QPushButton("静音");
m_voiceCallBtn->setObjectName("FunctionBtn");
m_muteBtn->setObjectName("FunctionBtn");
m_muteBtn->setEnabled(false);
callLayout->addWidget(m_voiceCallBtn);
callLayout->addWidget(m_muteBtn);
connect(m_voiceCallBtn, &QPushButton::clicked, this, &RightFunctionPanel::onVoiceCallToggle);
QWidget *callWidget = new QWidget();
callWidget->setLayout(callLayout);
m_intelligenceCard->addContent(callWidget);
// 音量控制
QHBoxLayout *volumeLayout = new QHBoxLayout();
QLabel *volumeLabel = new QLabel("音量:");
volumeLabel->setObjectName("VolumeLabel");
m_volumeSlider = new QSlider(Qt::Horizontal);
m_volumeSlider->setRange(0, 100);
m_volumeSlider->setValue(70);
volumeLayout->addWidget(volumeLabel);
volumeLayout->addWidget(m_volumeSlider);
QWidget *volumeWidget = new QWidget();
volumeWidget->setLayout(volumeLayout);
m_intelligenceCard->addContent(volumeWidget);
// 通话状态
m_callStatusLabel = new QLabel("未连接");
m_callStatusLabel->setObjectName("CallStatus");
m_callStatusLabel->setAlignment(Qt::AlignCenter);
m_intelligenceCard->addContent(m_callStatusLabel);
m_mainLayout->addWidget(m_intelligenceCard);
}
void RightFunctionPanel::setupEnemyStatsModule()
{
m_statsCard = new ModuleCard("敌情统计", "📊", this);
// 统计信息
QVBoxLayout *statsLayout = new QVBoxLayout();
m_totalEnemiesLabel = new QLabel("已发现目标: 0");
m_threatLevelLabel = new QLabel("威胁等级: 无");
m_totalEnemiesLabel->setObjectName("StatLabel");
m_threatLevelLabel->setObjectName("StatLabel");
statsLayout->addWidget(m_totalEnemiesLabel);
statsLayout->addWidget(m_threatLevelLabel);
QWidget *statsWidget = new QWidget();
statsWidget->setLayout(statsLayout);
m_statsCard->addContent(statsWidget);
// 操作按钮
QHBoxLayout *statsButtonLayout = new QHBoxLayout();
m_refreshBtn = new QPushButton("刷新");
m_aiAnalysisBtn = new QPushButton("AI分析");
m_refreshBtn->setObjectName("FunctionBtn");
m_aiAnalysisBtn->setObjectName("FunctionBtn");
statsButtonLayout->addWidget(m_refreshBtn);
statsButtonLayout->addWidget(m_aiAnalysisBtn);
connect(m_refreshBtn, &QPushButton::clicked, this, &RightFunctionPanel::onRefreshStats);
connect(m_aiAnalysisBtn, &QPushButton::clicked, this, &RightFunctionPanel::onAIAnalysis);
QWidget *statsButtonWidget = new QWidget();
statsButtonWidget->setLayout(statsButtonLayout);
m_statsCard->addContent(statsButtonWidget);
// 导出按钮单独一行
m_exportBtn = new QPushButton("导出报告");
m_exportBtn->setObjectName("FunctionBtn");
connect(m_exportBtn, &QPushButton::clicked, this, &RightFunctionPanel::exportReport);
m_statsCard->addContent(m_exportBtn);
m_mainLayout->addWidget(m_statsCard);
}
void RightFunctionPanel::applyStyles()
{
QString styles = R"(
QWidget {
font-family: "Microsoft YaHei", "SimHei", sans-serif;
}
RightFunctionPanel {
background: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:1,
stop:0 rgb(15, 22, 32), stop:1 rgb(25, 35, 45));
border-radius: 8px;
margin: 0px;
}
#PanelTitle {
font-size: 18px;
font-weight: bold;
color: #FFFFFF;
background: qlineargradient(x1:0, y1:0, x2:1, y2:1,
stop:0 rgba(82, 194, 242, 0.2),
stop:1 rgba(45, 120, 180, 0.2));
border: 1px solid rgba(82, 194, 242, 0.5);
border-radius: 8px;
padding: 12px;
margin-bottom: 16px;
}
#ModuleCard {
background: qlineargradient(x1:0, y1:0, x2:1, y2:1,
stop:0 rgba(30, 45, 55, 0.8),
stop:1 rgba(40, 58, 70, 0.8));
border: 1px solid rgba(82, 194, 242, 0.3);
border-radius: 12px;
padding: 16px;
margin-bottom: 12px;
}
#ModuleCard:hover {
border: 1px solid rgba(82, 194, 242, 0.6);
background: qlineargradient(x1:0, y1:0, x2:1, y2:1,
stop:0 rgba(35, 52, 62, 0.9),
stop:1 rgba(45, 65, 78, 0.9));
}
#ModuleTitle {
font-size: 14px;
font-weight: 500;
color: #FFFFFF;
}
#ModuleIcon {
font-size: 18px;
color: rgba(82, 194, 242, 0.8);
}
#RightDeviceCard {
background: qlineargradient(x1:0, y1:0, x2:1, y2:1,
stop:0 rgba(25, 38, 48, 0.8),
stop:1 rgba(35, 50, 62, 0.8));
border: 1px solid rgba(82, 194, 242, 0.4);
border-radius: 8px;
padding: 10px;
margin: 2px;
}
#RightDeviceCard:hover {
background: qlineargradient(x1:0, y1:0, x2:1, y2:1,
stop:0 rgba(30, 45, 55, 0.9),
stop:1 rgba(42, 60, 75, 0.9));
border: 1px solid rgba(82, 194, 242, 0.7);
}
#DeviceName {
font-size: 12px;
color: #FFFFFF;
font-weight: 500;
}
#DeviceStatus {
font-size: 10px;
color: #78909C;
}
#FunctionBtn {
background: qlineargradient(x1:0, y1:0, x2:0, y2:1,
stop:0 rgba(46, 125, 180, 0.8),
stop:1 rgba(35, 95, 140, 0.8));
color: #FFFFFF;
border: 1px solid rgba(82, 194, 242, 0.4);
border-radius: 6px;
padding: 10px 14px;
font-size: 12px;
font-weight: 500;
min-height: 36px;
}
#FunctionBtn:hover {
background: qlineargradient(x1:0, y1:0, x2:0, y2:1,
stop:0 rgba(52, 140, 200, 0.9),
stop:1 rgba(40, 110, 160, 0.9));
border: 1px solid rgba(82, 194, 242, 0.7);
}
#FunctionBtn:pressed {
background: qlineargradient(x1:0, y1:0, x2:0, y2:1,
stop:0 rgba(30, 85, 125, 0.9),
stop:1 rgba(25, 65, 95, 0.9));
}
#FunctionBtn:disabled {
background-color: rgba(120, 144, 156, 0.5);
color: rgba(158, 158, 158, 0.7);
border: 1px solid rgba(120, 144, 156, 0.3);
}
#StatLabel {
font-size: 12px;
color: #B0BEC5;
padding: 4px 0;
}
#CallStatus {
font-size: 11px;
color: #78909C;
font-style: italic;
}
#VolumeLabel {
font-size: 12px;
color: #B0BEC5;
}
QSlider::groove:horizontal {
border: 1px solid rgba(82, 194, 242, 0.3);
height: 6px;
background: qlineargradient(x1:0, y1:0, x2:1, y2:0,
stop:0 rgba(25, 38, 48, 0.8),
stop:1 rgba(35, 50, 62, 0.8));
border-radius: 3px;
}
QSlider::handle:horizontal {
background: qlineargradient(x1:0, y1:0, x2:0, y2:1,
stop:0 rgba(82, 194, 242, 0.9),
stop:1 rgba(45, 120, 180, 0.9));
border: 1px solid rgba(82, 194, 242, 0.6);
width: 16px;
margin: -5px 0;
border-radius: 8px;
}
QSlider::handle:horizontal:hover {
background: qlineargradient(x1:0, y1:0, x2:0, y2:1,
stop:0 rgba(100, 210, 255, 1.0),
stop:1 rgba(60, 140, 200, 1.0));
}
)";
setStyleSheet(styles);
}
// 槽函数实现
void RightFunctionPanel::onDeviceSelected(const QString &deviceName)
{
m_selectedDevice = deviceName;
// 更新设备选择状态
m_robotDogCard->setActive(deviceName.contains("机器狗") || deviceName.contains("robot") || deviceName.contains("dog"));
m_droneCard->setActive(deviceName.contains("无人机") || deviceName.contains("drone") || deviceName.contains("uav"));
// 根据设备类型启用/禁用相应按钮
bool isRobotDog = deviceName.contains("机器狗") || deviceName.contains("robot") || deviceName.contains("dog");
m_mappingBtn->setEnabled(isRobotDog);
m_navigationBtn->setEnabled(isRobotDog);
m_photoBtn->setEnabled(!isRobotDog);
m_recognitionBtn->setEnabled(!isRobotDog);
}
void RightFunctionPanel::onMappingToggle()
{
static bool isMappingActive = false;
isMappingActive = !isMappingActive;
m_mappingBtn->setText(isMappingActive ? "停止建图" : "自主建图");
m_mappingBtn->setStyleSheet(isMappingActive ?
"background-color: #DC143C;" :
"");
if (isMappingActive) {
emit startMapping();
} else {
emit stopMapping();
}
}
void RightFunctionPanel::onNavigationToggle()
{
static bool isNavigationActive = false;
isNavigationActive = !isNavigationActive;
m_navigationBtn->setText(isNavigationActive ? "停止导航" : "导航避障");
m_navigationBtn->setStyleSheet(isNavigationActive ?
"background-color: #DC143C;" :
"");
if (isNavigationActive) {
emit startNavigation();
} else {
emit stopNavigation();
}
}
void RightFunctionPanel::onPhotoTransmissionToggle()
{
static bool isTransmissionActive = false;
isTransmissionActive = !isTransmissionActive;
m_photoBtn->setText(isTransmissionActive ? "停止传输" : "照片传输");
m_photoBtn->setStyleSheet(isTransmissionActive ?
"background-color: #DC143C;" :
"");
if (isTransmissionActive) {
emit startPhotoTransmission();
} else {
emit stopPhotoTransmission();
}
}
void RightFunctionPanel::onPersonRecognitionToggle()
{
static bool isRecognitionActive = false;
isRecognitionActive = !isRecognitionActive;
m_recognitionBtn->setText(isRecognitionActive ? "停止识别" : "人物识别");
m_recognitionBtn->setStyleSheet(isRecognitionActive ?
"background-color: #DC143C;" :
"");
if (isRecognitionActive) {
emit startPersonRecognition();
} else {
emit stopPersonRecognition();
}
}
void RightFunctionPanel::onVoiceCallToggle()
{
m_isInCall = !m_isInCall;
m_voiceCallBtn->setText(m_isInCall ? "结束通话" : "开始通话");
m_voiceCallBtn->setStyleSheet(m_isInCall ?
"background-color: #DC143C;" :
"");
m_muteBtn->setEnabled(m_isInCall);
m_callStatusLabel->setText(m_isInCall ? "通话中..." : "未连接");
if (m_isInCall) {
emit startVoiceCall();
} else {
emit endVoiceCall();
}
}
void RightFunctionPanel::onRefreshStats()
{
emit refreshEnemyStats();
// 模拟刷新效果
m_refreshBtn->setText("刷新中...");
m_refreshBtn->setEnabled(false);
QTimer::singleShot(2000, [this]() {
m_refreshBtn->setText("刷新");
m_refreshBtn->setEnabled(true);
});
}
void RightFunctionPanel::onAIAnalysis()
{
emit requestAIAnalysis();
// 显示分析状态
m_aiAnalysisBtn->setText("分析中...");
m_aiAnalysisBtn->setEnabled(false);
QTimer::singleShot(3000, [this]() {
m_aiAnalysisBtn->setText("AI分析");
m_aiAnalysisBtn->setEnabled(true);
});
}
void RightFunctionPanel::updateEnemyStats(int totalEnemies, const QString &threatLevel)
{
m_totalEnemiesLabel->setText(QString("已发现目标: %1").arg(totalEnemies));
m_threatLevelLabel->setText(QString("威胁等级: %1").arg(threatLevel));
// 根据威胁等级设置颜色
if (threatLevel == "") {
m_threatLevelLabel->setStyleSheet("color: #DC143C; font-weight: bold;");
} else if (threatLevel == "") {
m_threatLevelLabel->setStyleSheet("color: #FF8C00; font-weight: bold;");
} else {
m_threatLevelLabel->setStyleSheet("color: #4CAF50; font-weight: bold;");
}
}
void RightFunctionPanel::updateDeviceStatus(const QString &deviceName, bool online, int battery)
{
RightDeviceCard *deviceCard = nullptr;
if (deviceName.contains("机器狗") || deviceName.contains("robot") || deviceName.contains("dog")) {
deviceCard = m_robotDogCard;
} else if (deviceName.contains("无人机") || deviceName.contains("drone") || deviceName.contains("uav")) {
deviceCard = m_droneCard;
}
if (deviceCard) {
if (online) {
if (battery > 50) {
deviceCard->setStatus(QString("在线 %1%").arg(battery), QColor("#4CAF50"));
} else if (battery > 20) {
deviceCard->setStatus(QString("在线 %1%").arg(battery), QColor("#FF8C00"));
} else {
deviceCard->setStatus(QString("在线 %1%").arg(battery), QColor("#DC143C"));
}
} else {
deviceCard->setStatus("离线", QColor("#78909C"));
}
}
}

@ -50,6 +50,7 @@ MainWindow::MainWindow(QWidget *parent)
, m_ui(new Ui::MainWindow)
, m_deviceListPanel(nullptr)
, m_systemLogPanel(nullptr)
, m_rightFunctionPanel(nullptr)
, m_leftPanelSplitter(nullptr)
// , m_intelligenceUI(nullptr) // 暂时注释掉
{
@ -91,6 +92,9 @@ void MainWindow::setupUI()
// 创建并集成SystemLogPanel和DeviceListPanel到左侧面板
setupSystemLogPanel();
// 创建并集成右侧功能面板
setupRightFunctionPanel();
// 恢复地图显示控制
setupMapDisplay();
// 注意原有的重复设备管理按钮已被移除功能集成在DeviceListPanel中
@ -176,6 +180,75 @@ void MainWindow::setupSystemLogPanel()
}
}
void MainWindow::setupRightFunctionPanel()
{
// 创建右侧功能面板
m_rightFunctionPanel = new RightFunctionPanel(this);
// 获取右侧面板的布局
QVBoxLayout *rightLayout = qobject_cast<QVBoxLayout*>(m_ui->rightPanel->layout());
if (rightLayout) {
// 彻底清除原有控件避免UI冗余
QLayoutItem *item;
while ((item = rightLayout->takeAt(0)) != nullptr) {
if (item->widget()) {
item->widget()->deleteLater();
}
delete item;
}
// 将右侧功能面板添加到右侧面板
rightLayout->addWidget(m_rightFunctionPanel);
// 连接右侧功能面板信号
// 战场探索模块信号
connect(m_rightFunctionPanel, &RightFunctionPanel::startMapping,
this, &MainWindow::onStartMapping);
connect(m_rightFunctionPanel, &RightFunctionPanel::stopMapping,
this, &MainWindow::onStopMapping);
connect(m_rightFunctionPanel, &RightFunctionPanel::startNavigation,
this, &MainWindow::onStartNavigation);
connect(m_rightFunctionPanel, &RightFunctionPanel::stopNavigation,
this, &MainWindow::onStopNavigation);
connect(m_rightFunctionPanel, &RightFunctionPanel::startPhotoTransmission,
this, &MainWindow::onStartPhotoTransmission);
connect(m_rightFunctionPanel, &RightFunctionPanel::stopPhotoTransmission,
this, &MainWindow::onStopPhotoTransmission);
connect(m_rightFunctionPanel, &RightFunctionPanel::startPersonRecognition,
this, &MainWindow::onStartPersonRecognition);
connect(m_rightFunctionPanel, &RightFunctionPanel::stopPersonRecognition,
this, &MainWindow::onStopPersonRecognition);
// 情报传输模块信号
connect(m_rightFunctionPanel, &RightFunctionPanel::startVoiceCall,
this, &MainWindow::onStartVoiceCall);
connect(m_rightFunctionPanel, &RightFunctionPanel::endVoiceCall,
this, &MainWindow::onEndVoiceCall);
// 敌情统计模块信号
connect(m_rightFunctionPanel, &RightFunctionPanel::refreshEnemyStats,
this, &MainWindow::onRefreshEnemyStats);
connect(m_rightFunctionPanel, &RightFunctionPanel::requestAIAnalysis,
this, &MainWindow::onRequestAIAnalysis);
connect(m_rightFunctionPanel, &RightFunctionPanel::exportReport,
this, &MainWindow::onExportReport);
qDebug() << "RightFunctionPanel integrated successfully";
SystemLogger::getInstance()->logInfo("右侧功能面板初始化完成");
// 模拟初始化一些设备状态
QTimer::singleShot(1000, [this]() {
m_rightFunctionPanel->updateDeviceStatus("机器狗", true, 85);
m_rightFunctionPanel->updateDeviceStatus("无人机", true, 92);
m_rightFunctionPanel->updateEnemyStats(3, "");
});
} else {
qWarning() << "Failed to get right panel layout";
SystemLogger::getInstance()->logError("右侧面板布局获取失败");
}
}
void MainWindow::setupDeviceListPanel()
{
// 此方法已被setupSystemLogPanel()替代,保留以兼容可能的调用
@ -1080,4 +1153,146 @@ bool MainWindow::addDeviceToDatabase(const QString &deviceId, const QString &nam
db.close();
return success;
}
// 右侧功能面板槽函数实现
void MainWindow::onStartMapping()
{
qDebug() << "Starting autonomous mapping...";
SystemLogger::getInstance()->logInfo("开始自主建图");
// TODO: 实现自主建图功能
// 这里应该连接到实际的机器狗建图系统
}
void MainWindow::onStopMapping()
{
qDebug() << "Stopping autonomous mapping...";
SystemLogger::getInstance()->logInfo("停止自主建图");
// TODO: 实现停止建图功能
}
void MainWindow::onStartNavigation()
{
qDebug() << "Starting navigation and obstacle avoidance...";
SystemLogger::getInstance()->logInfo("开始导航避障");
// TODO: 实现导航避障功能
}
void MainWindow::onStopNavigation()
{
qDebug() << "Stopping navigation...";
SystemLogger::getInstance()->logInfo("停止导航避障");
// TODO: 实现停止导航功能
}
void MainWindow::onStartPhotoTransmission()
{
qDebug() << "Starting photo transmission from UAV...";
SystemLogger::getInstance()->logInfo("开始无人机照片传输");
// TODO: 实现无人机照片传输功能
// 这里应该连接到实际的无人机摄像头系统
}
void MainWindow::onStopPhotoTransmission()
{
qDebug() << "Stopping photo transmission...";
SystemLogger::getInstance()->logInfo("停止照片传输");
// TODO: 实现停止照片传输功能
}
void MainWindow::onStartPersonRecognition()
{
qDebug() << "Starting person recognition...";
SystemLogger::getInstance()->logInfo("开始人物识别");
// TODO: 实现人物识别功能
// 这里应该连接到AI人物识别系统
}
void MainWindow::onStopPersonRecognition()
{
qDebug() << "Stopping person recognition...";
SystemLogger::getInstance()->logInfo("停止人物识别");
// TODO: 实现停止人物识别功能
}
void MainWindow::onStartVoiceCall()
{
qDebug() << "Starting voice communication...";
SystemLogger::getInstance()->logInfo("开始语音通话");
// TODO: 实现语音通话功能
// 这里应该连接到实际的音频通信系统
}
void MainWindow::onEndVoiceCall()
{
qDebug() << "Ending voice communication...";
SystemLogger::getInstance()->logInfo("结束语音通话");
// TODO: 实现结束通话功能
}
void MainWindow::onRefreshEnemyStats()
{
qDebug() << "Refreshing enemy statistics...";
SystemLogger::getInstance()->logInfo("刷新敌情统计");
// TODO: 实现从数据库或AI系统获取最新敌情数据
// 模拟数据更新
if (m_rightFunctionPanel) {
// 模拟随机更新敌情数据
int enemyCount = qrand() % 10 + 1;
QStringList threatLevels = {"", "", ""};
QString threatLevel = threatLevels[qrand() % threatLevels.size()];
m_rightFunctionPanel->updateEnemyStats(enemyCount, threatLevel);
SystemLogger::getInstance()->logInfo(
QString("敌情统计更新:发现 %1 个目标,威胁等级:%2")
.arg(enemyCount).arg(threatLevel)
);
}
}
void MainWindow::onRequestAIAnalysis()
{
qDebug() << "Requesting AI analysis...";
SystemLogger::getInstance()->logInfo("请求AI敌情分析");
// TODO: 实现AI分析功能
// 这里应该连接到大语言模型进行敌情分析
// 模拟AI分析结果
QTimer::singleShot(3000, [this]() {
QString analysisResult = "AI分析结果当前区域敌情相对稳定建议继续监控北侧区域注意东南方向可疑活动。";
SystemLogger::getInstance()->logInfo("AI分析完成" + analysisResult);
// 可以通过消息框或状态栏显示分析结果
QMessageBox::information(this, "AI敌情分析", analysisResult);
});
}
void MainWindow::onExportReport()
{
qDebug() << "Exporting battlefield report...";
SystemLogger::getInstance()->logInfo("导出战场报告");
// TODO: 实现报告导出功能
// 这里应该生成包含敌情统计、设备状态、任务记录等的完整报告
// 模拟报告导出
QString reportPath = QString("battlefield_report_%1.pdf")
.arg(QDateTime::currentDateTime().toString("yyyyMMdd_hhmmss"));
SystemLogger::getInstance()->logInfo("报告导出完成:" + reportPath);
QMessageBox::information(this, "报告导出",
QString("战场报告已成功导出到:\n%1").arg(reportPath));
}
Loading…
Cancel
Save