基于 Qt 6 / C++ 的图结构可视化演示软件:多标签图编辑、力导向自动布局、实时物理模拟,以及 DFS / BFS / Dijkstra / Bellman-Ford 四种算法的逐步动画演示。
- 多标签页编辑:每个标签独立保存画布状态(缩放、视口),支持拖拽排序、双击重命名、右键关闭。
- 力导向自动布局:新图/加载文件自动布局,含连通分量独立力导向、分量装箱环绕、边-结点避让与边交叉消减。
- 实时物理模拟:边弹簧 + 全局排斥 + 分量向心力 + 阻尼,Tab 键随时暂停/恢复;1 号结点为锚点。
- 算法逐步演示:DFS(带回溯动画)、BFS(逐层展开)、Dijkstra、Bellman-Ford(逐轮松弛),Space 暂停/继续,Enter 或双击空白恢复。
- 结构检查:图结构合法性、自环、有向环、孤立结点、两点可达性(双向/单向),异常元素自动高亮闪烁。
- 辅助浮层:右上角可拖拽/缩放/折叠的图信息面板(结点数/边数/出入度/连通分量数),左下角缩略图导航。
- 交互操作:右键菜单、Shift+左键拖拽建边(按住 Z 建双向边)、M 键移动模式、WASD 加速平移、Ctrl+滚轮缩放。
- 全局可自定义:颜色、物理参数、快捷键均在
defines.hpp中以宏定义,可统一修改;物理参数还可在运行时通过对话框调整。 - 配置与日志:窗口几何、物理参数、帧率持久化到
settings.json;调试日志与崩溃日志写入logs/目录。 - 中文本地化:内置 Qt 翻译框架(
Graph-Visual_zh_CN.ts),按系统语言自动加载。
- 语言:C++17
- 框架:Qt 6.11.1(Widgets + LinguistTools,兼容 Qt 5)
- 构建:CMake ≥ 3.16
- 平台:Windows(构建后由 windeployqt 自动部署 Qt 依赖)
Graph-Visual/
├── src/ # 全部源码
│ ├── CMakeLists.txt # CMake 构建脚本(含 windeployqt 部署)
│ ├── main.cpp # 入口:异常处理、本地化、主题
│ ├── mainwindow.h # 主窗口声明
│ ├── mainwindow.cpp # 主窗口实现(菜单/标签/算法/检查等)
│ ├── mainwindow.ui # UI 骨架布局
│ ├── indexGraph.hpp # 图数据结构引擎(纯 C++,无 Qt 依赖)
│ ├── components.hpp # 全部业务模块(文档/画布/算法/浮层/日志等)
│ ├── defines.hpp # 全局可自定义宏(颜色/物理/快捷键/路径)
│ ├── Graph-Visual_zh_CN.ts # 中文本地化翻译文件
│ └── 操作教程.md # 操作教程(F2 打开)
├── example/ # 示例图文件(*.indexgraph.json)
├── release/ # 已部署的发布版本
├── preview.png # 预览图
├── README.md # 本文件
├── README_en-US.md # 英文版说明
├── LICENSE # MIT 许可证
├── COPYRIGHT # 版权声明
└── .gitignore
main.cpp → mainwindow.h/.cpp → components.hpp → indexGraph.hpp
各层职责:
| 模块 | 职责 |
|---|---|
main.cpp |
入口:全局异常捕获、Qt 消息处理、翻译加载、浅色主题 |
mainwindow.h/.cpp |
主窗口:菜单、多标签、算法/检查调度、状态栏、设置持久化 |
components.hpp |
业务模块:GraphDocument(文档模型)、GraphCanvas(交互画布)、AlgorithmRunner(算法步进)、InfoOverlay/MinimapOverlay(浮层)、TabBarWidget(标签栏)、SettingsService(配置)、GraphFileService(文件读写)、DebugLogger(日志) |
indexGraph.hpp |
纯图数据结构:邻接表 + 逆邻接表 + 权重、O(1) 边存在性检查、负权标记、DFS/BFS/Dijkstra/Bellman-Ford、连通分量计数、ID 重排 |
保存/加载使用 .indexgraph.json(JSON,保存时自动压缩空白符):
{
"graph_name": "图名称",
"node_n": 13,
"edge_m": 24,
"edges": [
{ "from": 1, "to": 2, "w": 1 }
],
"data": {
"total_out_degree": 24,
"total_in_degree": 24,
"connected_components": 1
}
}其中 data 为统计信息,加载时仅校验 graph_name / node_n / edge_m / edges 四个必需字段。
cmake -S . -B build
cmake --build build- 构建成功后,
Graph-Visual.exe旁的 Qt DLL 由 windeployqt 自动部署(POST_BUILD)。 - 另提供
deploy自定义目标:cmake --build build --target deploy可重新部署依赖。 - 程序运行时会在可执行文件同目录查找
操作教程.md(F2 打开教程)。
所有快捷键在 defines.hpp 中定义为全局宏,可统一修改。
| 快捷键 | 宏名 | 功能 |
|---|---|---|
| Ctrl+N | DEF_SHORTCUT_NEW_FILE |
新建 |
| Ctrl+O | DEF_SHORTCUT_OPEN_FILE |
打开 |
| Ctrl+S | DEF_SHORTCUT_SAVE |
保存 |
| Ctrl+Shift+S | DEF_SHORTCUT_SAVE_AS |
另存为 |
| Ctrl+Shift+N | DEF_SHORTCUT_RENAME |
重命名 |
| Ctrl+W | DEF_SHORTCUT_CLOSE_TAB |
关闭标签页 |
| Ctrl+A | DEF_SHORTCUT_SELECT_COMP |
选中连通分量 |
| Ctrl+Shift+A | DEF_SHORTCUT_SELECT_ALL |
全选图 |
| Ctrl+Shift+C | DEF_SHORTCUT_CLEAR_GRAPH |
清空图 |
| Ctrl+Shift+E | DEF_SHORTCUT_CLEAR_EDGES |
清空边 |
| Ctrl+Shift+R | DEF_SHORTCUT_RESORT |
重排序修复 |
| Ctrl+Q | DEF_SHORTCUT_ADD_NODE |
新增结点 |
| Ctrl+D | DEF_SHORTCUT_DELETE_SEL |
删除选中 |
| Ctrl+Shift+T | DEF_SHORTCUT_TRACK_CENTER |
追踪回图中心 |
| Ctrl+Alt+D | DEF_SHORTCUT_ALGO_DFS |
DFS演示 |
| Ctrl+Alt+B | DEF_SHORTCUT_ALGO_BFS |
BFS演示 |
| Ctrl+Alt+A | DEF_SHORTCUT_ALGO_DIJKSTRA |
Dijkstra演示 |
| Ctrl+Alt+E | DEF_SHORTCUT_ALGO_BF |
Bellman-Ford演示 |
| F11 | DEF_SHORTCUT_FULLSCREEN |
全屏 |
| F1 | DEF_SHORTCUT_ABOUT |
关于 |
| F2 | DEF_SHORTCUT_TUTORIAL |
教程 |
| F3 | DEF_SHORTCUT_DEBUG |
调试模式 |
| 按键 | 宏名 | 功能 |
|---|---|---|
| M | DEF_KEY_MOVE_MODE |
移动模式切换 |
| Z | DEF_KEY_BIDIR_DRAG |
按住创建双向边 |
| Tab | DEF_KEY_PHYSICS_TOGGLE |
物理暂停/恢复 |
| Space | DEF_KEY_ALGO_STEP |
算法演示暂停/继续 |
| Enter | DEF_KEY_ALGO_RESTORE |
演示恢复 |
| . | DEF_KEY_NEXT_NODE |
下一相邻结点 |
| , | DEF_KEY_PREV_NODE |
上一相邻结点 |
| W/A/S/D | DEF_KEY_WASD_* |
画布平移(带加速度) |
| Q | DEF_KEY_WASD_Q |
Ctrl+Q 新增结点 |
| 操作 | 功能 |
|---|---|
| 左键单击 | 选中结点/边(Ctrl 多选) |
| Shift+左键拖拽 | 从源结点创建有向边 |
| Z + Shift+左键拖拽 | 创建双向边 |
| 中键拖拽 | 平移画布 |
| Ctrl+滚轮 | 缩放画布 |
| 双击空白 | 取消选择 / 演示恢复 |
| 右键 | 上下文菜单(结点/边/空白处) |
- 1 号结点是锚点,不受物理力影响。
- 边弹簧力:单向边与双向边使用不同刚度系数(
K_UNI/K_BI)。 - 全局排斥力带截止距离(
CUTOFF),近距离结点被推开,避免重叠。 - 各连通分量独立力导向:分量内保持结构,分量间互不吸引,仅极弱向心力防漂移;孤立结点使用更弱的锚定力。
- 全局最小/最大间距约束(
MIN_DIST/MAX_DIST)与速度上限(V_MAX)保证模拟稳定。 - 布局阶段与维持阶段使用不同阻尼系数(
GAMMA_L/GAMMA_D),快速收敛。 - 物理参数可在菜单 [物理] 对话框中运行时调整,并持久化到
settings.json;物理计算帧率(默认 120 FPS)与画面渲染帧率(默认 30 FPS)在菜单 [性能] 中设置。
| 文件 | 说明 |
|---|---|
settings.json |
可执行文件同目录:窗口几何、调试模式、物理/渲染帧率、物理参数 |
logs/YYYY-MM-DD.txt |
调试日志(F3 切换调试模式,默认开启,异步写入) |
logs/YYYY-MM-DD-crash.txt |
崩溃日志(未处理异常、Qt 致命/严重错误) |
example/ 目录提供了 5 个示例图,可用 Ctrl+O 打开体验:
- 双向简单树
- K6 完全图
- 简单簇状图
- 简单连通块
- 简单单向环
本项目以 MIT 许可证开源,版权归 JularDepick 所有。
