|  |  | 
 | 
						
						
						
							|  |  | from utils import Globals
 | 
						
						
						
							|  |  | from PyQt5.QtWidgets import  QDialog, QTabWidget, QPushButton\
 | 
						
						
						
							|  |  |                             ,QMessageBox, QHBoxLayout, QWidget, QTabBar, QProxyStyle, QStyle, QTabBar, QWidget
 | 
						
						
						
							|  |  | from PyQt5.QtGui import  QIcon, QPainter, QPen, QColor, QPainterPath, QTextOption, QFont
 | 
						
						
						
							|  |  | from PyQt5.QtCore import QSize, Qt, QRectF, QPointF, QSizeF
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | from UI.ProfibusWidgets.DeviceDialogWidget import DeviceDialog
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | from model.ProjectModel.DeviceManage import DevicesManange
 | 
						
						
						
							|  |  | from utils.DBModels.BaseModel import *
 | 
						
						
						
							|  |  | from UI.ProfibusWidgets.AreaTabWidget import AreaTabWidget
 | 
						
						
						
							|  |  | from utils.DBModels.DeviceModels import DeviceDB
 | 
						
						
						
							|  |  | from model.ProjectModel.DeviceManage import DevicesManange
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | class NewChromeTabStyle(QProxyStyle):
 | 
						
						
						
							|  |  |     def drawControl(self, element, option, painter, widget):
 | 
						
						
						
							|  |  |         # painter.save()
 | 
						
						
						
							|  |  |         # painter.setPen(Qt.red);
 | 
						
						
						
							|  |  |         # painter.restore();
 | 
						
						
						
							|  |  |         margin = 4
 | 
						
						
						
							|  |  |         if element == QStyle.CE_TabBarTabLabel:
 | 
						
						
						
							|  |  |             tab = option
 | 
						
						
						
							|  |  |             # print(type(tab))
 | 
						
						
						
							|  |  |             textRect = QRectF(self.subElementRect(QStyle.SE_TabBarTabText, tab, widget))
 | 
						
						
						
							|  |  |             painter.save()
 | 
						
						
						
							|  |  |             if (tab.state & QStyle.State_Selected):
 | 
						
						
						
							|  |  |                 painter.setPen(QPen(QColor("black")))
 | 
						
						
						
							|  |  |             elif (tab.state & QStyle.State_MouseOver):
 | 
						
						
						
							|  |  |                 painter.setPen(QPen(QColor("black")))
 | 
						
						
						
							|  |  |             else:
 | 
						
						
						
							|  |  |                 painter.setPen(QPen(QColor("black")))
 | 
						
						
						
							|  |  |             option = QTextOption()
 | 
						
						
						
							|  |  |             # 设置对齐方式,Qt.AlignLeft 和 Qt.AlignVCenter 分别对应左对齐和垂直居中
 | 
						
						
						
							|  |  |             font = QFont();
 | 
						
						
						
							|  |  |             font.setPointSize(20);
 | 
						
						
						
							|  |  |             painter.setFont(font);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             option.setAlignment(Qt.AlignCenter | Qt.AlignVCenter)
 | 
						
						
						
							|  |  |             # 设置换行模式为不换行
 | 
						
						
						
							|  |  |             option.setWrapMode(QTextOption.NoWrap)
 | 
						
						
						
							|  |  |             painter.drawText(textRect, tab.text, option)
 | 
						
						
						
							|  |  |             painter.restore()
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         elif element == QStyle.CE_TabBarTabShape:
 | 
						
						
						
							|  |  |             tab = option
 | 
						
						
						
							|  |  |             painter.setRenderHint(QPainter.Antialiasing);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             shapeRect = QRectF(tab.rect);
 | 
						
						
						
							|  |  |             shapeRect.setY(shapeRect.y() + margin)
 | 
						
						
						
							|  |  |             arcLen = shapeRect.height() / 2;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (tab.state & QStyle.State_Selected):
 | 
						
						
						
							|  |  |                 painter.save();
 | 
						
						
						
							|  |  |                 pen = QPen(Qt.white);
 | 
						
						
						
							|  |  |                 pen.setWidthF(0.5);
 | 
						
						
						
							|  |  |                 painter.setPen(pen);
 | 
						
						
						
							|  |  |                 painter.restore();
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 painter.save();
 | 
						
						
						
							|  |  |                 shapeRect.setX(shapeRect.x() - arcLen);
 | 
						
						
						
							|  |  |                 shapeRect.setWidth(shapeRect.width() + arcLen *3/ 5);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 path = QPainterPath();
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 arcRect1 = QRectF(shapeRect.x(),
 | 
						
						
						
							|  |  |                                 shapeRect.y() + shapeRect.height() / 3,
 | 
						
						
						
							|  |  |                                 arcLen,
 | 
						
						
						
							|  |  |                                 shapeRect.height() * 2 / 3);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 path.moveTo(QPointF(arcRect1.x(),
 | 
						
						
						
							|  |  |                                      arcRect1.y() + arcRect1.height()));
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 path.lineTo(QPointF(arcRect1.x() + arcRect1.width() / 2,
 | 
						
						
						
							|  |  |                                      arcRect1.y() + arcRect1.height()));
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 # // Starting from 270°, returning to the arc of 90°
 | 
						
						
						
							|  |  |                 path.arcTo(arcRect1, 270.0, 90.0);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 path.lineTo(QPointF(arcRect1.x() + arcRect1.width(),
 | 
						
						
						
							|  |  |                                      arcRect1.y()));
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 arcRect2 = QRectF(shapeRect.x() + arcRect1.width(),
 | 
						
						
						
							|  |  |                                 shapeRect.y(),
 | 
						
						
						
							|  |  |                                 arcLen,
 | 
						
						
						
							|  |  |                                 shapeRect.height() * 2 / 3);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 # // Starting from 180°, returning to the arc of -90°
 | 
						
						
						
							|  |  |                 path.arcTo(arcRect2, 180.0, -90.0);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 path.lineTo(QPointF(arcRect2.x() + shapeRect.width() -  2 * (arcRect2.x()  + arcRect2.width()) + arcRect2.width() / 2,
 | 
						
						
						
							|  |  |                                      arcRect2.y()));
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 arcRect3 = QRectF(shapeRect.x() + shapeRect.width() - 2 * arcRect1.width(),
 | 
						
						
						
							|  |  |                                 shapeRect.y(),
 | 
						
						
						
							|  |  |                                 arcRect1.width(),
 | 
						
						
						
							|  |  |                                 shapeRect.height() * 2 / 3);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 path.arcTo(arcRect3, 90.0, -90.0);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 path.lineTo(QPointF(arcRect3.x() + arcRect3.width(),
 | 
						
						
						
							|  |  |                                      arcRect3.y() + arcRect3.height()));
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 arcRect4 = QRectF(arcRect3.x() + arcRect3.width(),
 | 
						
						
						
							|  |  |                                 arcRect3.y() + arcRect3.height() / 2,
 | 
						
						
						
							|  |  |                                 arcRect1.width(),
 | 
						
						
						
							|  |  |                                 shapeRect.height() * 2 / 3);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 path.arcTo(arcRect4, 180.0, 90.0);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 path.lineTo(QPointF(arcRect1.x(),
 | 
						
						
						
							|  |  |                                     arcRect1.y() + arcRect1.height()));
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 painter.setPen(Qt.NoPen);
 | 
						
						
						
							|  |  |                 painter.setBrush(Qt.white);
 | 
						
						
						
							|  |  |                 polygon = path.toFillPolygon();
 | 
						
						
						
							|  |  |                 painter.drawPolygon(polygon);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 painter.setBrush(QColor('#D3E3FD'));
 | 
						
						
						
							|  |  |                 magPoint = shapeRect.topLeft()
 | 
						
						
						
							|  |  |                 magPoint.setY(magPoint.y() - margin)
 | 
						
						
						
							|  |  |                 painter.drawRect(QRectF(magPoint, QSizeF(shapeRect.width(), margin)))
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 painter.restore();
 | 
						
						
						
							|  |  |             elif (tab.state & QStyle.State_MouseOver):
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 painter.save();
 | 
						
						
						
							|  |  |                 # 设置画笔颜色和宽度
 | 
						
						
						
							|  |  |                 painter.setBrush(QColor('#D3E3FD'));
 | 
						
						
						
							|  |  |                 painter.setPen(Qt.NoPen)
 | 
						
						
						
							|  |  |                 magPoint = shapeRect.topLeft()
 | 
						
						
						
							|  |  |                 magPoint.setY(magPoint.y() - margin)
 | 
						
						
						
							|  |  |                 painter.drawRect(QRectF(magPoint, QSizeF(shapeRect.width(), shapeRect.height() + 4)))
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 shapeRect.setX(shapeRect.x());
 | 
						
						
						
							|  |  |                 shapeRect.setWidth(shapeRect.width() - 15);
 | 
						
						
						
							|  |  |                 shapeRect.setHeight(shapeRect.height() - 4)
 | 
						
						
						
							|  |  |                 painter.setPen(QColor('#A8C7FA'))
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 # 设置填充颜色(如果需要)
 | 
						
						
						
							|  |  |                 painter.setBrush(QColor('#A8C7FA'))
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 # 圆角矩形的参数:左上角坐标x, y,宽度w,高度h,以及圆角半径r
 | 
						
						
						
							|  |  |                 radius = 5
 | 
						
						
						
							|  |  |                 painter.drawRoundedRect(shapeRect, radius, radius)
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 painter.restore();
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             else:
 | 
						
						
						
							|  |  |                 painter.save();
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 shapeRect.setX(shapeRect.x() - arcLen);
 | 
						
						
						
							|  |  |                 shapeRect.setWidth(shapeRect.width() + arcLen / 2);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 pen = QPen(QColor('#D3E3FD'));
 | 
						
						
						
							|  |  |                 pen.setWidthF(0.1);
 | 
						
						
						
							|  |  |                 painter.setPen(pen)
 | 
						
						
						
							|  |  |                 painter.drawLine(shapeRect.bottomLeft(),shapeRect.bottomRight());
 | 
						
						
						
							|  |  |                 # painter.drawLine(QPointF(shapeRect.x() + arcLen*2/3 -1, shapeRect.height() / 3),
 | 
						
						
						
							|  |  |                 #               QPointF(shapeRect.x() + arcLen*2/3 -1, shapeRect.height() * 2 / 3));
 | 
						
						
						
							|  |  |                 painter.setBrush(QColor('#D3E3FD'));
 | 
						
						
						
							|  |  |                 painter.drawRect(shapeRect)
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 magPoint = shapeRect.topLeft()
 | 
						
						
						
							|  |  |                 magPoint.setY(magPoint.y() - margin)
 | 
						
						
						
							|  |  |                 painter.drawRect(QRectF(magPoint, QSizeF(shapeRect.width(), margin)))
 | 
						
						
						
							|  |  |                 painter.restore();
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 # painter.save();
 | 
						
						
						
							|  |  |                 # painter.restore();
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |  
 | 
						
						
						
							|  |  |         else:
 | 
						
						
						
							|  |  |             super(NewChromeTabStyle, self).drawControl(element, option, painter, widget);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | class DeviceTabBar(QTabBar):
 | 
						
						
						
							|  |  |     def __init__(self):
 | 
						
						
						
							|  |  |         super().__init__()
 | 
						
						
						
							|  |  |         self.setStyle(NewChromeTabStyle())
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     def tabSizeHint(self, index):
 | 
						
						
						
							|  |  |         newSize = QTabBar().tabSizeHint(index)
 | 
						
						
						
							|  |  |         width = len(self.tabText(index)) * 20 + 100
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         newSize.setWidth(width)
 | 
						
						
						
							|  |  |         newSize.setHeight(35)
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         # tabRect = QTabBar().tabRect(index)
 | 
						
						
						
							|  |  |         # padding = 50
 | 
						
						
						
							|  |  |         # tabRect.adjust(padding, padding, padding, padding)
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         return newSize
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | class DeviceTab(QTabWidget):
 | 
						
						
						
							|  |  |     def __init__(self, dockWidget, devicesManange):
 | 
						
						
						
							|  |  |         super().__init__()
 | 
						
						
						
							|  |  |         self.dockWidget = dockWidget
 | 
						
						
						
							|  |  |         self.devicesManange = devicesManange
 | 
						
						
						
							|  |  |         self.setObjectName('deviceWidget')
 | 
						
						
						
							|  |  |         Globals.setValue(self.dockWidget.windowTitle(), self)
 | 
						
						
						
							|  |  |         self.tabCloseRequested.connect(self.closeTab)
 | 
						
						
						
							|  |  |       
 | 
						
						
						
							|  |  |         
 | 
						
						
						
							|  |  |         
 | 
						
						
						
							|  |  |     
 | 
						
						
						
							|  |  |     def initUI(self):
 | 
						
						
						
							|  |  |         self.setTabBar(DeviceTabBar())
 | 
						
						
						
							|  |  |         #获取DP、PA协议和主从模式
 | 
						
						
						
							|  |  |         self.dataTypeAndModel = self.dockWidget.windowTitle()
 | 
						
						
						
							|  |  |         self.proType = self.dataTypeAndModel[0:2]
 | 
						
						
						
							|  |  |         self.masterSlaveModel = self.dataTypeAndModel[2:4]
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         self.setObjectName('deviceTabWidget')
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         self.addDeviceButton = QPushButton('添加设备')
 | 
						
						
						
							|  |  |         self.addDeviceButton.setObjectName('deviceAddButton')
 | 
						
						
						
							|  |  |         self.addDeviceButton.setIcon(QIcon('Static/add.png'))
 | 
						
						
						
							|  |  |         self.addDeviceButton.setFlat(True)
 | 
						
						
						
							|  |  |         self.addDeviceButton.clicked.connect(self.addDeviceWidget)
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         self.setCornerWidget(self.addDeviceButton)
 | 
						
						
						
							|  |  |         self.setTabsClosable(True)
 | 
						
						
						
							|  |  |         
 | 
						
						
						
							|  |  |         self.state = True
 | 
						
						
						
							|  |  |         # Globals.setValue('DeviceTable', self)
 | 
						
						
						
							|  |  |         self.initWidget()
 | 
						
						
						
							|  |  |     
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     def closeTab(self, index):
 | 
						
						
						
							|  |  |         reply = QMessageBox.question(self, 'Confirmation', '确定删掉此设备吗?',
 | 
						
						
						
							|  |  |                                     QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
 | 
						
						
						
							|  |  |         if reply == QMessageBox.Yes:
 | 
						
						
						
							|  |  |             if index != -1:
 | 
						
						
						
							|  |  |                 deviceName = self.tabText(index) + self.dockWidget.windowTitle()
 | 
						
						
						
							|  |  |                 print(deviceName,index,222)
 | 
						
						
						
							|  |  |                 self.removeTab(index)
 | 
						
						
						
							|  |  |             self.devicesManange.delDevice(deviceName = deviceName )
 | 
						
						
						
							|  |  |             DeviceDB.deleteDevice(deviceName = deviceName)  
 | 
						
						
						
							|  |  |         else:
 | 
						
						
						
							|  |  |             return
 | 
						
						
						
							|  |  |         if self.count() == 0:
 | 
						
						
						
							|  |  |             self.creatInitWidget()
 | 
						
						
						
							|  |  |        
 | 
						
						
						
							|  |  |         
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     def addDeviceWidget(self,init = False,deviceName = None):
 | 
						
						
						
							|  |  |         if deviceName is None:
 | 
						
						
						
							|  |  |             dialog = DeviceDialog(self.dataTypeAndModel)
 | 
						
						
						
							|  |  |             if dialog.exec_() == QDialog.Accepted:
 | 
						
						
						
							|  |  |                 self.deviceName, pvUpperLimit, pvLowerLimit, pvUnit = dialog.getParameters()            
 | 
						
						
						
							|  |  |                 DeviceDB().addDevice(deviceName = self.deviceName, proType = self.proType , masterSlaveModel = self.masterSlaveModel, pvUpperLimit=pvUpperLimit, pvLowerLimit=pvLowerLimit, pvUnit=pvUnit)
 | 
						
						
						
							|  |  |                 if init:
 | 
						
						
						
							|  |  |                     self.removeTab(0)
 | 
						
						
						
							|  |  |                 tabIndex = self.count()
 | 
						
						
						
							|  |  |                 self.tabBar().setHidden(False)
 | 
						
						
						
							|  |  |                 self.addTab(AreaTabWidget(self),str(self.deviceName[:-4]))
 | 
						
						
						
							|  |  |                 self.setCurrentIndex(tabIndex)
 | 
						
						
						
							|  |  |                 self.devicesManange.addDevice(proType=self.proType, masterSlaveModel = self.masterSlaveModel, deviceName = self.deviceName)
 | 
						
						
						
							|  |  |             else:
 | 
						
						
						
							|  |  |                 return
 | 
						
						
						
							|  |  |         else:
 | 
						
						
						
							|  |  |             self.deviceName = deviceName
 | 
						
						
						
							|  |  |             self.titleName = self.deviceName[:-4]
 | 
						
						
						
							|  |  |             self.tabBar().setHidden(False)
 | 
						
						
						
							|  |  |             self.addTab(AreaTabWidget(self),str(self.titleName))
 | 
						
						
						
							|  |  |             
 | 
						
						
						
							|  |  |             
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     def initWidget(self):
 | 
						
						
						
							|  |  |         alldevices = DevicesManange.getAllDevice()
 | 
						
						
						
							|  |  |         titleName = self.dockWidget.windowTitle()
 | 
						
						
						
							|  |  |         if alldevices:
 | 
						
						
						
							|  |  |             for devices in alldevices:
 | 
						
						
						
							|  |  |                 deviceName = devices[0]
 | 
						
						
						
							|  |  |                 if titleName in deviceName:
 | 
						
						
						
							|  |  |                     # print(devices,333)
 | 
						
						
						
							|  |  |                     self.devicesManange.addDevice(proType = devices[1], masterSlaveModel = devices[2], deviceName = devices[0]) 
 | 
						
						
						
							|  |  |                     self.addDeviceWidget(deviceName=deviceName) 
 | 
						
						
						
							|  |  |                     self.state = False
 | 
						
						
						
							|  |  |         if self.state:
 | 
						
						
						
							|  |  |             self.creatInitWidget()
 | 
						
						
						
							|  |  |             
 | 
						
						
						
							|  |  |     def creatInitWidget(self):
 | 
						
						
						
							|  |  |         widget = QWidget()
 | 
						
						
						
							|  |  |         widget.setObjectName('initWidget')
 | 
						
						
						
							|  |  |         layout = QHBoxLayout()
 | 
						
						
						
							|  |  |         addButton = QPushButton('添加设备')
 | 
						
						
						
							|  |  |         addButton.setObjectName('initAddDeviceButton')
 | 
						
						
						
							|  |  |         icon = QIcon('Static/add.png')
 | 
						
						
						
							|  |  |         iconSize = QSize(50,50)
 | 
						
						
						
							|  |  |         addButton.setIcon(icon)
 | 
						
						
						
							|  |  |         addButton.setIconSize(iconSize)
 | 
						
						
						
							|  |  |         addButton.clicked.connect(lambda: self.addDeviceWidget(True))
 | 
						
						
						
							|  |  |         layout.addWidget(QWidget())
 | 
						
						
						
							|  |  |         layout.addWidget(addButton)
 | 
						
						
						
							|  |  |         layout.addWidget(QWidget())
 | 
						
						
						
							|  |  |         widget.setLayout(layout)
 | 
						
						
						
							|  |  |         self.addTab(widget,'')
 | 
						
						
						
							|  |  |         self.tabBar().setHidden(True)
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     def switchProject(self):
 | 
						
						
						
							|  |  |    
 | 
						
						
						
							|  |  |         self.clear()
 | 
						
						
						
							|  |  |         self.initUI()
 | 
						
						
						
							|  |  |                     
 | 
						
						
						
							|  |  |                        
 | 
						
						
						
							|  |  |                     
 | 
						
						
						
							|  |  |     
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | 
 |