在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例Android手机应用开发 → QT编写的组态源码

QT编写的组态源码

Android手机应用开发

下载此实例
  • 开发语言:C/C++
  • 实例大小:68.39M
  • 下载次数:248
  • 浏览次数:3925
  • 发布时间:2016-11-22
  • 实例类别:Android手机应用开发
  • 发 布 人:osean_li
  • 文件格式:.zip
  • 所需积分:5
 相关标签: qt组态源码

实例介绍

【实例简介】文中包含了程序的源码,可以使用qt creator编译。
【实例截图】
#include "Maker.h"

//#include "../Scada/Dialog/RunMode/DialogRunMode.h"
#include "../Scada/Dialog/Style/DialogStyle.h"
#include "../Scada/Dialog/Play/DialogPlay.h"
//#include "../Scada/Dialog/Control/DialogControl.h"
#include "../Scada/Dialog/Linkage/DialogLinkage.h"
#include "../Scada/Dialog/Service/DialogService.h"
#include "../Scada/Dialog/JsHelper/DialogJsHelper.h"
#include "../Scada/Dialog/NewScene/DialogNewScene.h"
#include "../Scada/Dialog/AddLink/DialogAddLink.h"
#include "../Scada/Dialog/DataBase/DialogDataBase.h"
#include "../Scada/Src/Xml/XmlWriter.h"
#include "../Scada/Src/Xml/XmlReader.h"

#include "../Scada/Src/Item/ItemFactory.h"

#include "../Scada/Src/Undo/UndoAddDel.h"
#include "../Scada/Src/Undo/UndoMoveDrag.h"

#include <QFileDialog>
#include <QMessageBox>
#include <QFile>

#include <QDebug>

#if 1
#include <QMenuBar>
#include <QToolBar>
#include <QWidget>
#else
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QToolBar>
#include <QtWidgets/QWidget>
#endif
#include <QtXml/QDomDocument>
#include <QDebug>

Maker::Maker(QWidget *parent):
    QMainWindow(parent), mDefaltWinActSum(7) // 5个项 2个分隔符
{
    //mRunMode = new TRunMode(0, tr("127.0.0.1"), 6066);

    mProjectName = tr("");
    mCurrentScene = 0;
    mSceneId = 0;
    mSceneHost = 1;

    // 初始化数据库信息
    mDBMsg = new TDataBaseMsg();

    mDataBase = NULL;

    QWidget *mWidget = new QWidget(this);
    //mWidget->setObjectName(QStringLiteral("mWidget"));
    mWidget->setObjectName(tr("mWidget"));
    setCentralWidget(mWidget);

    mDrawSelected = NULL;

    fCreateActions();
    fCreateMenus();
    fCreateToolBars();

    fUpdateItems();

    mView = new TView();
    //mView->setFixedSize(1000, 600);
    //mView->setObjectName(tr("mView"));

    //mView->setGeometry(QRect(0, 0, 800, 600));
    //mView->setScene(mScene);

    mView->setDragMode(QGraphicsView::RubberBandDrag);
    //mView->setRenderHints(QPainter::Antialiasing
                   //      | QPainter::TextAntialiasing);
    //mView->setContextMenuPolicy(Qt::ActionsContextMenu);
    connect(mView, SIGNAL(mMousePress(int,int)), this, SLOT(fViewClick(int,int)));

    mZMin = 0;
    mZMax = 0;
    setWindowTitle(tr("组态制作程序"));
    QVBoxLayout *mLayoutMain = new QVBoxLayout(mWidget);

    mLayoutMain->addWidget(mView);
    //mLayoutMain->addWidget(mGroupBoxStyle);
}

void Maker::fViewClick(int x, int y)
{
    Q_UNUSED(x);
    Q_UNUSED(y);

    //qDebug() << mCurrentScene;
    //qDebug() << mDrawSelected;

    if(NULL == mCurrentScene)
    {
        if(NULL == mDrawSelected)
        {
            QMessageBox::warning(this, tr("提示"), tr("请选择一个绘图工具,再进行绘图"));
        }
        else
        {
            QMessageBox::warning(this, tr("提示"), tr("请执行“文件--新建”,新建一个画布,再进行绘图"));
        }
    }
}

void Maker::fCreateActions()
{
    mActionFileNew = fAddFileAction(tr("新建画布(&N)..."));
    mActionFileNew->setShortcut(QKeySequence::New);
    connect(mActionFileNew, SIGNAL(triggered()), this, SLOT(fNew()));
    mActionFileEdit = fAddFileAction(tr("编辑画布(&E)..."));
    connect(mActionFileEdit, SIGNAL(triggered()), this, SLOT(fEdit()));
    mActionFileClose = fAddFileAction(tr("删除画布(&C)"));
    connect(mActionFileClose, SIGNAL(triggered()), this, SLOT(fClose()));
    mActionFileCloseAll = fAddFileAction(tr("删除所有画布(&W)"));
    mActionFileCloseAll->setShortcut(QKeySequence::Close);
    connect(mActionFileCloseAll, SIGNAL(triggered()), this, SLOT(fCloseAll()));

    mActionFileOpen = fAddFileAction(tr("打开工程(&O)..."));
    mActionFileOpen->setShortcut(QKeySequence::Open);
    connect(mActionFileOpen, SIGNAL(triggered()), this, SLOT(fOpen()));
    mActionFileSave = fAddFileAction(tr("保存工程(&S)"));
    mActionFileSave->setShortcut(QKeySequence::Save);
    connect(mActionFileSave, SIGNAL(triggered()), this, SLOT(fSave()));
    mActionFileSaveAs = fAddFileAction(tr("工程另存为(&A)..."));
    mActionFileSaveAs->setShortcut(QKeySequence::SaveAs);
    connect(mActionFileSaveAs, SIGNAL(triggered()), this, SLOT(fSaveAs()));
    mActionFileOpenFromDB = fAddFileAction(tr("打开自数据库(&D)..."));
    connect(mActionFileOpenFromDB, SIGNAL(triggered()), this, SLOT(fLoadFromDB()));
    mActionFileSaveToDB = fAddFileAction(tr("保存至数据库(&B)"));
    connect(mActionFileSaveToDB, SIGNAL(triggered()), this, SLOT(fSaveToDB()));
    mActionFileSaveAsDB = fAddFileAction(tr("另保存为数据库(&G)..."));

    mActionFileSaveItem = fAddFileAction(tr("保存图元(&I)..."));
    connect(mActionFileSaveItem, SIGNAL(triggered()), this, SLOT(fSaveItems()));

    //////////////////////////////////////////////////
    mActionDrawFree = fAddDrawAction(tr("释放(&F)"), tr("://pic/draw/Free.png"), tr(""));
    mActionDrawFree->mType = TItem::Base;
    mActionDrawFree->setCheckable(false);// 不保持按下
    mActionDrawPoint = fAddDrawAction(tr("点(&D)"), tr("://pic/draw/Point.png"), tr(""));
    mActionDrawPoint->mType = TItem::Point;
    mActionDrawLine = fAddDrawAction(tr("线(&N)"), tr("://pic/draw/Line.png"), tr(""));
    mActionDrawLine->mType = TItem::Line;
    mActionDrawEllipse = fAddDrawAction(tr("椭圆(&E)"), tr("://pic/draw/Ellipse.png"), tr(""));
    mActionDrawEllipse->mType = TItem::Ellipse;
    mActionDrawRect = fAddDrawAction(tr("矩形(&R)"), tr("://pic/draw/Rect.png"), tr(""));
    mActionDrawRect->mType = TItem::Rect;
    mActionDrawPolygon = fAddDrawAction(tr("任意多边形(&P)"), tr("://pic/draw/Polygon.png"), tr(""));
    mActionDrawPolygon->mType = TItem::Polygon;
    connect(mActionDrawPolygon, SIGNAL(changed()), this, SLOT(fFinshPolygon()));
    mActionDrawArc = fAddDrawAction(tr("圆弧(&A)"), tr("://pic/draw/Arc.png"), tr(""));
    mActionDrawArc->mType = TItem::Arc;
    mActionDrawText = fAddDrawAction(tr("文字(&T)"), tr("://pic/draw/Text.png"), tr(""));
    mActionDrawText->mType = TItem::Text;
    mActionDrawValueText = fAddDrawAction(tr("值文字(&V)"), tr("://pic/draw/ValueText.png"), tr(""));
    mActionDrawValueText->mType = TItem::ValueText;
    mActionDrawPixmap = fAddDrawAction(tr("图片(&C)"), tr("://pic/draw/Pixmap.png"), tr(""));
    mActionDrawPixmap->mType = TItem::Pixmap;
    mActionDrawPath = fAddDrawAction(tr("路径(&H)"), tr("://pic/draw/Path.png"), tr(""));
    mActionDrawPath->mType = TItem::Path;

    mActionDrawButton = fAddDrawAction(tr("按钮(&U)"), tr("://pic/draw/Button.png"), tr(""));
    mActionDrawButton->mType = TItem::Button;
    mActionDrawTextBox = fAddDrawAction(tr("文本框(&I)"), tr("://pic/draw/TextBox.png"), tr(""));
    mActionDrawTextBox->mType = TItem::InputEdit;
    mActionDrawTable = fAddDrawAction(tr("表格(&B)"), tr("://pic/draw/Table.png"), tr(""));
    mActionDrawTable->mType = TItem::Table;
    mActionDrawProcessBar = fAddDrawAction(tr("进度条(&S)"), tr("://pic/draw/ProcessBar.png"), tr(""));
    mActionDrawProcessBar->mType = TItem::ProcessBar;
    mActionDrawMeter = fAddDrawAction(tr("表盘(&M)"), tr("://pic/draw/Clock.png"), tr(""));
    mActionDrawMeter->mType = TItem::Meter;
    mActionDrawLight = fAddDrawAction(tr("指示灯(&L)"), tr("://pic/draw/Light.png"), tr(""));
    mActionDrawLight->mType = TItem::Light;
    mActionDrawCurve = fAddDrawAction(tr("实时曲线(&C)"), tr("://pic/draw/Curve.png"), tr(""));
    mActionDrawCurve->mType = TItem::Curve;

    /////////////////////////////////////////////////
    mActionEditStyle = fAddEditAction(tr("样式(&S)..."), tr("://pic/edit/Style.png"), tr(""));
    connect(mActionEditStyle, SIGNAL(triggered()), this, SLOT(fStyle()));
    mActionEditCut = fAddEditAction(tr("剪切(&X)"), tr("://pic/edit/Cut.png"), tr(""));
    mActionEditCut->setShortcut(QKeySequence::Cut);
    connect(mActionEditCut, SIGNAL(triggered()), this, SLOT(fCut()));
    mActionEditCopy = fAddEditAction(tr("复制(&C)"), tr("://pic/edit/Copy.png"), tr(""));
    mActionEditCopy->setShortcut(QKeySequence::Copy);
    connect(mActionEditCopy, SIGNAL(triggered()), this, SLOT(fCopy()));
    mActionEditPaste = fAddEditAction(tr("粘贴(&P)"), tr("://pic/edit/Paste.png"), tr(""));
    mActionEditPaste->setShortcut(QKeySequence::Paste);
    connect(mActionEditPaste, SIGNAL(triggered()), this, SLOT(fPaste()));

    /*mActionEditUndo = fAddEditAction(tr("撤销"), tr("://pic/edit/Undo.png"), tr(""));
    mActionEditUndo->setShortcut(QKeySequence::Undo);
    mActionEditRedo = fAddEditAction(tr("重做"), tr("://pic/edit/Redo.png"), tr(""));
    mActionEditRedo->setShortcut(QKeySequence::Redo);*/

    mUndoStack = new QUndoStack(this);;
    mActionUndo = mUndoStack->createUndoAction(this, tr("撤销(&U)"));
    mActionUndo->setIcon(QIcon(tr("://pic/edit/Undo.png")));
    mActionUndo->setShortcut(QKeySequence::Undo);
    mActionRedo = mUndoStack->createRedoAction(this, tr("重做(&R)"));
    mActionRedo->setIcon(QIcon(tr("://pic/edit/Redo.png")));
    mActionRedo->setShortcut(QKeySequence::Redo);

    mActionEditDel = fAddEditAction(tr("删除(&D)"), tr("://pic/edit/Del.png"), tr(""));
    mActionEditDel->setShortcut(QKeySequence::Delete);
    connect(mActionEditDel, SIGNAL(triggered()), this, SLOT(fDel()));

    /////////////////////////////////////////////
    mActionGraphMerge = fAddEditAction(tr("合并(&M)"), tr("://pic/graph/Merge.png"), tr(""));
    connect(mActionGraphMerge, SIGNAL(triggered()), this, SLOT(fMerge()));
    mActionMoveToTop = fAddEditAction(tr("置于顶层(&T)"), tr("://pic/graph/MoveToTop.png"), tr(""));
    connect(mActionMoveToTop, SIGNAL(triggered()), this, SLOT(fTop()));
    mActionMoveToBottom = fAddEditAction(tr("置于底层(&D)"), tr("://pic/graph/MoveToBottom.png"), tr(""));
    connect(mActionMoveToBottom, SIGNAL(triggered()), this, SLOT(fBottom()));

    mActionAlignLeft = fAddEditAction(tr("左对齐(&L)"), tr("://pic/graph/AlignLeft.png"), tr(""));
    mActionAlignRight = fAddEditAction(tr("右对齐(&R)"), tr("://pic/graph/AlignRight.png"), tr(""));
    mActionAlignTop = fAddEditAction(tr("顶对齐(&T)"), tr("://pic/graph/AlignTop.png"), tr(""));
    mActionAlignBottom = fAddEditAction(tr("底对齐(&B)"), tr("://pic/graph/AlignBottom.png"), tr(""));

    mActionMoveUp = fAddEditAction(tr("上移"), tr("://pic/graph/Up.png"), tr(""));
    mActionMoveUp->setShortcut(QKeySequence::MoveToPreviousLine);
    connect(mActionMoveUp, SIGNAL(triggered()), this, SLOT(fUp()));
    mActionMoveDown = fAddEditAction(tr("下移"), tr("://pic/graph/Down.png"), tr(""));
    mActionMoveDown->setShortcut(QKeySequence::MoveToNextLine);
    connect(mActionMoveDown, SIGNAL(triggered()), this, SLOT(fDown()));
    mActionMoveLeft = fAddEditAction(tr("左移"), tr("://pic/graph/Left.png"), tr(""));
    mActionMoveLeft->setShortcut(QKeySequence::MoveToPreviousChar);
    connect(mActionMoveLeft, SIGNAL(triggered()), this, SLOT(fLeft()));
    mActionMoveRight = fAddEditAction(tr("右移"), tr("://pic/graph/Right.png"), tr(""));
    mActionMoveRight->setShortcut(QKeySequence::MoveToNextChar);
    connect(mActionMoveRight, SIGNAL(triggered()), this, SLOT(fRight()));

    /////////////////////////////////////////////////////////
    mActionJsHelper = fAddFileAction(tr("脚本助手(&E)..."));
    connect(mActionJsHelper, SIGNAL(triggered()), this, SLOT(fJsHelper()));
    mActionAttribute = fAddFileAction(tr("图形属性(&P)..."));
    connect(mActionAttribute, SIGNAL(triggered()), this, SLOT(fAttribute()));
    mActionLinkage = fAddFileAction(tr("图形联动(&L)..."));
    connect(mActionLinkage, SIGNAL(triggered()), this, SLOT(fLinkage()));
    //mActionRunMode = fAddFileAction(tr("运行模式"));
    //connect(mActionRunMode, SIGNAL(triggered()), this, SLOT(fRunMode()));
    mActionService = fAddFileAction(tr("系统服务(&S)..."));
    connect(mActionService, SIGNAL(triggered()), this, SLOT(fService()));
    mActionDB = fAddFileAction(tr("数据库配置(&D)..."));
    connect(mActionDB, SIGNAL(triggered()), this, SLOT(fDbMsg()));
    /////////////////////////////////////////////////////////////
    mActionZoomOut = fAddFileAction(tr("放大"));
    connect(mActionZoomOut, SIGNAL(triggered()), this, SLOT(fZoomOut()));
    mActionZoomIn = fAddFileAction(tr("缩小"));
    connect(mActionZoomIn, SIGNAL(triggered()), this, SLOT(fZoomIn()));
    mActionZoomNormal = fAddFileAction(tr("正常"));
    connect(mActionZoomNormal, SIGNAL(triggered()), this, SLOT(fZoomNormal()));
    mActionAddLink = fAddFileAction(tr("添加链接(&L)..."));
    connect(mActionAddLink, SIGNAL(triggered()), this, SLOT(fAddLink()));
    mActionSetHost = fAddFileAction(tr("设为主画面(&H)"));
    connect(mActionSetHost, SIGNAL(triggered()), this, SLOT(fSetHost()));
    ///////////////////////////////////////////////////////
    mActionAbout = fAddFileAction(tr("关于(&A)"));
}


TAction *Maker::fAddDrawAction(QString _Name, QString _IconDir, QString _ShutCut)
{
    TAction *Action = new TAction(_Name, this);
    Action->setIcon(QIcon(_IconDir));
    Action->setCheckable(true);

    if(_ShutCut.length() > 0)
    {
        Action->setShortcut(_ShutCut);
    }

    connect(Action, SIGNAL(triggered()), this, SLOT(fUpdateDrawAction()));

    return Action;
}

TAction *Maker::fAddEditAction(QString _Name, QString _IconDir, QString _ShutCut)
{
    TAction *Action = new TAction(_Name, this);
    Action->setIcon(QIcon(_IconDir));
    //Action->setCheckable(true);
    Action->mType = TItem::Base;

    if(_ShutCut.length() > 0)
    {
        Action->setShortcut(_ShutCut);
    }

    return Action;
}

TAction *Maker::fAddFileAction(QString _Name)
{
    TAction *Action = new TAction(_Name, this);

    return Action;
}

void Maker::fCreateMenus()
{
    QMenuBar *mMenuBar = new QMenuBar(this);
    //mMenuBar->setObjectName(QStringLiteral("mMenuBar"));
    mMenuBar->setObjectName(tr("mMenuBar"));
    //mMenuBar->setGeometry(QRect(0, 0, 1366, 23));
    this->setMenuBar(mMenuBar);

    mFileMenu = mMenuBar->addMenu(tr("文件(&F)"));
    mFileMenu->addAction(mActionFileNew);
    mFileMenu->addAction(mActionFileEdit);
    mFileMenu->addAction(mActionFileClose);
    mFileMenu->addAction(mActionFileCloseAll);
    mFileMenu->addSeparator();
    mFileMenu->addAction(mActionFileOpen);
    mFileMenu->addAction(mActionFileSave);
    mFileMenu->addAction(mActionFileSaveAs);
    mFileMenu->addSeparator();
    mFileMenu->addAction(mActionFileOpenFromDB);
    mFileMenu->addAction(mActionFileSaveToDB);
    mFileMenu->addAction(mActionFileSaveAsDB);
    mFileMenu->addSeparator();
    mFileMenu->addAction(mActionFileSaveItem);

    mDrawMenu = mMenuBar->addMenu(tr("绘图(&D)"));
    mDrawMenu->addAction(mActionDrawFree);
    mDrawMenu->addSeparator();
    mDrawMenu->addAction(mActionDrawButton);
    mDrawMenu->addAction(mActionDrawTextBox);
    mDrawMenu->addAction(mActionDrawTable);
    mDrawMenu->addSeparator();
    mDrawMenu->addAction(mActionDrawValueText);
    mDrawMenu->addAction(mActionDrawProcessBar);
    mDrawMenu->addAction(mActionDrawMeter);
    mDrawMenu->addAction(mActionDrawLight);
    mDrawMenu->addAction(mActionDrawCurve);
    mDrawMenu->addSeparator();
    mDrawMenu->addAction(mActionDrawPoint);
    mDrawMenu->addAction(mActionDrawLine);
    mDrawMenu->addAction(mActionDrawEllipse);
    mDrawMenu->addAction(mActionDrawRect);
    mDrawMenu->addAction(mActionDrawPolygon);
    mDrawMenu->addAction(mActionDrawArc);
    mDrawMenu->addAction(mActionDrawText);
    mDrawMenu->addAction(mActionDrawPixmap);
    mDrawMenu->addAction(mActionDrawPath);

    mEditMenu = mMenuBar->addMenu(tr("编辑(&E)"));
    mEditMenu->addAction(mActionEditStyle);
    mEditMenu->addSeparator();
    mEditMenu->addAction(mActionEditCut);
    mEditMenu->addAction(mActionEditCopy);
    mEditMenu->addAction(mActionEditPaste);
    mEditMenu->addAction(mActionEditDel);
    mEditMenu->addSeparator();
    //mEditMenu->addAction(mActionEditUndo);
    //mEditMenu->addAction(mActionEditRedo);
    mEditMenu->addAction(mActionUndo);
    mEditMenu->addAction(mActionRedo);

    mGraphicsMenu = mMenuBar->addMenu(tr("图形(&G)"));
    mGraphicsMenu->addAction(mActionGraphMerge);
    mGraphicsMenu->addAction(mActionMoveToTop);
    mGraphicsMenu->addAction(mActionMoveToBottom);
    mGraphicsMenu->addSeparator();
    mGraphicsMenu->addAction(mActionAlignLeft);
    mGraphicsMenu->addAction(mActionAlignRight);
    mGraphicsMenu->addAction(mActionAlignTop);
    mGraphicsMenu->addAction(mActionAlignBottom);
    mGraphicsMenu->addSeparator();
    mGraphicsMenu->addAction(mActionMoveUp);
    mGraphicsMenu->addAction(mActionMoveDown);
    mGraphicsMenu->addAction(mActionMoveLeft);
    mGraphicsMenu->addAction(mActionMoveRight);

    mManageMenu = mMenuBar->addMenu(tr("管理(&M)"));
    //mManageMenu->addAction(mActionRunMode);
    mManageMenu->addAction(mActionAttribute);
    mManageMenu->addAction(mActionLinkage);
    mManageMenu->addAction(mActionService);
    mManageMenu->addAction(mActionDB);
    mManageMenu->addAction(mActionJsHelper);

    mWindowMenu = mMenuBar->addMenu(tr("窗口(&U)"));
    mWindowMenu->addAction(mActionZoomOut);
    mWindowMenu->addAction(mActionZoomIn);
    mWindowMenu->addAction(mActionZoomNormal);
    mWindowMenu->addSeparator();
    mWindowMenu->addAction(mActionSetHost);
    mWindowMenu->addAction(mActionAddLink);
    mWindowMenu->addSeparator();

    mAboutMenu = mMenuBar->addMenu(tr("关于(&H)"));
    mAboutMenu->addAction(mActionAbout);
}

void Maker::fCreateToolBars()
{
    mDrawToolBar = new QToolBar(tr("绘图"));
    mDrawToolBar->setGeometry(QRect(0, 0, 16, 600));
    mDrawToolBar->addAction(mActionDrawFree);
    mDrawToolBar->addSeparator();
    mDrawToolBar->addAction(mActionDrawButton);
    mDrawToolBar->addAction(mActionDrawTextBox);
    mDrawToolBar->addAction(mActionDrawTable);
    mDrawToolBar->addSeparator();
    mDrawToolBar->addAction(mActionDrawValueText);
    mDrawToolBar->addAction(mActionDrawProcessBar);
    mDrawToolBar->addAction(mActionDrawMeter);
    mDrawToolBar->addAction(mActionDrawLight);
    mDrawToolBar->addAction(mActionDrawCurve);
    mDrawToolBar->addSeparator();
    mDrawToolBar->addAction(mActionDrawPoint);
    mDrawToolBar->addAction(mActionDrawLine);
    mDrawToolBar->addAction(mActionDrawEllipse);
    mDrawToolBar->addAction(mActionDrawRect);
    mDrawToolBar->addAction(mActionDrawPolygon);
    mDrawToolBar->addAction(mActionDrawArc);
    mDrawToolBar->addAction(mActionDrawText);
    mDrawToolBar->addAction(mActionDrawPixmap);
    mDrawToolBar->addAction(mActionDrawPath);
    addToolBar(Qt::LeftToolBarArea, mDrawToolBar);

    mEditToolBar = new QToolBar(tr("编辑"));
    mEditToolBar->setGeometry(QRect(0, 0, 16, 600));
    mEditToolBar->addAction(mActionEditStyle);
    mEditToolBar->addSeparator();
    mEditToolBar->addAction(mActionEditCut);
    mEditToolBar->addAction(mActionEditCopy);
    mEditToolBar->addAction(mActionEditPaste);
    mEditToolBar->addAction(mActionEditDel);
    mEditToolBar->addSeparator();
    //mEditToolBar->addAction(mActionEditUndo);
    //mEditToolBar->addAction(mActionEditRedo);
    mEditToolBar->addAction(mActionUndo);
    mEditToolBar->addAction(mActionRedo);
    mEditToolBar->addSeparator();
    mEditToolBar->addAction(mActionGraphMerge);
    mEditToolBar->addAction(mActionMoveToTop);
    mEditToolBar->addAction(mActionMoveToBottom);
    mEditToolBar->addSeparator();
    mEditToolBar->addAction(mActionAlignLeft);
    mEditToolBar->addAction(mActionAlignRight);
    mEditToolBar->addAction(mActionAlignTop);
    mEditToolBar->addAction(mActionAlignBottom);
    mEditToolBar->addSeparator();
    mEditToolBar->addAction(mActionMoveUp);
    mEditToolBar->addAction(mActionMoveDown);
    mEditToolBar->addAction(mActionMoveLeft);
    mEditToolBar->addAction(mActionMoveRight);
    addToolBar(Qt::RightToolBarArea, mEditToolBar);

    ///////////////////////////////////////////////////////////////
    /*mLabelItemFlagShow = TBase::fLabel(tr("      图形属性"), tr("mLabelItemFlagShow"));
    mComboBoxItemFlag = TBase::fComboBox(tr("mComboBoxItemFlag"));
    mComboBoxItemFlag->addItem(tr("可拖拽"));
    mComboBoxItemFlag->addItem(tr("可移动"));
    mComboBoxItemFlag->setCurrentIndex(1);
    connect(mComboBoxItemFlag, SIGNAL(currentIndexChanged(int)), this, SLOT(fItemFlag(int)));
    */
    mLabelLineStyleShow = TBase::fLabel(tr("      样式"), tr("mLabelLineStyleShow"));
    mComboBoxLineStyle = TBase::fLineStyleComboBox();
    mComboBoxLineStyle->setCurrentIndex(1);
    mLineStyle = Qt::SolidLine;
    connect(mComboBoxLineStyle, SIGNAL(currentIndexChanged(int)), this, SLOT(fLineStyleChanged(int)));

    mLabelLineWidthShow = TBase::fLabel(tr("宽度"), tr("mLabelLineWidthShow"));
    mLabelLineWidth     = TBase::fLabel(tr(""), tr("mLabelLineWidth"), 50, 22);

    mSpinBoxLineWidth   = TBase::fSpinBox(tr("mSpinBoxLineWidth"), 1, 100);
    mLineWidth = 1;
    fLineWidthChanged(1);
    connect(mSpinBoxLineWidth, SIGNAL(valueChanged(int)), this, SLOT(fLineWidthChanged(int)));

    mLabelLineColorShow = TBase::fLabel(tr("线条"), tr("mLabelLineColorShow"));
    mLabelLineColor     = TBase::fLabel(tr(""), tr("mLabelLineColor"), 50, 22);

    mLineColor = Qt::white;
    TBase::fColorLabel(mLabelLineColor, mLineColor);
    mButtonLineColor    = TBase::fButton(tr("浏览"), tr("mButtonLineColor"));
    connect(mButtonLineColor, SIGNAL(clicked()), this, SLOT(fUpdateLineColor()));

    mLabelBackColorShow = TBase::fLabel(tr("背景"), tr("mLabelBackColorShow"));
    mLabelBackColor     = TBase::fLabel(tr(""), tr("mLabelBackColor"), 50, 22);

    mBackColor = Qt::black;
    TBase::fColorLabel(mLabelBackColor, mBackColor);
    mButtonBackColor    = TBase::fButton(tr("浏览"), tr("mButtonLineColor"));
    connect(mButtonBackColor, SIGNAL(clicked()), this, SLOT(fUpdateBackColor()));

    mStateToolBar = new QToolBar(tr("状态"));
    mStateToolBar->setGeometry(QRect(0, 0, 16, 600));
    /*mStateToolBar->addWidget(mLabelItemFlagShow);
    mStateToolBar->addSeparator();
    mStateToolBar->addWidget(mComboBoxItemFlag);
    mStateToolBar->addSeparator();
    mStateToolBar->addSeparator();
    mStateToolBar->addSeparator();*/

    mStateToolBar->addWidget(mLabelLineStyleShow);
    mStateToolBar->addSeparator();
    mStateToolBar->addWidget(mComboBoxLineStyle);
    mStateToolBar->addSeparator();
    mStateToolBar->addSeparator();
    mStateToolBar->addSeparator();

    mStateToolBar->addWidget(mLabelLineWidthShow);
    mStateToolBar->addSeparator();
    mStateToolBar->addWidget(mLabelLineWidth);
    mStateToolBar->addSeparator();
    mStateToolBar->addWidget(mSpinBoxLineWidth);
    mStateToolBar->addSeparator();
    mStateToolBar->addSeparator();
    mStateToolBar->addSeparator();

    mStateToolBar->addWidget(mLabelLineColorShow);
    mStateToolBar->addSeparator();
    mStateToolBar->addWidget(mLabelLineColor);
    mStateToolBar->addSeparator();
    mStateToolBar->addWidget(mButtonLineColor);
    mStateToolBar->addSeparator();
    mStateToolBar->addSeparator();
    mStateToolBar->addSeparator();

    mStateToolBar->addWidget(mLabelBackColorShow);
    mStateToolBar->addSeparator();
    mStateToolBar->addWidget(mLabelBackColor);
    mStateToolBar->addSeparator();
    mStateToolBar->addWidget(mButtonBackColor);

    addToolBar(Qt::BottomToolBarArea, mStateToolBar);

    ////////////////////////////////////////////////////////////////
    mItemToolBar = new QToolBar(tr("图元"));
    mItemToolBar->setGeometry(QRect(0, 0, 16, 600));
    addToolBar(Qt::BottomToolBarArea, mItemToolBar);
}

void Maker::fStyle()
{
    DialogStyle *mStyle = new DialogStyle(fItemSelected(), this);

    if(mStyle->mInit)
    {
        mStyle->exec();
    }
    else
    {
        QMessageBox::warning(this, tr("提示"), tr("选择一个图形再进行操作"));
    }

    delete mStyle;
}

void Maker::fCut()
{
    if(NULL == mCurrentScene)
    {
        return;
    }

    mCurrentScene->fGetItemsSelected(mCopyList);

    foreach (TItem *mItem, mCopyList)
    {
        mCurrentScene->removeItem(mItem);
    }
}

void Maker::fCopy()
{
    if(NULL == mCurrentScene)
    {
        return;
    }

    mCurrentScene->fGetItemsSelected(mCopyList);
}

void Maker::fPaste()
{
    if(NULL == mCurrentScene)
    {
        return;
    }

    fCopyItemListToScene(mCopyList);
}

void Maker::fDel()
{
    if(NULL == mCurrentScene)
    {
        return;
    }

    QList<TItem *> items;
    mCurrentScene->fGetItemsSelected(items);

    TUndoAddDel *Undo = new TUndoAddDel(mCurrentScene, items);
    Undo->fSetOperation(TUndoAddDel::OPERATION_DEL);
    // Undo模块添加时会自动执行一次,把item从scene删除
    mUndoStack->push(Undo);

    // 加入Undo以后,删除以后不释放
    /*
    // 更新复制列表
    if(mCopyList.count() > 0)
    {
        foreach (TItem *mItem, items)
        {
            mCopyList.removeOne(mItem);
        }
    }

    qDeleteAll(items);
    */
}

void Maker::fMerge()
{
    if(NULL == mCurrentScene)
    {
        return;
    }

    QList<TItem *> ItemsList;
    mCurrentScene->fGetItemsSelected(ItemsList);

    //qDebug() << items.length() << items.size();

    if(ItemsList.size() <= 1)
    {
        return;
    }    

    TGroup *mGroup = new TGroup();

    if(mGroup)
    {
        mGroup->fAddItems(ItemsList);
        fUpItems(mGroup);
        fAddItemToScene(mGroup);
    }
}

void Maker::fDraw(double StartX, double StartY, double StopX, double StopY)
{
    TItem *Item = NULL;

    if(mCurrentScene && NULL != mDrawSelected)
    {
        if(StartX == StopX && StartY == StopY)
        {
            StopX = StartX   50;
            StartY = StartY   50;
        }

        if(TItem::Polygon != mDrawSelected->mType)
        {
            Item = TItemFactory::fFactory(mDrawSelected->mType,
                                      StartX, StartY, StopX, StopY,
                                      mLineStyle, mLineWidth, mLineColor, mBackColor);
        }
        else if(mPolygonPoints.count() < 64)
        {
            mPolygonPoints.push_front(QPointF(StartX, StartY));
        }

        if(NULL == Item)
        {
            return;
        }

        //qDebug() << mDrawSelected << mDrawSelected->mType;
        switch(Item->fGetType())
        {
        case TItem::Table:
        {
            TTable* Table = dynamic_cast<TTable *>(Item);

            if(Table)
            {
                Table->fSetSize(5, 5);
            }
        }
        break;

        default:
            break;
        }
    }

    fAddItemToScene(Item);
}

void Maker::fMoveItemList(TScene *Scene, QList<TItem *> ItemList,
                          double StartX, double StartY, double StopX, double StopY)
{
    if(NULL == Scene || ItemList.length() <= 0)
    {
        return;
    }

    //qDebug() << "Maker::fMoveItemList" << StartX << StartY << StopX << StopY;

    TUndoMoveDrag *Undo = new TUndoMoveDrag(Scene, ItemList);
    mUndoStack->push(Undo);

    double dx = StopX - StartX;
    double dy = StopY - StartY;
    Undo->fSetVector(dx, dy, dx, dy);
}

TItem* Maker::fItemSelected() const
{
    if(NULL == mCurrentScene)
    {
        return NULL;
    }

    QList<TItem *> items;

    mCurrentScene->fGetItemsSelected(items);

    if(items.count() > 0)
    {
        return items.first();
    }
    else
    {
        return NULL;
    }
}

TGraphics* Maker::fGraphicsSelected() const
{
    if(NULL == mCurrentScene)
    {
        return NULL;
    }

    QList<TGraphics *> items;

    mCurrentScene->fGetItemsSelected(items);

    if(items.count() > 0)
    {
        return items.first();
    }
    else
    {
        return NULL;
    }
}

TWidgets* Maker::fWidgetsSelected() const
{
    if(NULL == mCurrentScene)
    {
        return NULL;
    }

    QList<TWidgets *> items;

    mCurrentScene->fGetItemsSelected(items);

    if(items.count() > 0)
    {
        return items.first();
    }
    else
    {
        return NULL;
    }
}

void Maker::fUpdateDrawAction()
{
    TAction *mClick = (TAction *)sender();

    if(NULL != mDrawSelected)
    {        
        mDrawSelected->setChecked(false);
    }

    if(mClick == mDrawSelected)
    {
        //mView->setDragMode(QGraphicsView::NoDrag);
        mDrawSelected = NULL;
    }
    else
    {
        mDrawSelected = mClick;
#if false
        if(NULL != mDrawSelected)
        {
            if(TAction::Free != mDrawSelected->mType)
            {
                mView->setDragMode(QGraphicsView::RubberBandDrag);
            }
            else
            {
                mView->setDragMode(QGraphicsView::NoDrag);
            }
        }
#endif
    }
}

void Maker::fAttribute()
{
    TItem *Item = fItemSelected();

    if(NULL == Item)
    {
        QMessageBox::warning(this, tr("提示"), tr("未选中图形,或者选中图形不支持该操作"));
        return;
    }

    DialogPlay *Play = new DialogPlay(Item, mServiceList, this);

    if(Play)
    {
        if(Play->mInit)
        {
            Play->exec();
        }
        else
        {
            QMessageBox::warning(this, tr("提示"), tr("未知错误,请重试"));
        }

        delete Play;
    }
}

void Maker::fLinkage()
{
    if(mSceneList.length() <= 0 || mServiceList.length() <= 0)
    {
        QMessageBox::warning(this, tr("提示"), tr("请至少新建一个画布和一个服务"));
        return;
    }

    DialogLinkage *ShowLinkage = new DialogLinkage(mSceneList, mServiceList, mLinkageList, this);

    if(ShowLinkage->mInit)
    {
        ShowLinkage->exec();

        if(ShowLinkage->mSave)
        {
            foreach(TLinkage *Linkage, mLinkageList)
            {
                mLinkageList.removeOne(Linkage);
                delete Linkage;
            }

            //qDebug() << "fLinkage" << "ShowLinkage->mLinkageList" << ShowLinkage->mLinkageList.length();
            foreach(TLinkage *Linkage, ShowLinkage->mLinkageList)
            {
                mLinkageList.push_back(new TLinkage(Linkage));
            }
        }
    }
    else
    {
        QMessageBox::warning(this, tr("提示"), tr("未知错误,请重试"));
    }

    delete ShowLinkage;
}

void Maker::fJsHelper()
{
    DialogJsHelper *JsHelper = new DialogJsHelper(this);

    if(JsHelper)
    {
        JsHelper->exec();

        delete JsHelper;
    }
}

void Maker::fUpdateLineColor()
{
    if(TBase::fChooseColor(mLineColor, this))
    {
        TBase::fColorLabel(mLabelLineColor, mLineColor);
    }
}

void Maker::fUpdateBackColor()
{
    if(TBase::fChooseColor(mBackColor, this))
    {
        TBase::fColorLabel(mLabelBackColor, mBackColor);
    }
}

void Maker::fTop()
{
    if(NULL == mCurrentScene)
    {
        return;
    }

    QList<TItem *> ItemList;
    mCurrentScene->fGetItemsSelected(ItemList);

    foreach(TItem *Item, ItemList)
    {
        fUpItems(Item);
    }
}

void Maker::fUpItems(TItem *Item)
{
    Item->fSetZValue(  mZMax);
}

void Maker::fBottom()
{
    if(NULL == mCurrentScene)
    {
        return;
    }

    QList<TItem *> ItemList;
    mCurrentScene->fGetItemsSelected(ItemList);

    foreach(TItem *Item, ItemList)
    {
        Item->fSetZValue(--mZMin);
    }
}

void Maker::fMove(double Dx1, double Dy1, double Dx2, double Dy2)
{
    if(NULL == mCurrentScene)
    {
        return;
    }

    QList<TItem *> ItemList;
    mCurrentScene->fGetItemsSelected(ItemList);

    foreach(TItem *Item, ItemList)
    {
        Item->fMoveTo(Item->fGetStartX()   Dx1, Item->fGetStartY()   Dy1,
                      Item->fGetStopX()   Dx2, Item->fGetStopY()   Dy2);
    }
}

void Maker::fUp()
{
    fMove(0, -1, 0, -1);
}

void Maker::fDown()
{
    fMove(0, 1, 0, 1);
}

void Maker::fLeft()
{
    fMove(-1, 0, -1, 0);
}

void Maker::fRight()
{
    fMove(1, 0, 1, 0);
}

void Maker::fLineStyleChanged(int Style)
{
    mLineStyle = Qt::PenStyle(Style);
}

void Maker::fLineWidthChanged(int Width)
{
    mLineWidth = Width;
    TBase::fColorLabel(mLabelLineWidth, Qt::black, mLabelLineWidth->width(), mLineWidth);
}

/*void Maker::fRunMode()
{
    DialogRunMode *RunModeShow = new DialogRunMode(mRunMode, this);

    if(RunModeShow)
    {
        RunModeShow->exec();

        delete RunModeShow;
    }
}*/

void Maker::fService()
{
    if(mSceneList.length() <= 0)
    {
        QMessageBox::warning(this, tr("提示"), tr("请至少新建一个画布"));
        return;
    }

    //qDebug() << "mServiceList.length" << mServiceList.length();

    DialogService *ShowService = new DialogService(mServiceList, this);

    if(ShowService)
    {
        ShowService->exec();

        if(ShowService->mSave)
        {
            foreach(TService *Service, mServiceList)
            {
                mServiceList.removeOne(Service);
                delete Service;
            }

            //qDebug() << "ShowService->mServiceList.length" <<ShowService->mServiceList.length();

            foreach(TService *Service, ShowService->mServiceList)
            {
                mServiceList.push_back(new TService(Service));
            }

            //qDebug() << "save mServiceList.length" << mServiceList.length();
        }

        delete ShowService;
    }
}

void Maker::fDbMsg()
{
    DialogDataBase *DataBaseShow = new DialogDataBase(mDBMsg, this);

    if(DataBaseShow)
    {
        DataBaseShow->exec();
        delete DataBaseShow;
    }
}

void Maker::fFinshPolygon()
{
    if(!mActionDrawPolygon->isChecked())
    {
        TItem *Item = new TPolygon(mPolygonPoints, mLineStyle, mLineWidth, mLineColor, mBackColor);

        mPolygonPoints.clear();

        fAddItemToScene(Item);
    }
}

bool Maker::fSaveToFile(const QString FileName)
{
    TXmlWriter mXml;

    mXml.fAddHead();

    // 添加正文
    // scada
    QDomElement mXmlRootScada = mXml.fAddRoot(tr("scada"));

    // DB
    QDomElement mXmlDb = mXml.fAddChild(mXmlRootScada, tr("db"));
    if(mDBMsg)
    {
        mXmlDb.setAttribute(tr("Type"), mDBMsg->fGetType());
        mXmlDb.setAttribute(tr("Host"), mDBMsg->fGetHost());
        mXmlDb.setAttribute(tr("DBName"), mDBMsg->fGetDBName());
        mXmlDb.setAttribute(tr("User"), mDBMsg->fGetUserName());
        mXmlDb.setAttribute(tr("PassWd"), mDBMsg->fGetPassWord());
    }

    // scene
    QDomElement mXmlScenes = mXml.fAddChild(mXmlRootScada, tr("scenes"));
    mXmlScenes.setAttribute(tr("Host"), mSceneHost);

    foreach (TScene *AddScene, mSceneList)
    {
        QDomElement mXmlScene = mXml.fAddChild(mXmlScenes, tr("scene"));
        mXmlScene.setAttribute(tr("Id"), AddScene->fGetId());
        mXmlScene.setAttribute(tr("Name"), AddScene->fGetName());
        mXmlScene.setAttribute(tr("PosX"), AddScene->fGetPosX());
        mXmlScene.setAttribute(tr("PosY"), AddScene->fGetPosY());
        mXmlScene.setAttribute(tr("Width"), AddScene->fGetWidth());
        mXmlScene.setAttribute(tr("Height"), AddScene->fGetHeight());

        QDomElement XmlColor = mXml.fAddChild(mXmlScene, tr("BackColor"));
        XmlColor.setAttribute(tr("r"), AddScene->fGetBackColor().red());
        XmlColor.setAttribute(tr("g"), AddScene->fGetBackColor().green());
        XmlColor.setAttribute(tr("b"), AddScene->fGetBackColor().blue());

        QList<TItem *>ItemList;
        AddScene->fGetItemsList(ItemList);

        foreach(TItem *Item, ItemList)
        {
            mXml.fAddItem(mXmlScene, Item);
        }
    }

    // Service
    QDomElement mXmlServices = mXml.fAddChild(mXmlRootScada, tr("services"));
    for(int i = 0; i < mServiceList.count();   i)
    {
        TService *ServiceMsg = mServiceList.at(i);
        QDomElement mXmlAddService = mXml.fAddChild(mXmlServices, tr("service"));
        mXmlAddService.setAttribute(tr("Name"), ServiceMsg->fGetName());
        mXmlAddService.setAttribute(tr("Id"), ServiceMsg->fGetId());
        mXmlAddService.setAttribute(tr("Port"), ServiceMsg->fGetPort());
        mXmlAddService.setAttribute(tr("ConnectMode"), ServiceMsg->fGetConnectMode());
        mXmlAddService.setAttribute(tr("RecvMode"), ServiceMsg->fGetRecvMode());
        mXmlAddService.setAttribute(tr("AgreeMent"), ServiceMsg->fGetAgreeMent());

        switch(ServiceMsg->fGetPort())
        {
            // 网络
        case TService::Port_Net_Client_Tcp:
        case TService::Port_Net_Client_Udp:
        {
            TClientData *ClientData = ServiceMsg->fGetClientData();
            if(ClientData)
            {
                mXmlAddService.setAttribute(tr("NetIp"), ClientData->fGetIp());
                mXmlAddService.setAttribute(tr("NetPort"), ClientData->fGetPort());
            }
        }
        break;

        case TService::Port_Net_Server_Tcp:
        case TService::Port_Net_Server_Udp:
        {
            TServerData *ServerData = ServiceMsg->fGetServerData();
            if(ServerData)
            {
                mXmlAddService.setAttribute(tr("NetIp"), ServerData->fGetIp());
                mXmlAddService.setAttribute(tr("NetPort"), ServerData->fGetPort());
                mXmlAddService.setAttribute(tr("IoThreadSum"), ServerData->fGetIoThreadSum());
                mXmlAddService.setAttribute(tr("ProcessThreadSum"), ServerData->fGetProcessThreadSum());
            }
        }
        break;

            // 串口
        case TService::Port_Com:
        {
            TComData *ComData = ServiceMsg->fGetComData();

            if(ComData)
            {
                //mXmlAddService.setAttribute(tr("ComMode"), ComData->mMode);
                mXmlAddService.setAttribute(tr("ComName"), ComData->fGetName());
                mXmlAddService.setAttribute(tr("ComRate"), ComData->fGetRate());
                mXmlAddService.setAttribute(tr("ComData"), ComData->fGetDataBits());
                mXmlAddService.setAttribute(tr("ComStop"), ComData->fGetStopBits());
                mXmlAddService.setAttribute(tr("ComCheck"), ComData->fGetCheck());
            }
         }
         break;

            default:
            break;
        }

        switch(ServiceMsg->fGetAgreeMent())
        {
        case TService::AgreeMent_Iec104:
        {
            TIec104Data *Iec104Data = ServiceMsg->fGetIec104Data();

            if(Iec104Data)
            {
                mXmlAddService.setAttribute(tr("Iec104Addr"), Iec104Data->mAddr);
                mXmlAddService.setAttribute(tr("Iec104UnMaxSum"), Iec104Data->mUnMaxSum);
                mXmlAddService.setAttribute(tr("Iec104UnMaxTime"), Iec104Data->mUnMaxTime);
                mXmlAddService.setAttribute(tr("Iec104AppAddr"), Iec104Data->mAppAddr);
                mXmlAddService.setAttribute(tr("Iec104MsgAddr"), Iec104Data->mMsgAddr);
                mXmlAddService.setAttribute(tr("Iec104SendReason"), Iec104Data->mSendReason);
                mXmlAddService.setAttribute(tr("Iec104TimeLen"), Iec104Data->mTimeLen);
            }
        }
        break;

        case TService::AgreeMent_Modebus_RTU:
        {
            TModebusRtuData *RtuData = ServiceMsg->fGetModebusRtuData();

            if(RtuData)
            {
                int i = 0;
                foreach(TModebusRtuNode *Node, RtuData->mList)
                {
                    QDomElement XmlHost = mXml.fAddChild(mXmlAddService, tr("Host%1").arg(i  ));

                    XmlHost.setAttribute(tr("Host"), Node->mHost);
                    XmlHost.setAttribute(tr("Fun"), Node->mFun);
                    XmlHost.setAttribute(tr("StartAddr"), Node->mStartAddr);
                    XmlHost.setAttribute(tr("RegCount"), Node->mRegCount);
                    XmlHost.setAttribute(tr("DataLen"), Node->mDataLen);
                    XmlHost.setAttribute(tr("Type"), Node->mType);
                }
            }
        }
        break;

        default:
            break;
        }
    }

    // Linkage
    QDomElement mXmlLinkages = mXml.fAddChild(mXmlRootScada, tr("Linkages"));

    foreach(TLinkage *Linkage, mLinkageList)
    {
        QDomElement XmlAddLinkage = mXml.fAddChild(mXmlLinkages, tr("linkage"));
        XmlAddLinkage.setAttribute(tr("SrcServiceId"), Linkage->mSrcServiceId);
        XmlAddLinkage.setAttribute(tr("SrcNodeId"), Linkage->mSrcNodeId);
        XmlAddLinkage.setAttribute(tr("DstServiceId"), Linkage->mDstServiceId);
        XmlAddLinkage.setAttribute(tr("DstNodeId"), Linkage->mDstNodeId);
    }

    if(!mXml.fSave(FileName))
    {
        QMessageBox::warning(this, tr("保存"), tr("保存失败,请重试"));
    }

    fUpdateProjectName();

    return true;
}

void Maker::fSaveAs()
{
    QString FileDir = QFileDialog::getSaveFileName(this, tr("另存为"));

    if(FileDir.length() <= 0)
    {
        return;
    }

    if(!FileDir.endsWith(tr(".xml")))
    {
        FileDir  = tr(".xml");
    }

    mProjectName = FileDir;

    fSaveToFile(mProjectName);
}

bool Maker::fConnectToDB()
{
    bool Ret = false;

    if(mDataBase && mDataBase->fIsOpen())
    {
        return true;
    }
    else if(mDataBase)
    {
        delete mDataBase;
        mDataBase = NULL;
    }

    if(!mDBMsg->fIsAvailable())
    {
        fDbMsg();
    }

    mDataBase = TDataBaseService::fCreateDataBase(mDBMsg);

    if(mDataBase)
    {
        Ret = mDataBase->fInit(mDBMsg->fGetHost(),
                               mDBMsg->fGetDBName(),
                               mDBMsg->fGetUserName(),
                               mDBMsg->fGetPassWord());
    }

    return Ret;
}

void Maker::fSaveToDB()
{
    if(fConnectToDB())
    {
        TDataBaseService::fClear(mDataBase);
        TDataBaseService::fSaveService(mDataBase, mServiceList);
        TDataBaseService::fSaveScene(mDataBase, mSceneList);
        TDataBaseService::fSaveLinkage(mDataBase, mLinkageList);
    }
}

void Maker::fLoadFromDB()
{
    if(!fCloseAll())
    {
        return;
    }

    if(fConnectToDB())
    {
        TDataBaseService::fLoadService(mDataBase, mServiceList);
        TDataBaseService::fLoadScene(mDataBase, mSceneList);
        TDataBaseService::fLoadLinkage(mDataBase, mLinkageList);

        UpdateAfterOpen();
    }
}

void Maker::fUpdateProjectName()
{
    setWindowTitle(tr("组态制作程序 (")   mProjectName   tr(")"));
}

void Maker::fSave()
{
    QString SaveName = mProjectName;

    if(SaveName.length() <= 0)
    {
        fSaveAs();
    }
    else
    {
        fSaveToFile(mProjectName);
    }
}

void Maker::fSaveItems()
{
    QList <TItem *>ItemList;
    mCurrentScene->fGetItemsSelected(ItemList);

    if(ItemList.count() < 1)
    {
        QMessageBox::warning(this, tr("提示"), tr("选中要保存的图形,再进行操作"));
        return;
    }

    QString mFileDir = QFileDialog::getSaveFileName(this, tr("保存"), QApplication::applicationDirPath()   tr("//items//"), tr("*.xml"));

    if(mFileDir.length() <= 0)
    {
        return;
    }

    if(!mFileDir.endsWith(tr(".xml")))
    {
        mFileDir  = tr(".xml");
    }

    TXmlWriter mXml;

    mXml.fAddHead();
    QDomElement mXmlItems = mXml.fAddRoot(tr("items"));

    foreach(TItem *mItem, ItemList)
    {
        mXml.fAddItem(mXmlItems, mItem);
    }

    if(!mXml.fSave(mFileDir))
    {
        QMessageBox::warning(this, tr("保存图元"), tr("保存失败,请重试"));
    }
    else
    {
        fUpdateItems();
    }
}

void Maker::UpdateAfterOpen()
{
    // 解析完成,添加动作
    foreach(TScene *Scene, mSceneList)
    {
        if(Scene->fGetId() > mSceneId)
        {
            mSceneId = Scene->fGetId();
        }

        fSetScene(Scene);

        QList<TItem *>ItemList;
        Scene->fGetItemsList(ItemList);

        foreach(TItem *Item, ItemList)
        {
            int zLayer = Item->fGetZValue();

            fSetItem(Item);

            if(zLayer > mZMax)
            {
                mZMax = zLayer;
            }
            else if(zLayer < mZMin)
            {
                mZMin = zLayer;
            }
        }
    }

    mCurrentScene = mSceneList.first();

    if(mCurrentScene)
    {
        mSceneHost = mCurrentScene->fGetId();
        mView->setScene(mCurrentScene);

        fUpdateWindowAction((TAction *)mCurrentScene->fGetUserData(), true);
    }
}

void Maker::fOpen()
{
    if(!fCloseAll())
    {
        return;
    }

    //开始打开操作/////////////////////////////////////////////

    QString FileDir = QFileDialog::getOpenFileName(this, tr("打开"),
                                                   QApplication::applicationDirPath(),
                                                   tr("图形文件(*.xml);;所有文件(*.*)"));

    qDebug() << "mFileDir" << FileDir;

    if(tr("") == FileDir)
    {
        return;
    }

    TXmlReader mXml;

    if(!mXml.fOpen(FileDir))
    {
        QMessageBox::warning(this, tr("初始化"), tr("打开或解析错误"));
        return;
    }

    mProjectName = FileDir;
    fUpdateProjectName();

    //解析界面图形
    mXml.fAnalyScene(mSceneList);

    UpdateAfterOpen();

    mXml.fAnalyService(mServiceList);

    mXml.fAnalyLinkage(mLinkageList);

    mXml.fAnalyDB(mDBMsg);

    //mXml.fAnalyRunMode(mRunMode);

    //mXml.fAnalySubWidgets(mSceneList);
}

void Maker::fAddItemToBar(QString Dir, QString FileName)
{
    TXmlReader mXml;

    if(!mXml.fOpen(Dir   FileName))
    {
        return;
    }

    QDomElement mXmlNode = mXml.fGetRoot();

    if(mXmlNode.tagName() != tr("items"))
    {
        return;
    }

    mXmlNode = mXmlNode.firstChild().toElement();

    // 图元名 <= 4
    QString ItemName;

    if(FileName.length() <= 8)
    {
        // -4 表示减去.xml的长度
        ItemName = FileName.mid(0, FileName.length() - 4);
    }
    else
    {
        ItemName = FileName.mid(0, 4);
    }

    TAction *mAction = fAddFileAction(ItemName);
    while(!mXmlNode.isNull())
    {
        TItem *mItem = mXml.fAnalyItem(mXmlNode);

        if(mItem)
        {
            mAction->mItemList.push_back(mItem);
        }

        mXmlNode = mXmlNode.nextSibling().toElement();
    }

    connect(mAction, SIGNAL(triggered()), this, SLOT(fDrawItem()));
    mItemToolBar->addAction(mAction);
}

void Maker::fUpdateItems()
{
    if(!mItemToolBar)
    {
        return;
    }
    else if(mItemToolBar->actions().length() > 0)
    {
        foreach(QAction *Action, mItemToolBar->actions())
        {
            TAction *mAction = dynamic_cast<TAction *>(Action);
            mItemToolBar->removeAction(Action);
            delete mAction;
        }
    }

    QString Dir = QApplication::applicationDirPath()   tr("//items//");

    QDir scriptsDir(Dir);
    QStringList FileNames = scriptsDir.entryList(QStringList("*.xml"), QDir::Files);    

    foreach (QString FileName, FileNames)
    {
        fAddItemToBar(Dir, FileName);
    }
}

void Maker::fDrawItem()
{
    TAction *mAction = qobject_cast<TAction *>(sender());

    if(mAction && mCurrentScene)
    {
        fCopyItemListToScene(mAction->mItemList);
    }
}

void Maker::fClose()
{
    if(0 != QMessageBox::information(this, tr("提示"), tr("关闭当前页面,将丢失页面上所有图形,且不可恢复,是否继续关闭"), tr("是"), tr("否")))
    {
        return;
    }

    if(mSceneHost == mCurrentScene->fGetId())
    {
        mSceneHost = 0;
    }

    TAction *FileAction = (TAction *)mCurrentScene->fGetUserData();

    if(FileAction)
    {
        mWindowMenu->actions().removeOne(FileAction);
        delete FileAction;
    }

    //qDebug() << "fClose remove scene";
    mSceneList.removeOne(mCurrentScene);
    delete mCurrentScene;
    mCurrentScene = 0;

    //qDebug() << "fClose " << mWindowMenu->actions().length();

    if(mWindowMenu->actions().length() > mDefaltWinActSum)
    {
        TAction *Action = dynamic_cast<TAction *>(mWindowMenu->actions().at(mDefaltWinActSum));

        if(Action)
        {
            Action->setChecked(true);
            mCurrentScene = Action->mScene;
            mView->setScene(mCurrentScene);
        }
    }
    else
    {
        mSceneHost = 0;
        mSceneId = 0;
    }
}

bool Maker::fCloseAll()
{
    if(mSceneList.count() > 0)
    {
        if(0 != QMessageBox::information(this, tr("提示"), tr("执行该操作,将丢失当前所有图像和服务设置,且不可恢复,是否继续"), tr("是"), tr("否")))
        {
            return false;
        }
    }

    mProjectName = tr("");
    fUpdateProjectName();

    // 清空Undo列表
    mUndoStack->clear();

    // 清空Scene列表
    foreach(TScene *Scene, mSceneList)
    {
        mSceneList.removeOne(Scene);
        delete Scene;
    }

    mCurrentScene = NULL;

    // 清空服务列表
    foreach(TService *Service, mServiceList)
    {
        mServiceList.removeOne(Service);
        delete Service;
    }

    // 清空联动列表
    foreach(TLinkage *Linkage, mLinkageList)
    {
        mLinkageList.removeOne(Linkage);
        delete Linkage;
    }

    //qDebug() << "actions count 0" << mWindowMenu->actions().count();

    while(mWindowMenu->actions().count() > mDefaltWinActSum)
    {
        //qDebug() << "actions count 1" << mWindowMenu->actions().count();

        TAction *Action = dynamic_cast<TAction *>(mWindowMenu->actions().at(mDefaltWinActSum));

        //qDebug() << "Action" << Action;

        if(Action)
        {
            mWindowMenu->removeAction(Action);

            delete Action;
        }
    }

    //qDebug() << "actions count 2" << mWindowMenu->actions().count();

    mSceneHost = 0;
    mSceneId = 0;

    return true;
}

TItem* Maker::fCopyItem(TItem *SourceItem)
{
    if(NULL == SourceItem)
    {
        return NULL;
    }

    TItem *Item = SourceItem->fCopy();

    fSetItem(Item);

    return Item;
}

void Maker::fSetItem(TItem *Item)
{
    if(NULL == Item)
    {
        return;
    }

    connect(Item, SIGNAL(mDrop(TItem*,double,double,double,double)),
            this, SLOT(fItemDrop(TItem*,double,double,double,double)));
}

void Maker::fItemDrop(TItem *Item, double StartDx, double StartDy, double StopDx, double StopDy)
{
    if(NULL == mCurrentScene || NULL == Item)
    {
        return;
    }

    //qDebug() << "Maker::fItemDrop" << StartDx << StartDy << StopDx << StopDy;

    TUndoMoveDrag *Undo = new TUndoMoveDrag();
    mUndoStack->push(Undo);
    Undo->fSetScene(mCurrentScene);
    Undo->fAddItem(Item);
    Undo->fSetVector(StartDx, StartDy, StopDx, StopDy);
}

void Maker::fAddItemToScene(TItem *Item)
{
    if(NULL == mCurrentScene || NULL == Item)
    {
        return;
    }

    fSetItem(Item);

    QList<TItem *> ItemList;
    ItemList.push_back(Item);

    fAddItemList(mCurrentScene, ItemList);
}

void Maker::fCopyItemListToScene(QList<TItem *> &ItemList)
{
    QList<TItem *> List;

    foreach(TItem *Item, ItemList)
    {
        List.push_back(fCopyItem(Item));
    }

    fAddItemList(mCurrentScene, List);
}

void Maker::fAddItemList(TScene *Scene, QList<TItem *> &ItemList)
{
    if(NULL == Scene)
    {
        return;
    }

    Scene->clearSelection();

    foreach(TItem *Item, ItemList)
    {
        Item->setSelected(true);

        // Maker 中暂时不需要设定,Runer中需要设定
        /*TItemEx *ItemEx = dynamic_cast<TItemEx *>(Item);

        if(ItemEx)
        {
            ItemEx->fSetHostScene(Scene);
        }*/
    }

    TUndoAddDel *Undo = new TUndoAddDel(Scene, ItemList);
    Undo->fSetOperation(TUndoAddDel::OPERATION_ADD);
    // push时,执行一次,完成添加
    mUndoStack->push(Undo);
}

void Maker::fAddActionToMenu(QString Name, TScene *Scene)
{
    TAction *AddAction = fAddFileAction(Name.mid(0, 10));
    AddAction->mScene = Scene;
    Scene->fSetUserData(AddAction);
    connect(AddAction, SIGNAL(triggered(bool)), this, SLOT(fUpdateCurrentScene(bool)));
    connect(AddAction, SIGNAL(triggered(bool)), this, SLOT(fUpdateWindow(bool)));
    AddAction->setCheckable(true);
    AddAction->setChecked(true);
    fUpdateWindowAction(AddAction, true);

    mWindowMenu->addAction(AddAction);

    Scene->fSetUserData(AddAction);
}

TScene* Maker::fNewScene(int SceneId, QString Name, QColor BackColor,
                  double PosX, double PosY, double Width, double Height)
{
    TScene *AddScene = new TScene(PosX, PosY, Width, Height);
    AddScene->fSetId(SceneId);
    AddScene->fSetName(Name);
    AddScene->fSetBackColor(BackColor);
    //AddScene->setBackgroundBrush(BackColor);
    mSceneList.push_back(AddScene);

    fSetScene(AddScene);

    return AddScene;
}

void Maker::fSetScene(TScene *Scene)
{
    if(NULL == Scene)
    {
        return;
    }

    connect(Scene, SIGNAL(mDropFinsh(double, double, double, double)),
                        this, SLOT(fDraw(double, double, double, double)));

    fAddActionToMenu(Scene->fGetName(), Scene);

    connect(Scene, SIGNAL(mMoveItemList(TScene*,QList<TItem*>,double,double,double,double)),
            this, SLOT(fMoveItemList(TScene*,QList<TItem*>,double,double,double,double)));
}

void Maker::fNew()
{
    DialogNewScene *NewSceneShow = new DialogNewScene(this);

    if(NewSceneShow)
    {
        NewSceneShow->exec();

        if(NewSceneShow->mSave)
        {
            TScene *AddScene = fNewScene(  mSceneId, NewSceneShow->fGetName(), NewSceneShow->fGetBackColor());

            if(AddScene)
            {
                mView->setScene(AddScene);
                mCurrentScene = AddScene;
            }
        }

        delete NewSceneShow;
    }
}

void Maker::fEdit()
{
    if(mCurrentScene)
    {
        DialogNewScene *EditSceneShow = new DialogNewScene(this);

        if(EditSceneShow)
        {
            EditSceneShow->fSetName(mCurrentScene->fGetName());
            EditSceneShow->fSetBackColor(mCurrentScene->fGetBackColor());
            EditSceneShow->fSetTitle(tr("编辑"));

            EditSceneShow->exec();

            if(EditSceneShow->mSave)
            {
                QString NewName =  EditSceneShow->fGetName();
                if(mCurrentScene->fGetName() != NewName)
                {
                    mCurrentScene->fSetName(NewName);
                    TAction *FileAction = (TAction *)mCurrentScene->fGetUserData();

                    if(FileAction)
                    {
                        FileAction->setText(NewName);
                    }
                }

                mCurrentScene->fSetBackColor(EditSceneShow->fGetBackColor());
                //mCurrentScene->setBackgroundBrush(mCurrentScene->fGetBackColor());
            }

            delete EditSceneShow;
        }
    }
}

void Maker::fUpdateWindowAction(TAction *Action, bool Checked)
{
    if(Action)
    {
        foreach (QAction *Find, mWindowMenu->actions())
        {
            TAction *mFileAction = dynamic_cast<TAction *>(Find);

            if(mFileAction)
            {
                mFileAction->setChecked(false);
            }
        }

        Action->setChecked(Checked);
    }
}

void Maker::fUpdateCurrentScene(bool Checked)
{
    if(!Checked)
    {
        return;
    }

    TAction *Action = qobject_cast<TAction *>(sender());

    if(Action && Action->mScene)
    {
        mCurrentScene = Action->mScene;
        mView->setScene(mCurrentScene);
    }
}

void Maker::fUpdateWindow(bool Checked)
{
    fUpdateWindowAction(qobject_cast<TAction *>(sender()), Checked);
}

void Maker::fZoomOut()
{
    if(mView)
    {
        mView->fZoom(1.125);
    }
}

void Maker::fZoomIn()
{
    if(mView)
    {
        mView->fZoom(0.8);
    }
}

void Maker::fZoomNormal()
{
    if(mView)
    {
        mView->fSetZoom(1);
    }
}

void Maker::fAddLink()
{
    DialogAddLink *mLink = new DialogAddLink(fGraphicsSelected(), mSceneList, this);

    if(mLink->mInit)
    {
        mLink->exec();
    }
    else
    {
        QMessageBox::warning(this, tr("提示"), tr("选择一个图形再进行操作"));
    }

    delete mLink;
}

/*void Maker::fGotoLink(int LinkId)
{
    foreach(TScene *Scene, mSceneList)
    {
        if(LinkId == Scene->fGetId())
        {
            mCurrentScene = Scene;
            mView->setScene(mCurrentScene);
        }
    }
}*/

void Maker::fSetHost()
{
    if(mCurrentScene)
    {
        mSceneHost = mCurrentScene->fGetId();
    }
}

【核心代码】

标签: qt组态源码

实例下载地址

QT编写的组态源码

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

第 1 楼 412149380 发表于: 2019-04-15 09:14 22
不能下载

支持(0) 盖楼(回复)

第 2 楼 osean 发表于: 2020-06-02 16:13 18
可以的

支持(0) 盖楼(回复)

发表评论

(您的评论需要经过审核才能显示)

查看所有2条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警