图拓扑关系可视化的qt实现

2023-05-16

前言

最近在做数据可视化的相关工作,包括曲线图,航迹图,图结构,树结构等。其中树结构相关的工作笔者以前曾经做过,可以参考笔者以前的博客。qt自定义树形控件之一和qt自定义树形控件之二,当时还用数据库对树结构进行持久化。所以这几天的重心在图结构和曲线图上。本文主要介绍图结构的可视化,后续做曲线图进行介绍。

实现效果

在这里插入图片描述

代码实现

关于图结构的可视化,qt自带一个例子,叫做Elastic Nodes Example。里面有边和节点的绘图实现以及用边连接两个节点。本文内容基于此实现。
首先是node.h的实现,为了使任意两个节点的连线都不穿过其他节点,需要使所有节点均布在一个圆上。

double interval = 2*3.1416/graph->nodeNumber();
qreal xt = qSin(interval*m_node_id)*widgetw;
qreal yt = qCos(interval*m_node_id)*widgeth;
setPos(xt,yt);

同时在calculateForces函数中实现动态,在鼠标拖动一个节点后,该节点可以回到原来的位置。

void Node::calculateForces()
{
    //将所有节点固定在一个圆上
    qreal xvel = 0;
    qreal yvel = 0;

    double interval = 2*3.1416/graph->nodeNumber();

    qreal xt = qSin(interval*m_node_id)*widgetw;
    qreal yt = qCos(interval*m_node_id)*widgeth;
    xvel =( xt - pos().rx())/10;
    yvel =( yt - pos().ry())/10;

    if (qAbs(xvel) < 0.1 && qAbs(yvel) < 0.1)
        return;

    QRectF sceneRect = scene()->sceneRect();
    newPos = pos() + QPointF(xvel, yvel);
    newPos.setX(qMin(qMax(newPos.x(), sceneRect.left() + 10), sceneRect.right() - 10));
    newPos.setY(qMin(qMax(newPos.y(), sceneRect.top() + 10), sceneRect.bottom() - 10));
}

同时为了使在节点上显示编号,在painter函数最后添加

painter->drawText(QPointF(-4,4),QString::number(m_node_id));

m_node_id作为node类构造函数的一个参数。

画出的6个点如下图所示

在这里插入图片描述
在painter函数中,根据节点是否选中进行着色。

if(!is_choosed)
{
    gradient.setColorAt(1, QColor(Qt::yellow).lighter(120));
    gradient.setColorAt(0, QColor(Qt::yellow).lighter(120));
}
else
{
    gradient.setColorAt(1, QColor(Qt::green).lighter(120));
    gradient.setColorAt(0, QColor(Qt::green).lighter(120));
}

在mousePressEvent函数中,添加

graph->choosenode(m_node_id);

m_node_id是node类构造函数的一个参数,代表这个node的编号。这样GraphWidget类就能知道是哪个节点被选中了.
choosenode的实现如下:

void GraphWidget::choosenode(int node_id)
{
    if(is_waitlink == false)  //记录第一个点
    {
        firstnode =  node_id;
        node[firstnode]->setchoosed(true);
        node[firstnode]->update();
        is_waitlink = true;
    }
    else //判断和第一个点的关系
    {
        node[firstnode]->setchoosed(false);   //不起作用
        node[firstnode]->update();   //需要加上这一句
        if(node_id != firstnode)
        {
            int maxid = qMax(node_id,firstnode);
            int minid = qMin(node_id,firstnode);
            int edge_id = (18-minid)*(minid+1)/2+maxid-10;
            if(!edge[edge_id])  //指针需要初始化,野指针和空指针的区别
            {
                edge[edge_id] = new Edge(node[minid], node[maxid]);
                myscene->addItem(edge[edge_id]);
            }
            else
            {
                myscene->removeItem(edge[edge_id]);
                edge[edge_id] = NULL;
                node[firstnode]->setchoosed(false);
            }
        }
        is_waitlink = false;
    }
}

该函数的功能是实现依次选择的两个节点的连接和断开。当选择第一个节点时,把这个节点修改了绿色,

在这里插入图片描述
在选择第二个节点时,把前一个选择的节点改回黄色,同时把这两个节点连接起来,如果这两个节点本来是连接的,则把这两个节点断开。

在这里插入图片描述
这里面使用了一个数学技巧,如果要快速的存储和读取边,通常的想法是放到一个二维数组中,但是edge[3][5]和edge[5][3]会重复。这里使用一维数组存储边。在本例中,假定最多只能有10个节点,那么最多只能有45(C(10,2))条边。假定两个节点编号为x,y,且x<y, 那么边的编号为(18-x)*(x+1)/2+y-10可以做到不重不漏(其实是一个等差数列求和的问题)。
后续可以进行其他节点连接
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图拓扑关系可视化的qt实现 的相关文章

  • tmux 基础使用 xshell 远程连接服务器 断电 断网后保持程序运行

    应用场景 Xshell 远程连接服务器 xff0c 断电 or 断网等原因 xff0c 导致Xshell会话关闭 xff0c 然而 xff0c 此时如果有程序在运行也会被中断 xff0c 对于那些需要长时间运行的程序 xff0c 如何避免程
  • leetcode 3. 无重复字符的最长子串 优化代码效率

    标准解法 xff1a 滑动窗口 xff0c 可见官方题解 核心内容是使用一个set或者map维护当前窗口出现的字符 查看了一下别人运行速度最快的写法发现优化方法是 使用一个vector lt int gt cnt 128 来记录字符是否出现
  • C++ 演奏《起风了》

    来源 xff1a https www bilibili com video BV1tv4y1D7iW is story h5 61 false amp p 61 1 amp share from 61 ugc amp share mediu
  • c ++ Set存放自定义 结构体 类 重载比较运算符

    结构体 xff1a 结构体重载操作在结构体外实现 span class token macro property span class token directive hash span span class token directive
  • c++ 哈希map unorder map set 存放自定义结构体作为key

    c 43 43 中的哈希map xff0c 即unorder set与unorder map如何使用结构体作为key 示例代码如下 xff1a span class token macro property span class token
  • leetcode 5 回文子串

    题目 很明显暴力方法是n平方复杂度 xff0c 所以一直在想有没有不是n平方复杂度的方法 然后就掉坑里了 最后看了题解发现其实就是n平方复杂度 xff0c 所以就直接暴力了 附上一份随手暴力代码 xff0c 遍历对称中心 span clas
  • 【ceph】理解Ceph的三种存储接口:块设备、文件系统、对象存储

    Ceph是一个开源的 统一的 分布式的存储系统 xff0c 这是我们宣传Ceph时常说的一句话 xff0c 其中 统一 是说Ceph可以一套存储系统同时提供块设备存储 文件系统存储和对象存储三种存储功能 一听这句话 xff0c 具有一定存储
  • 二叉树的迭代遍历 前序 中序 后序 模板

    作为个人学习笔记 xff0c 原出处讲的很清楚 xff1a 代码随想录 非标记法 使用非标记法写的话 xff0c 中序的代码风格和前后序完全不同 中序 xff1a span class token keyword class span sp
  • (8)requests发起get/post请求

    一 基本概念 1 什么是接口 前后端数据传输的通道 2 http请求的接口 协议 43 域名 ip 43 接口地址 43 请求参数 3 http请求的要素 请求地址 43 请求方法 43 请求数据 二 request请求接口 1 安装 pi
  • 【面试必备】面向Android开发者的复习指南!最全的BAT大厂面试题整理

    近日一好友去阿里面试 xff0c 面试失败了 xff0c 分享了一个他最不擅长的算法面试题 题目是这样的 题目 xff1a 给定一个二叉搜索树 BST xff0c 找到树中第 K 小的节点 出题人 xff1a 阿里巴巴出题专家 xff1a
  • c memcpy 带重叠部分 实现

    主要是要注意当目标地址在源地址后面且存在重叠区域的时候 xff0c 需要从后往前复制 span class token macro property span class token directive hash span span cla
  • 主流PCB画图软件的对比区别(AD、Pads、Allegro)

    国内的EDA软件市场几乎被三家瓜分 xff0c 分别是Altium Mentor Pads Cadence xff0c 也是我们这次主要分析和比较的软件 本人用的多的是 Alitum 也用过allegro xff0c pads目前还没用过
  • 新书推荐 |《Prometheus监控实战》

    新书推荐 Prometheus监控实战 点击上图了解及购买 Docker公司前服务与支持副总裁 Kickstarter前首席技术官 Empatico首席技术官撰写 xff0c 全方位介绍继Kubernetes之后的第二个CNCF毕业项目 P
  • 腾讯大数据总体架构图,对外公开!

    导读 xff1a 腾讯作为国内体量最大的互联网公司之一 xff0c 业务涵盖用户日常生活的方方面面 xff0c 面对如此巨大业务数据量 xff0c 如果不能对数据进行专业化处理并高效有序地存 管 用 xff0c 如果不能使数据产生应有的价值
  • API安全实战

    一提起 信息安全 xff0c 不管是业内专家还是所谓的 吃瓜群众 xff0c 多半都会在脑海中浮现 网络安全 Web安全 软件安全 数据安全 等常见的词汇 市面上绝大多数安全类书籍也多集中在这几个领域 xff0c 而从API视角阐释信息安全
  • 【第115期】世界一流大学计算机专业,都在用哪些书当教材?

    导读 xff1a 转眼间离新学期开学又不远了 清华 北大 MIT CMU 斯坦福的学霸们在新学期里要学什么 xff1f 本文就带你盘点一下那些世界名校计算机专业采用的教材 不用多说 xff0c 每本都是经典的烧脑技术书 xff0c 建议配合
  • 什么是AB实验?能解决什么问题?终于有人讲明白了

    导读 xff1a 走向身边的AB实验 作者 xff1a 木羊同学 来源 xff1a 大数据DT xff08 ID xff1a hzdashuju xff09 AB实验 是一个从统计学中借来的工具 我和大家一样 xff0c 每次只要看到 统计
  • 树莓派3b引脚图

    如上图所示 xff0c 我们可以很清楚的看到各个引脚的功能 例如我们想使用pwm引脚来控制舵机 xff0c 则我们可以考虑使用其中的 BCM18 PWM0 和 BCM13 PWM1 在使用wiringPi库时 xff0c 我们定义的引脚即B
  • 跟踪slab分配堆栈流程的方法(perf、systemtap)

    跟踪slab分配堆栈流程的方法 xff08 perf systemtap xff09 内存泄露是在解决内核故障会遇到的棘手情况 xff0c 根据具体的内存使用情况 xff0c 追踪相应slab cache的分配堆栈流程 xff0c 是追踪泄
  • prometheus+grafana监控mysql、canal服务器

    一 prometheus配置 1 prometheus安装 1 1官网下载安装包 xff1a https prometheus io download 1 2解压安装包 xff1a tar zxvf prometheus 2 6 1 lin

随机推荐

  • mac配置jmeter

    一 步骤 1 安装jdk1 8版本 xff0c 因为jmeter是基于java环境运行的 2 安装jmeter5 x版本 二 安装jdk 1 下载jdk Java Downloads Oracle 2 下载好之后安装 xff0c 全部下一步
  • 操作系统(四):动态链接与静态链接的区别

    在回答这个问题之前希望大家大概了解一个文件编译的过程 xff0c 比如一个C文件在编译成功后文件夹里的文件会有什么变化 xff0c 大家可以先去创建一个helloworld c的文件 xff0c 观察其编译后的变化 那么问题来了 面试官经常
  • 【OpenVINS】(一)ZUPT

    参考 xff1a Measurement Update Derivations Zero Velocity Update 在典型的自主汽车场景中 xff0c 传感器系统将在停止灯处变得静止 xff0c 其中动态物体 xff08 例如交叉路口
  • OpenVINS与MSCKF_VIO RK4积分对比

    VIO系统在使用IMU测量值进行状态预测时 xff0c 需要将连续时间的微分方程离散化为差分方程 xff0c 离散化的本质是积分 xff0c 根据数值积分近似程度不同 xff0c 常用的有欧拉法 中点法和四阶龙格库塔法等 xff0c Ope
  • 全盘拷贝linux系统,转移至另一硬盘

    首先制作ubuntu启动盘 xff0c 选择try ubuntu进入live ubuntu系统 查看需拷贝硬盘盘符 span class token function sudo span span class token function
  • EKF SLAM

    EKF 方法是解决 SLAM 问题的一种经典方法 xff0c 其应用依赖于运动模型和观测模型的高斯噪声假设 在 SLAM 问题首次提出不久后 xff0c Smith 和 Cheesman 及 Durrant Whyte对机器人和路标间的几何
  • 如何将立创EDA中的元器件的原理图/封装和3D模型导入AD的库中

    如何将立创EDA中的元器件的原理图 封装和3D模型导入AD的库中 工具 xff1a AD 立创EDA专业版 fusion360 或其他3D软件 导入原理图 封装 在立创商城复制所需元器件的编号 打开立创EDA标准版或专业版 xff0c 这里
  • Xshell 提示 “要继续使用此程序,您必须应用最新的更新或使用新版本“的解决方案

    要想解决Xshell提示更新最新版问题 有两种方案 方案一 手动修改系统时间 步骤如下 右键右下角时间 弹出如下窗口 2 选中 调整日期 时间 A 并点击 弹出如下页面 更改时间 更改成之前的年份 如下图 更改成功后 再打开相应的应用 Xs
  • 2020.2.22 排位赛 G - Bucket Brigade(BFS)

    Bucket Brigade 题面 题目分析 BFS模板题 代码 span class token macro property span class token directive keyword include span span cl
  • Canal入门(二)

    Canal入门 xff08 二 xff09 canal kafka quickStart 1 基本说明 canal 1 1 1版本之后 默认支持将canal server接收到的binlog数据直接投递到MQ 目前默认支持的MQ系统有 ka
  • PID调节三个参数的作用

    1 比例调节作用 xff1a 按比例反应系统的偏差 系统一旦出现了偏差 比例调节立即产生调节作用用以减少偏差 比例作用大 可 以加快调节 能迅速反应误差 xff0c 从而减小稳态误差 但是 xff0c 比例控制不能消除稳态误差 过大的比例
  • (centos7)docker+jenkins运行python自动化

    目录 一 实现思路 二 环境准备 1 在liunx上安装docker 2 docker安装jenkins 三 访问前设置 四 配置jenkins容器 五 jenkins插件安装 1 安装git 2 安装docker 3 html Publi
  • OJ在线编程常见输入输出练习

    OJ在线编程常见输入输出练习 4 a 43 b 4 输入描述 xff1a 输入数据包括多组 每组数据一行 每行的第一个整数为整数的个数n 1 lt 61 n lt 61 100 n为0的时候结束输入 接下来n个正整数 即需要求和的每个正整数
  • js中数组与集合的相互转化

    数组 gt 集合 var a 61 1 2 3 4 5 5 var set 61 new Set a console log set 1 2 3 4 5 集合 gt 数组 var set 61 new Set set add 1 set a
  • Linux make/Makefile详解

    会不会写makefile xff0c 从侧面说明了一个人是否具备完成大型工程的能力 一个工程中的源文件不计数 xff0c 其按类型 功能 模块分别放在若干个目录中 xff0c makefile定义了一系列的 规则来指定 xff0c 哪些文件
  • 大疆H20系列吊舱,录制的视频含义

  • 写算法的方法

    写算法步骤 xff1a xff08 以下方法 xff0c 都是老生常谈 但是非常简单有用 xff09 数据结构 xff08 所有的算法都是基于数据结构的操作 所有算法都是针对数据结构的属性进行操作 列出所有的属性 xff0c 写算法逐项修改
  • Windows系统下QT+OpenCasCAD仿真开发

    背景 最近开发了一个六自由度机械臂调姿平台的控制软件 xff0c 集成了API激光跟踪仪和KUKA机器人 xff0c 实现了根据产品的测量位姿驱动仿真环境中模型并且实现模型间的碰撞检测 其中KUKA机器人的控制可以参考笔者以前的博客 xff
  • 飞控IMU姿态估计流程

    飞控中使用加速度计 xff0c 陀螺仪 xff0c 磁罗盘进行姿态估计算法流程 step1 xff1a 获取陀螺仪 xff0c 加速度计 xff0c 磁罗盘的原始数值 step2 xff1a 陀螺仪 xff0c 加速度计减去固定的偏移后得到
  • 图拓扑关系可视化的qt实现

    前言 最近在做数据可视化的相关工作 xff0c 包括曲线图 xff0c 航迹图 xff0c 图结构 xff0c 树结构等 其中树结构相关的工作笔者以前曾经做过 xff0c 可以参考笔者以前的博客 qt自定义树形控件之一和qt自定义树形控件之