qt-PLC可视化编辑器

news2024/11/25 5:57:31

qt-PLC可视化编辑器

  • 一、演示效果
  • 二、核心代码
  • 三、下载链接


一、演示效果

在这里插入图片描述

二、核心代码


#include "diagramitem.h"
#include "arrow.h"

#include <QDebug>
#include <QGraphicsScene>
#include <QGraphicsSceneContextMenuEvent>
#include <QMenu>
#include <QPainter>

//! [0]
DiagramItem::DiagramItem(DiagramType diagramType, QMenu *contextMenu,
                         QGraphicsItem *parent,MODE opMode)
    : QGraphicsPathItem(parent)
{
    myDiagramType = diagramType;
    myContextMenu = contextMenu;
    normallyOpen=true;
    operationMode=opMode;
    QPainterPath path;
    QFont diagram_font("Ubuntu Mono Bold",12);
    int x=-30,y=0,w=70,h=70;

    no_contact.addText(x,y,diagram_font,"—| |—");

    no_contact.addRect(-35,-35,70,70);

    nc_contact.addText(x,y,diagram_font,"—|/|—");
    nc_contact.addRect(-35,-35,70,70);

    no_coil.addText(x,y,diagram_font,"—( )—");
    no_coil.addRect(-35,-35,70,70);

    nc_coil.addText(x,y,diagram_font,"—(/)—");
    nc_coil.addRect(-35,-35,70,70);


    switch (myDiagramType) {
    case DigitalIn0:
        path=no_contact;
        title="DIN[0]";
        break;
    case DigitalIn1:
        path=no_contact;
        title="DIN[1]";
        break;
    case DigitalIn2:
        path=no_contact;
        title="DIN[2]";
        break;
    case DigitalIn3:
        path=no_contact;
        title="DIN[3]";
        break;
    case DigitalIn4:
        path=no_contact;
        myPath=path;
        title="DIN[4]";
        break;
    case DigitalIn5:
        path=no_contact;
        title="DIN[5]";
        break;
    case DigitalIn6:
        path=no_contact;
        title="DIN[6]";
        break;
    case DigitalIn7:
        path=nc_contact;
        title="DIN[7]";
        break;
    case TIM1:
        path=no_contact;
        title="TIM1";
        break;
    case CNT1:
        path=no_contact;
        title="CNT1";
        break;
    case CNT2:
        path=no_contact;
        title="CNT2";
        break;
    case AUX0:
        path=no_coil;
        title="AUX[0]";
        break;
    case AUX1:
        path=no_coil;
        title="AUX[1]";
        break;
    case AUX2:
        path=no_coil;
        title="AUX[2]";
        break;
    case AUX3:
        path=no_coil;
        title="AUX[3]";
        break;
    case AUX4:
        path=no_coil;
        title="AUX[4]";
        break;
    case AUX5:
        path=nc_coil;
        title="AUX[5]";
        break;
    case AUX6:
        path=no_coil;
        title="AUX[6]";
        break;
    case AUX7:
        path=no_coil;
        title="AUX[7]";
        break;
    case DigitalOut0:
        path=no_coil;
        title="DOUT[0]";
        break;
    case DigitalOut1:
        path=no_coil;
        title="DOUT[1]";
        break;
    case DigitalOut2:
        path=no_coil;
        title="DOUT[2]";
        break;
    case DigitalOut3:
        path=no_coil;
        title="DOUT[3]";
        break;
    case DigitalOut4:
        path=no_coil;
        title="DOUT[4]";
        break;
    case DigitalOut5:
        path=no_coil;
        title="DOUT[5]";
        break;
    case DigitalOut6:
        path=no_coil;
        title="DOUT[6]";
        break;
    case DigitalOut7:
        path=no_coil;
        title="DOUT[7]";
        break;
    case TIM1EN:
        path=no_coil;
        title="TIM1EN";
        break;
    case TIM1STOP:
        path=no_coil;
        title="TIM1STOP";
        break;
    case CNT1SET:
        path=no_coil;
        title="CNT1SET";
        break;
    case CNT2SET:
        path=no_coil;
        title="CNT2SET";
        break;
    case CNT1RESET:
        path=no_coil;
        title="CNT1RST";
        break;
    case CNT2RESET:
        path=no_coil;
        title="CNT2RST";
        break;

    }

    path.addText(QPointF(-32,30),QFont(),title);
    myPath=QPainterPath(path);
    myPolygon=QPolygonF(QRectF(-35,-35,70,70));
    setPen(QPen(Qt::black, 2));
    setPath(path);
    setFlag(QGraphicsItem::ItemIsMovable, true);
    setFlag(QGraphicsItem::ItemIsSelectable, true);
    setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
}

DiagramItem::DiagramItem(const DiagramItem &diagramItem)
{
    myDiagramType=diagramItem.diagramType();
    operationMode=diagramItem.opMode();
    title=diagramItem.title;
    arrows=diagramItem.arrows;
    arrows_in=diagramItem.arrows_in;
    arrows_out=diagramItem.arrows_out;

}
//! [0]

//! [1]
void DiagramItem::removeArrow(Arrow *arrow)
{
    int index = arrows.indexOf(arrow);

    if (index != -1)
        arrows.removeAt(index);
}
//! [1]

//! [2]
void DiagramItem::removeArrows()
{
    foreach (Arrow *arrow, arrows) {
        arrow->startItem()->removeArrow(arrow);
        arrow->endItem()->removeArrow(arrow);
        scene()->removeItem(arrow);
        delete arrow;
    }
}
//! [2]

//! [3]
void DiagramItem::addArrow(Arrow *arrow)
{
    arrows.append(arrow);
}
//! [3]


//! [4]
QPixmap DiagramItem::image() const
{
    QPixmap pixmap(70, 70);
    pixmap.fill(Qt::white);
    QPainter painter(&pixmap);
    painter.setPen(QPen(Qt::black, 2));
    painter.translate(35, 35);
    painter.drawPath(myPath);

    return pixmap;
}
//! [4]

//! [5]
void DiagramItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
{
    scene()->clearSelection();
    setSelected(true);
    myContextMenu->exec(event->screenPos());
}
//! [5]

//! [6]
QVariant DiagramItem::itemChange(GraphicsItemChange change, const QVariant &value)
{
    if (change == QGraphicsItem::ItemPositionChange) {

        foreach (Arrow *arrow, arrows) {
            arrow->updatePosition();
        }
    }

    return value;
}
//! [6]
void DiagramItem::makeInput(){
    if(normallyOpen){
        myPath=no_contact;
    }

    else{
        myPath=nc_contact;
    }


    myPath.addText(QPointF(-32,30),QFont(),title);

    setPath(myPath);

}

void DiagramItem::makeOutput(){
    if(normallyOpen){
        myPath=no_coil;
    }

    else{
        myPath=nc_coil;
    }


    myPath.addText(QPointF(-32,30),QFont(),title);

    setPath(myPath);
}

bool DiagramItem::operator==(DiagramItem &item)
{
    return myDiagramType==item.diagramType();

}

QString DiagramItem::operator<<(DiagramItem &item)
{
    return item.title;
}

三、下载链接

https://download.csdn.net/download/u013083044/89658333

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

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

相关文章

1 Kubeflow总体介绍-学习笔记

1 什么是 Kubeflow Kubeflow 是一个开源项目社区和生态系统&#xff0c;支持机器学习 (ML) 生命周期中的每个阶段 &#xff0c;并支持相关的开源 工具和框架&#xff0c;Kubeflow 使 Kubernetes 上的 AI/ML 变得简单、可移植且可扩展。 Kubeflow 都能提供模块化、可扩展的工具…

C语言第17篇

1.在C语言中,全局变量的存储类别是_________. A) static B) extern C) void D) register 提示&#xff1a;extern adj.外来的 register n.登记表&#xff0c;v.登记 提示与本题无关 2.在一个C源程序文件中,要定义一个只允许本源文件中所有函数使用的全局变…

JimuReport 积木报表 v1.8.0 版本发布,开源可视化报表

项目介绍 一款免费的数据可视化报表工具&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完…

【Python】成功解决 NameError: name ‘reload‘ is not defined

【Python】成功解决 NameError: name ‘reload’ is not defined 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校…

【学习笔记】7、存储器、复杂可编程器件和现场可编程门阵列

可编程逻辑器件PLD复杂可编程逻辑器件CPLD现场可编程门阵列FPGA 7.1 只读存储器&#xff08;ROM&#xff09; 7.1.1 ROM的结构 ROM存储器 存储阵列 地址译码器 输出控制电路 存储阵列&#xff0c;由许多存储单元&#xff08;1bit&#xff09;组成。每次读出一组数据&…

HTML实现俄罗斯方块

本篇文章主要讲使用HTML、CSS和JavaScript实现一个简单的俄罗斯方块游戏&#xff0c;包含基本的游戏逻辑、行消除功能以及暂停和继续游戏的控制。 使用工具 本篇文章有用到ChatGPT-4o代码纠错&#xff0c;国内免翻且稳定&#xff0c;感兴趣的大佬试试。 传送门&#xff1a;36…

认知杂谈20

今天分享 有人说的一段争议性的话 I I 程序员的高薪舒适圈&#xff1a;光鲜背后的挑战 一说起程序员这个职业&#xff0c;很多人马上就会想到高薪&#xff0c;觉得他们过着白领的生活。确实&#xff0c;程序员一般都能拿到比好多行业都高的工资&#xff0c;工作时间也比较稳…

谷粒商城实战笔记-232-商城业务-认证服务-框架效果演示-xxl-sso-徐雪里

文章目录 一&#xff0c;膜拜大神许雪里二&#xff0c;用开源框架xxl-sso演示单点登录1&#xff0c;我是老板&#xff0c;我有三个网站2&#xff0c;配置域名3&#xff0c;下载xxl-sso代码4&#xff0c;服务规划5&#xff0c;配置修改5.1 xxl-sso-server redis配置修改5.1 xxl-…

使用FModel提取黑神话悟空的资产

使用FModel提取黑神话悟空的资产 前言设置效果展示闲聊可能遇到的问题没有相应的UE引擎版本选项 前言 黑神话悟空昨天上线了&#xff0c;解个包looklook。 本文内容比较简洁&#xff0c;仅介绍解包黑神话所需的专项配置&#xff0c;关于FModel的基础使用流程&#xff0c;请见…

Python3学习(一)

目录 Python版本 标识符 保留字 注释 缩进 多行语句 同一行显示多条语句 import 与 from...import 变量 数据类型 Number&#xff08;数字&#xff09; 数字类型 数值运算 String&#xff08;字符串&#xff09; bool&#xff08;布尔类型) List&#xff08;列…

废品回收小程序,开启上门回收模式

废品回收一直是一个热门行业&#xff0c;市场发展空间巨大。随着科技的发展&#xff0c;废品回收也与时俱进&#xff0c;进行了转型&#xff01;“互联网上门回收”的新模式&#xff0c;运用信息技术的力量&#xff0c;让废品回收变得更加高效便捷&#xff0c;同时也为回收行业…

秋招红队面试经验分享

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330#rd 《网安面试指南》 《Java代码审计》 《Web安全…

【JS|第25期】探索HTTP POST请求:请求体的演变与应用

日期&#xff1a;2024年8月16日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…

OpenLayers3, 缩放、平移、复位操作

文章目录 一、前言二、代码示例 一、前言 本文基于OpenLayers3实现地图缩放、平移和复位操作 二、代码示例 <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htm…

【YOLO5 项目实战】(4)红外目标检测

欢迎关注『youcans动手学模型』系列 本专栏内容和资源同步到 GitHub/youcans 【YOLO5 项目实战】&#xff08;1&#xff09;YOLO5 环境配置与测试 【YOLO5 项目实战】&#xff08;2&#xff09;使用自己的数据集训练目标检测模型 【YOLO5 项目实战】&#xff08;3&#xff09;P…

12 程序控制语句:循环控制(while、do-while、for、多重嵌套循环、死循环)

目录 1 while 循环 1.1 基本语法 1.2 流程图 1.3 计数循环 1.3.1 实现原则 1.3.2 案例&#xff1a;循环输出语句 1.3.3 案例&#xff1a;循环输出数字 7~15 1.3.4 案例&#xff1a;倒序输出数字 56 ~ 43 1.3.5 案例&#xff1a;输出 10&#xff08;包括 10&…

SAP 预扣税配置步骤文档【Withholding Tax]

1. 配置预扣税的基本概念 预扣税是对某些支付进行扣除的税&#xff0c;可能适用于各种财务交易&#xff08;例如&#xff0c;供应商支付、股息支付等&#xff09;。预扣税通常包括几种类型&#xff0c;如个人所得税、企业所得税和其他税务种类。 2. 配置步骤 以下是一般的预…

Notion使用详解

​ ​ 您好&#xff0c;我是程序员小羊&#xff01; 前言 Notion是一款集笔记、任务管理、知识库、文档协作等多功能于一体的生产力工具。其灵活性和可定制性使得它在个人和团队协作中都非常受欢迎。本教程将详细介绍如何使用Notion的基本功能&#xff0c;帮助你快速上手并充分…

Open3D mesh 模型切片

目录 一、概述 1.1简述 1.2实现步骤 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始mesh 3.2切片后的mesh Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云深度学习案例汇总&#xff08;长期更新&#xff09;-CSDN博客 一…

Python高光谱遥感数据处理与机器学习深度应用

高光谱遥感信息对于我们认识世界具有重要意义。尽管大部分物质在人眼中看似无异&#xff0c;然而高光谱遥感的观察下&#xff0c;它们呈现出独特的"光谱特征"。这种能够窥见事物的"本质"能力具备着革命性的潜能&#xff0c;对精准农业、地球观测、艺术分析…