实例介绍
【实例截图】
#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组态源码
相关软件
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


支持(0) 盖楼(回复)
支持(0) 盖楼(回复)