Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Graph-Visual

Version Copyright License Platform C++

[简体中文] | [English]

基于 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 所有。