Qt地铁智慧换乘系统浅学( 二 )将存储的站点线路信息绘制到graphicsView(图形视图部件)

news2024/11/22 21:36:40

绘制

  • 容器使用
  • 测试 画一个黑点到QGraphicsview中
    • 准备工作
    • 代码
  • 绘制所有站点信息
    • 画线路信息
      • 准备工作
      • 代码
  • 实现放大缩小功能
      • 放大缩小按键和建立与槽函数的连接
      • 槽函数实现
      • 效果如下
      • bug

容器使用

Qt地铁智慧换乘系统浅学( 1)

测试 画一个黑点到QGraphicsview中

准备工作

1 我们需要QGraphicsScene 来管理QGraphicsView
2 设置QGraphicsScene 坐标范围
3 确定黑点的坐标 和 大小

代码


void drawsys(QGraphicsView *graphicsView){

    QGraphicsScene *scene;   //绘图场景
    scene = new QGraphicsScene;
    scene->setBackgroundBrush(Qt::white);
    scene->setSceneRect(0,0,3080,2080);// f分辨率
    qDebug()<<"传参成功";
    graphicsView->setRenderHint(QPainter::Antialiasing);
    graphicsView->setScene(scene);
    graphicsView->setDragMode(QGraphicsView::ScrollHandDrag);

    scene->clear();
    //test
    QPen elli_pen;
    elli_pen.setColor(Qt::black);
    QGraphicsEllipseItem *elli = new QGraphicsEllipseItem();
    elli->setRect(QRect(0,0,100,100));
    elli->setPen(elli_pen);
    elli->setBrush(QBrush(Qt::black));
    /*

    在这段代码中,您设置了两个颜色:一个是 QPen 的颜色,另一个是 QBrush 的颜色
    QPen 用于绘制形状的边框,而 QBrush 用于绘制形状的填充颜色。
    */
    scene->addItem(elli);

}

测试结果如下
在这里插入图片描述

绘制所有站点信息

显示站点名称 以及椭圆标志

void drawsys(QGraphicsView *graphicsView){

    QGraphicsScene *scene;   //绘图场景
    scene = new QGraphicsScene;
    scene->setBackgroundBrush(Qt::white);
    scene->setSceneRect(0,0,3080,2080);// f分辨率
    qDebug()<<"传参成功";
    graphicsView->setRenderHint(QPainter::Antialiasing);
    graphicsView->setScene(scene);
    graphicsView->setDragMode(QGraphicsView::ScrollHandDrag);

    scene->clear();
    //test
    for(auto i:Station.keys()){

        QPen elli_pen;
        qDebug()<<"station linenum"<<Station_Line[i].size()<<"\n";
        if(Station_Line[i].size()!=1)
            elli_pen.setColor(Qt::black);
        else
            elli_pen.setColor(LineColor[*Station_Line[i].begin()]);
        QGraphicsEllipseItem *elli = new QGraphicsEllipseItem();
        elli->setRect(QRect(Station[i].coord.x(),Station[i].coord.y(),6,6));

        qDebug()<<Station[i].coord.x()<<" "<<Station[i].coord.y()<<"\n";
        qDebug()<<*Station_Line[i].begin()<<" "<<LineColor[*Station_Line[i].begin()]<<" \n";

        elli->setPen(elli_pen);

        elli->setBrush(Qt::white);
        /*
        在这段代码中,您设置了两个颜色:一个是 QPen 的颜色,另一个是 QBrush 的颜色
        QPen 用于绘制形状的边框,而 QBrush 用于绘制形状的填充颜色。
        */
        //Latitude and longitude)即经线和纬线
        QString info = "站点名称: "+i+"\n站点经纬度: "+
            QString::number(Station[i].e,'f',3)+
                       ","+QString::number(Station[i].n,'f',3)+
                       "\n站点所属线路: ";
        for(auto j:Station_Line[i].values()){
            info += j+' ';
        }
        info+="\n相邻站点";
        for(auto &j:edge[i]){
            info+="\n "+j;
            if(j.length()<=3) info+="    ";
            info+="\t相距"+QString::number(dp[i][j]/1000.0)+"km";
        }
        scene->addItem(elli);

        QGraphicsTextItem *text = new QGraphicsTextItem();
        text->setPlainText(i);
        text->setPos(Station[i].coord.x(),Station[i].coord.y()+1);
        text->setFont(QFont("consolas",4,1));
        text->setToolTip(info);
        scene->addItem(text);
    }
/*
在下面 写画边!!!!
*/
}

由此 可得状态如下
在这里插入图片描述

画线路信息

准备工作

1 每次画一条边,即两个相邻站点之间的边
2 我们需要两个边的坐标
3 我们需要知道这两个站点所属的线路信息,是否存在所属多个线路

知道这些之后就可以遍历画边了!

代码

这里定义了一个flag,用来判断两个站点之间是否已经画过了 另外段代码和上述的画站点所属一个函数

 QMap<QString,QMap<QString,int> >flag;
    flag.clear();
    for(auto i:Station.keys()){
        for(auto &j:edge[i]){
            QGraphicsLineItem *line = new QGraphicsLineItem();
            QPointF pos1,pos2;
            if(flag[i][j]) continue;
            flag[i][j]=flag[j][i]=1;
            pos1.setX(Station[i].coord.x()+3);
            pos1.setY(Station[i].coord.y()+3);
            pos2.setX(Station[j].coord.x()+3);
            pos2.setY(Station[j].coord.y()+3);
            line->setLine(QLineF(pos1,pos2));
            if(mp[i][j].size()==1){
                line->setPen(QPen(LineColor[*mp[i][j].begin()]));
            }else line->setPen(QPen(Qt::black));
            scene->addItem(line);
        }
    }

然后成了!!!!

在这里插入图片描述

实现放大缩小功能

放大缩小按键和建立与槽函数的连接

在GUI界面,添加工具栏
在这里插入图片描述
生成toolBar 之后可以将按键存储到toolBar 更加整洁
在这里插入图片描述
由此 我们在mainwindow cpp下用代码创建button

	QPushButton *zoom_in = new QPushButton(this);
    zoom_in->setIcon(QIcon(":/image/zoom_in.svg"));
    zoom_in->setToolTip("放大");
    ui->toolBar->addWidget(zoom_in);
    connect(zoom_in,&QPushButton::clicked,this,[=]{
        zoomIn(ui->graphicsView);
    });

    QPushButton *zoom_out = new QPushButton(this);
    zoom_out->setIcon(QIcon(":/image/zoom_out.svg"));
    zoom_out->setToolTip("缩小");
    ui->toolBar->addWidget(zoom_out);
    connect(zoom_out,&QPushButton::clicked,this,[=]{
        zoomOut(ui->graphicsView);
    });

    QPushButton *return_subway = new QPushButton(this);
    return_subway->setIcon(QIcon(":/image/subway.svg"));
    return_subway->setToolTip("返回地铁线路图 ");
    ui->toolBar->addWidget(return_subway);
    connect(return_subway,&QPushButton::clicked,this,[=]{
        drawsys(ui->graphicsView);
    });

槽函数实现

放大缩小的公式我就当工具了,不去理解了

新建一个zoomIO h和cpp文件 用来存储放大缩小相关函数
好的 开始

#include"ZoomIO.h"

#include<cmath>
#include<QDebug>
#include<QWheelEvent>
#include<qgraphicsview.h>
#include"qgraphicsview"
void zoomIn(QGraphicsView *graphicsview){
    zoom(graphicsview,1.2);
}
void zoomOut(QGraphicsView *graphicsview){
    zoom(graphicsview,0.833);
}
void zoom(QGraphicsView *graphicsview,double scaleFactor){
    //缩放函数

    qreal factor = graphicsview->transform().scale(scaleFactor,scaleFactor).mapRect(QRectF(0, 0, 1, 1)).width();
    if (factor < 0.1 || factor > 50)
        return;
    graphicsview->scale(scaleFactor, scaleFactor);
}
void refresh(QGraphicsView *graphicsview){
    graphicsview->viewport()->update();
}

效果如下

放大
在这里插入图片描述

缩小
在这里插入图片描述

bug

我们再放大之后发现 我们画的线贯穿了站点圆,这是由于我们先画圆,然后再画线导致的,我们可以先画线 然后再画圆

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1041340.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JupyterNotebook的快捷键

Jupyter Notebook 有两种键盘输入模式&#xff1a;1、命令模式&#xff0c;键盘输入运行程序命令&#xff1b;这时的单元框线是蓝色。2、编辑模式&#xff0c;允许你往单元中键入代码或文本&#xff1b;这时的单元框线是绿色的。 一、命令模式 (在编辑模式下按键 Esc键进入命令…

RISC-V 指令

RISC-V指令都是32位长。 文章目录 R-Type指令格式:I-Type指令格式:S-Type指令格式:B-Type指令格式:U-Type指令格式:UJ-Type指令格式:J-Type指令格式:R4-Type指令格式:F-Type指令格式:vC-Type指令格式:CB-Type指令格式:CIW-Type指令格式:CL-Type指令格式:R-Type指…

华为云Stack的学习(八)

九、华为云Stack网络服务介绍 1.网络服务概览 1.1 租户界面的网络服务 租户登入ManageOne运营面后&#xff0c;可在服务列表中查看到网络服务。用户使用网络服务前管理员需要在Service OM上提前创建好外部网络。 1.2 华为云Stack网络服务全景图 1.3 网络服务承载网元 2.虚拟…

SpringMVC 学习(七)JSON

9. JSON 9.1 简介 JSON&#xff08;JavaScript Object Notation&#xff0c;JS 对象标记&#xff09;是一种轻量级数据交换格式&#xff0c;采用独立于编程语言的文本格式储存和表示数据&#xff0c;易于机器解析和生成&#xff0c;提升网络传输效率。 任何 JavaScript 支持…

IntelliJ IDEA 上 使用git 合并其他分支,合并某一个提交

git 合并其他分支 找到git——>merge… 选择需要合并的分支&#xff0c;不能选和当前分支一样噢 合并&#xff0c;推送即可 合并某个提交到其他分支 点击左下角git——>右键切换分支——>选择需要合并的分支——>选择需要合并的代码——>ch 推送即可

一篇文章彻底搞懂熵、信息熵、KL散度、交叉熵、Softmax和交叉熵损失函数

文章目录 一、熵和信息熵1.1 概念1.2 信息熵公式 二、KL散度和交叉熵2.1 KL散度(相对熵)2.2 交叉熵 三、Softmax和交叉熵损失函数3.1 Softmax3.2 交叉熵损失函数 一、熵和信息熵 1.1 概念 1. 熵是一个物理学概念&#xff0c;它表示一个系统的不确定性程度&#xff0c;或者说是…

redis(3)-hiredis-API函数的调用

1.API函数查询 http://github.com.redis/hiredis 2.直接在hiredis目录下新建 test_redis.c 2.1创建文件: 目录下有hiredis 2.2编译 添加环境变量 2.3运行 ./a.out 直接运行 redis-cli get itc…

算法-贪心+优先级队列-IPO

算法-贪心优先级队列-IPO 1 题目概述 1.1 题目出处 https://leetcode.cn/problems/ipo/description/?envTypestudy-plan-v2&envIdtop-interview-150 1.2 题目描述 2 回溯法 2.1 思路 2.2 代码 class Solution {int result 0;public int findMaximizedCapital(int …

基于ARM+FPGA的ISA总线/MMи总线接口转换设计在轨道交通的应用

总线广泛应用于计算机、工业生产及各种测试设备。ISA总线为IBM公司推出的基于80286CPU的PC&#xff0f;AT微型计算机用扩展总线标准&#xff0c;MMи总线是俄罗斯国内自行设计的专用测试总线&#xff0c;主要用于程控单元模块与MMи总线之间数据及控制信息的交换。在某型导弹测…

竞赛 基于深度学习的视频多目标跟踪实现

文章目录 1 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的视频多目标跟踪实现 …

HBase基础架构及存储原理

一、HBase介绍 HBase是Hadoop生态系统中的一个分布式、面向列的开源数据库&#xff0c;具有高可伸缩性、高性能和强大的数据处理能力。广泛应用于处理大规模数据集。 HBase是一种稀疏的、分布式、持久的多维排序map 稀疏&#xff1a;对比关系型数据库和非关系型数据库&#xf…

ubuntu下网卡插入网线后仍然不连接

网卡驱动已经安装&#xff0c;在settings里可以看到该网卡设备&#xff0c;但是插入网线后仍然不会连接&#xff1a; 鼠标点击也无效。 可尝试&#xff1a; 1. ifconfig找到该网卡&#xff0c;比如我的网卡是 enx0826ae3e81aa 2. sudo ifconfig enx0826ae3e81aa down sud…

OpenCV两张图片实现稀疏点云的生成

1 E矩阵 1.1 由F到E E K T ∗ F ∗ K E K^T * F * K EKT∗F∗K E 矩阵可以直接通过之前算好的 F 矩阵与相机内参 K 矩阵获得 Mat E K.t() * F * K;相机内参获得的方式是一个较为复杂的方式&#xff0c;需要使用棋盘进行定位获得&#xff0c;我们这里直接使用了 OpenMVG 提…

C语言学习(1)—— 环境安装和配置

运行C语言和C程序需要安装MinGW和VSCode。 一. 安装MinGW 1、进入官网下载MinGW&#xff1a;https://sourceforge.net/projects/mingw-w64/files/ 2、解压缩 3、配置环境变量 4、检查是否安装成功 二. 安装VSCode 1、进入官网下载VSCode&#xff1a;https://code.visualstud…

中国制造让苹果跪服,将再增加一家中国高科技供应商

日前产业链人士指出由于京东方的OLED面板有力地制衡韩国面板厂商三星和LGD&#xff0c;促使他们降价&#xff0c;而且技术也不错&#xff0c;因此正计划再引入一家中国OLED面板厂商&#xff0c;以进一步促进OLED面板的竞争。 早期苹果的OLED面板完全由三星供应&#xff0c;由此…

SR800-D 5G工业路由器:将无人驾驶汽车的通信能力提升到极限

​大家好&#xff01;欢迎来到今天星创易联的课堂&#xff0c;我是你们的通信老师&#xff0c;今天我们将讨论无人驾驶解决方案&#xff0c;其中包括SR800-D 5G工业路由器的运用。 首先&#xff0c;让我们聚焦于无人驾驶技术的重要性。无人驾驶汽车正在迅速崛起&#xff0c;这种…

【服务端 | Redis】如何使用redis 有序集合实现股票交易的订单表(价格优先、时间优先)

前两天倒腾redis的有序集合时&#xff0c;自己发现了一个问题&#xff0c;redis的有序集合在score相同的情况 下是如何排序的&#xff1f; 通过谷歌搜索&#xff0c;发现了一些线索&#xff0c;在score相同的情况下&#xff0c;redis使用字典排序&#xff0c;不过不是太明白什…

【红帽】跟着学习如何使用桌面访问命令行

今天我们分享一些红帽Linux的知识&#xff0c;记得关注&#xff0c;会一直更新~ ▶1、以student用户身份并使用student作为密码登录workstation 1.1.在workstation上&#xff0c;从GNOME登录屏幕中单击student用户帐户。系统提示输入密码时&#xff0c;请输入student。 1.2.…

Tuxera NTFS 2022 for Mac破解版百度网盘免费下载安装激活教程

Mac打不开移动硬盘”有多种原因&#xff0c;解决办法也不尽相同。它可能是安装的NTFS for Mac读写软件版本和当前macOS系统的兼容问题、或者是Mac没有正常连接硬盘等等。本篇文章就将为您罗列出导致“Mac打不开移动硬盘”的原因和解决办法。 为此不得不使用著名的Tuxera NTFS …

深入理解传输层协议:TCP与UDP的比较与应用

目录 前言什么是TCP/UDPTCP/UDP应用TCP和UDP的对比总结 前言 传输层是TCP/IP协议栈中的第四层&#xff0c;它为应用程序提供服务&#xff0c;定义了主机应用程序之间端到端的连通性。在本文章&#xff0c;我们将深入探讨传输层协议&#xff0c;特别是TCP和UDP协议的原理和区别…