qt-PLC可视化编辑器

qt-PLC可视化编辑器


一、演示效果

二、核心代码

c 复制代码
#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

相关推荐
ccecw11 分钟前
Mysql ONLY_FULL_GROUP_BY模式详解、group by非查询字段报错
数据库·mysql
JH307314 分钟前
达梦数据库与MySQL的核心差异解析:从特性到实践
数据库·mysql
数据知道30 分钟前
PostgreSQL 核心原理:如何利用多核 CPU 加速大数据量扫描(并行查询)
数据库·postgresql
麦聪聊数据2 小时前
Web 原生架构如何重塑企业级数据库协作流?
数据库·sql·低代码·架构
未来之窗软件服务2 小时前
数据库优化提速(四)新加坡房产系统开发数据库表结构—仙盟创梦IDE
数据库·数据库优化·计算机软考
云中飞鸿3 小时前
QTCreator快捷键
qt
Goat恶霸詹姆斯3 小时前
mysql常用语句
数据库·mysql·oracle
大模型玩家七七4 小时前
梯度累积真的省显存吗?它换走的是什么成本
java·javascript·数据库·人工智能·深度学习
曾经的三心草4 小时前
redis-9-哨兵
数据库·redis·bootstrap
明哥说编程4 小时前
Dataverse自定义表查询优化:D365集成大数据量提速实战【索引配置】
数据库·查询优化·dataverse·dataverse自定义表·索引配置·d365集成·大数据量提速