From 8e09177e64089de772dbccaa4238d816f73d1a57 Mon Sep 17 00:00:00 2001 From: "ZHANGXUXU\\95193" <951937200@qq.com> Date: Thu, 7 Mar 2024 15:02:16 +0800 Subject: [PATCH] =?UTF-8?q?0307=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Static/Main.qss | 44 +++++-- UI/AreaTabWidget.py | 160 +++++++++++++---------- UI/AreaValueManage.py | 86 ------------ UI/ButtonLayoutWidget.py | 135 ++++++++++--------- UI/DeviceWidget.py | 68 +++------- UI/MainWindow.py | 34 ++++- model/ProjectModel/DeviceManage.py | 5 +- model/ProjectModel/DeviceWidgetManage.py | 37 ------ 8 files changed, 246 insertions(+), 323 deletions(-) delete mode 100644 UI/AreaValueManage.py delete mode 100644 model/ProjectModel/DeviceWidgetManage.py diff --git a/Static/Main.qss b/Static/Main.qss index 6d122a4..888c71a 100644 --- a/Static/Main.qss +++ b/Static/Main.qss @@ -2,6 +2,7 @@ QMdiSubWindow { font-size: 18px; + font-weight: bold; } @@ -15,11 +16,31 @@ QPushButton#deviceAddButton, QPushButton#addareabutton { color: #328ffc; - font-size: 17px; - + font-size: 21px; } +QPushButton#initAddDeviceButton, QPushButton#initAreaAddButton{ + + font-size: 45px; + + color: #328ffc; + + background-color: rgba(255, 255, 255, 0); + +} + +QPushButton#initAddDeviceButton:hover, QPushButton#initAreaAddButton:hover{ + + color: #1a86d8; + + font: bold; + + border-radius: 3px; + + margin-bottom: -4px +} + QLabel#dataTypeLabel, QLabel#dataOrderLabel, QLabel#byteLineLabel, QLabel#areaMessLabel, QLabel#areaValueLabel{ @@ -27,6 +48,12 @@ QLabel#dataTypeLabel, QLabel#dataOrderLabel, QLabel#byteLineLabel, QLabel#areaMe } +QLabel#areaValueLabel{ + + color: #0160aa; + +} + QLineEdit#byteLineEdit, QLineEdit#areaLineEdit { @@ -43,7 +70,7 @@ QComboBox#dataTypeCombox, QComboBox#orderCombox{ } - QTabBar::close-button { +QTabBar::close-button { image: url(Static/close.png); @@ -54,10 +81,10 @@ QComboBox#dataTypeCombox, QComboBox#orderCombox{ margin-left: 4px; } - QTabBar::close-button:hover { +QTabBar::close-button:hover { background-color: #cccccc; - } +} QTabBar::tab:hover { @@ -75,10 +102,9 @@ QTabBar::tab{ min-width: 200px; - min-height: 30px; - - font: 17px; + min-height: 40px; + font: 20px; font-family: ".SFNSDisplay-Regular"; @@ -87,6 +113,8 @@ QTabBar::tab{ QTabBar#areaTabBar::tab{ min-width: 100px; + + font: 20px; } diff --git a/UI/AreaTabWidget.py b/UI/AreaTabWidget.py index 6b9587f..f725b74 100644 --- a/UI/AreaTabWidget.py +++ b/UI/AreaTabWidget.py @@ -8,10 +8,10 @@ from PyQt5.QtWidgets import QApplication, QMainWindow, QTabWidget, QWidget, QVBo QHBoxLayout, QComboBox, QLineEdit, QSpacerItem, QSizePolicy, QGridLayout, QMessageBox, QSplitter, QFrame from PyQt5.QtGui import QIcon -from model.ProjectModel.DeviceWidgetManage import DeviceWidgetManage -from UI.AreaValueManage import AreaValueManage +from PyQt5.QtCore import QSize + from model.ProjectModel.DeviceManage import Device, DevicesManange -from UI.ButtonLayoutWidget import ButtonLayout +from UI.ButtonLayoutWidget import ButtonWidgets @@ -20,8 +20,8 @@ class AreaTabWidget(QTabWidget): def __init__(self, deviceWidget): super().__init__() self.deviceWidget = deviceWidget - - self.areaValueManage = AreaValueManage() + self.devicesManange = self.deviceWidget.devicesManange + self.initUI() @@ -29,7 +29,7 @@ class AreaTabWidget(QTabWidget): self.deviceName = self.deviceWidget.deviceName # 创建一个 QTabWidget - + self.setObjectName('areaTabWidget') self.setTabPosition(QTabWidget.South) self.tabBar().setObjectName('areaTabBar') self.addAreaButton = QPushButton("添加区域") @@ -68,6 +68,11 @@ class AreaTabWidget(QTabWidget): widget = QWidget() layout = QHBoxLayout() addButton = QPushButton('添加区域') + addButton.setObjectName('initAreaAddButton') + icon = QIcon('Static/add.png') + iconSize = QSize(50,50) + addButton.setIcon(icon) + addButton.setIconSize(iconSize) addButton.clicked.connect(lambda: self.addAreaTab(True)) layout.addWidget(QSplitter()) layout.addWidget(addButton) @@ -121,7 +126,7 @@ class AreaWidget(QWidget): super().__init__() self.areaTabWidget = areaTabWidget self.settingValue = settingValue - self.areaValueManage = self.areaTabWidget.areaValueManage + self.devicesManange = self.areaTabWidget.devicesManange self.initUI() def initUI(self): @@ -137,6 +142,7 @@ class AreaWidget(QWidget): self.dataTypeCombox = QComboBox() self.dataTypeCombox.addItems(['AI', 'AO', 'DI', 'DO']) self.dataTypeCombox.setObjectName('dataTypeCombox') + self.dataTypeCombox.currentIndexChanged.connect(self.setByteLineEditValue) # self.dataTypeCombox.setFixedSize(90, 27) self.dataOrderLabel = QLabel('数据格式:') @@ -159,27 +165,29 @@ class AreaWidget(QWidget): # self.okBtn.setFixedSize(90, 27) self.okBtn.setObjectName('okBtn') self.okBtn.clicked.connect(self.addAreaWidget) - self.obBtnValue = True + self.okBtnValue = True self.delAreaBtn = QPushButton('删除') self.delAreaBtn.setObjectName('delAreaBtn') # self.delAreaBtn.setFixedSize(90, 27) self.delAreaBtn.clicked.connect(self.removeAreaTab) + hLayout = QHBoxLayout() + hLayout.addWidget(self.okBtn) + hLayout.addWidget(self.delAreaBtn) + self.leftLayout.addWidget(self.dataTypeLabel, 0, 0, 1, 1) self.leftLayout.addWidget(self.dataTypeCombox, 0, 1, 1, 1) self.leftLayout.addWidget(self.dataOrderLabel,1, 0, 1, 1 ) self.leftLayout.addWidget(self.orderCombox,1, 1, 1, 1 ) self.leftLayout.addWidget(self.byteLineLabel,2, 0, 1, 1 ) self.leftLayout.addWidget(self.byteLineEdit,2, 1, 1, 1 ) - self.leftLayout.addWidget(self.okBtn, 3, 0, 1, 1) - self.leftLayout.addWidget(self.delAreaBtn, 3, 1, 1, 1) + self.leftLayout.addLayout(hLayout, 3, 0, 1, 2) + # self.leftLayout.addWidget(self.delAreaBtn, 3, 1, 1, 1) - - self.rightWidget = QWidget() - self.rightLayout.addWidget(self.rightWidget) + self.rightLayout.addWidget(QWidget()) line = QFrame() line.setFrameShape(QFrame.VLine) line.setLineWidth(2) @@ -196,25 +204,37 @@ class AreaWidget(QWidget): self.addAreaWidget() self.settingValue = None + def setByteLineEditValue(self): + byteLineEditValue = self.dataTypeCombox.currentText() + if byteLineEditValue in ['DI','DO']: + self.byteLineEdit.setText('2') + self.byteLineEdit.setEnabled(False) + else: + self.byteLineEdit.setEnabled(True) def removeAreaTab(self): - # 获取 QTabWidget 并从中删除标签页 - deviceName = self.areaTabWidget.deviceName - + # 只点击了新建去域按钮,未点击确定按钮时,直接点击删除按钮的删除情况 index = self.areaTabWidget.currentIndex() tabCount = self.areaTabWidget.count() - + if self.okBtn.text() == '确定': + if index != -1: + self.areaTabWidget.removeTab(index) + if tabCount == 1: + self.areaTabWidget.initWidget() - - if index != -1: - self.areaTabWidget.removeTab(index) - - Device.delAreas(deviceName, index) - self.areaValueManage.delArea(deviceName = deviceName, curIndex = index) - # self.mainwindow.devicesManange.getDevice(deviceName).delArea(index, type) - # self.mainwindow.devicesManange.recalculateAddress() - if tabCount == 1: - self.areaTabWidget.initWidget() + #正常点击删除按钮的情况 + else: + deviceName = self.areaTabWidget.deviceName + datatype = self.dataTypeCombox.currentText() + + if index != -1: + self.areaTabWidget.removeTab(index) + + Device.delAreas(deviceName, index) + self.devicesManange.getDevice(deviceName).delArea(index, datatype) + self.devicesManange.recalculateAddress() + if tabCount == 1: + self.areaTabWidget.initWidget() @@ -251,33 +271,34 @@ class AreaWidget(QWidget): return else: #设置点击确定后无法编辑,点击编辑后才能编辑 - if self.obBtnValue: + if self.okBtnValue: self.okBtn.setText('编辑') self.dataTypeCombox.setEnabled(False ) self.orderCombox.setEnabled(False ) self.byteLineEdit.setEnabled(False ) - self.obBtnValue = False - - else: + self.okBtnValue = False + if dataType in ['DI','DO']: + self.okBtn.setEnabled(False) + + elif dataType in ['AI','AO']: self.okBtn.setText('确定') - self.dataTypeCombox.setEnabled(True) + # self.dataTypeCombox.setEnabled(True) self.orderCombox.setEnabled(True) self.byteLineEdit.setEnabled(True) - self.obBtnValue = True - return + self.okBtnValue = True #修改配置后刷新布局内容 - if self.settingValue is None: - while areaLayout.count(): - items = areaLayout.takeAt(0) - widget = items.widget() - if widget: - widget.setParent(None) - widget.deleteLater() + # if self.settingValue is None: + while areaLayout.count(): + items = areaLayout.takeAt(0) + widget = items.widget() + if widget: + widget.setParent(None) + widget.deleteLater() #添加按钮布局 - buttonLayout = ButtonLayout(self, order = order, byteLineEdit = byteLineEdit, dataType = dataType, deviceName = deviceName) - areaLayout.addWidget(buttonLayout) + buttonWidgets = ButtonWidgets(self, order = order, byteLineEdit = byteLineEdit, dataType = dataType, deviceName = deviceName) + areaLayout.addWidget(buttonWidgets,0,0) @@ -285,31 +306,22 @@ class AreaWidget(QWidget): areaId = DevicesManange.getAreaID(deviceName) - if self.settingValue is not None: + + self.devicesManange.getDevice(deviceName).addArea(type = dataType, bytes = int(byteLineEdit), order = order, nums = 1) return elif areaId is not None and curIndex in areaId: DevicesManange.updataAreas(dataType, order, byteLineEdit, deviceName, curIndex) + self.devicesManange.getDevice(deviceName).editArea(index = curIndex, type = dataType, order = order, bytes = int(byteLineEdit)) + # self.readVarTimer.start(500) else: DevicesManange.addAreas(dataType, order, byteLineEdit, deviceName) - + self.devicesManange.getDevice(deviceName).addArea(type = dataType, bytes = int(byteLineEdit), order = order, nums = 1) + self.devicesManange.recalculateAddress() + # self.readVarTimer.start(500) - # if areaId is not None and index in areaId: - # # if loacl: - # # del self.widgetList[index - 1] - # if init: - # return - # DevicesManange.updataAreas(dataType, order, byteLineEdit, deviceName, index) - # self.mainwindow.devicesManange.getDevice(deviceName).editArea(index = index - 1, type = dataType, order = order, bytes = int(byteLineEdit)) - # self.mainwindow.devicesManange.recalculateAddress() - # self.mainwindow.readVarTimer.start(500) - # else: - # DevicesManange.addAreas(dataType, order, byteLineEdit, deviceName) - # self.mainwindow.devicesManange.getDevice(deviceName).addArea(type = dataType, bytes = int(byteLineEdit), order = order, nums = 1) - # self.mainwindow.devicesManange.recalculateAddress() - # self.mainwindow.readVarTimer.start(500) @@ -319,30 +331,36 @@ class AreaWidget(QWidget): self.dataTypeDict = {'不转换': 'ABCD', '字节转换': 'DCBA', '字转换': 'CDAB', '字内转换': 'BADC'} return self.dataTypeDict[order] - def wirteValue(self, deviceName, dataTypeAndModel ): - - - deviceValuelist = self.areaValueManage.getAreaValueList(deviceName = deviceName, dataTypeAndModel = dataTypeAndModel) - print(deviceValuelist) - # self.mainwindow.devicesManange.writeAreas(deviceName = deviceName, values = valueList) + def wirteValue(self, deviceName, curIndex, valueList): + print(deviceName,curIndex, valueList ) + # self.devicesManange.writeAreas(deviceName = deviceName, values = valueList) - def readValue(self,deviceName, dataTypeAndModel): - areaWidgets = self.areaValueManage.getAreaValueList(deviceName = deviceName, dataTypeAndModel = dataTypeAndModel) - print(areaWidgets,aaa) - # if curIndex == -1: - # return + def readValue(self,deviceName, curIndex): + print(deviceName, curIndex) + +# if curIndex == -1: +# return +# else: +# device = self.devicesManange.getDevice(deviceName) +# values = device.getAreaValues(curIndex) +# i = 0 +# for value in values: +# areaLabel[i].setText(str(value)) +# i =+ 1 + + # # else: # device = self.mainwindow.devicesManange.getDevice(deviceName) # values = device.getAreaValues(curIndex) # areaWidgets = self.widgetList[areaIndex] # for value, widgets in zip(values, areaWidgets): # widgets[0].setText(str(value)) - + if __name__ == '__main__': diff --git a/UI/AreaValueManage.py b/UI/AreaValueManage.py deleted file mode 100644 index bc6a70f..0000000 --- a/UI/AreaValueManage.py +++ /dev/null @@ -1,86 +0,0 @@ -import collections - -class AreaValueManage(): - def __init__(self): - self.wirteAllValueDict = collections.OrderedDict() - self.readAllValueDict = collections.OrderedDict() - self.wirteValueDict = collections.OrderedDict() - self.readValueDict = collections.OrderedDict() - self.initCurindex = 0 - self.readValueWidgets = [] - - def initAreaValue(self, deviceName, curIndex, valueList, dataTypeAndModel): - if dataTypeAndModel in ['主站AO','从站AI', '主站DO','从站DI']: - self.wirteValueDict[self.initCurindex] = valueList - self.wirteAllValueDict[deviceName] = self.wirteValueDict - self.initCurindex += 1 - else: - self.readValueDict[self.initCurindex] = valueList - self.readAllValueDict[deviceName] = self.readValueDict - self.initCurindex += 1 - print(self.readAllValueDict,999) - - - def delArea(self, deviceName, curIndex): - if deviceName in self.wirteAllValueDict.keys(): - areaDict = self.wirteAllValueDict[deviceName] - if curIndex in self.wirteAllValueDict[deviceName].keys(): - areaDict.pop(curIndex) - - for key, value in areaDict.items(): - if key > curIndex: - areaDict[key - 1] = value - areaDict.pop(key) - elif deviceName in self.readAllValueDict.keys(): - areaDict = self.readAllValueDict[deviceName] - if curIndex in self.readAllValueDict[deviceName].keys(): - areaDict.pop(curIndex) - - for key, value in areaDict.items(): - if key > curIndex: - areaDict[key - 1] = value - areaDict.pop(key) - - - def delDevice(self,deviceName): - if deviceName in self.wirteAllValueDict.keys(): - self.wirteAllValueDict.pop(deviceName) - elif deviceName in self.readAllValueDict.keys(): - self.readAllValueDict.pop(deviceName) - - def updataAreaValue(self, deviceName, curIndex, valueList, dataTypeAndModel): - if dataTypeAndModel in ['主站AO','从站AI', '主站DO','从站DI']: - if deviceName not in self.wirteAllValueDict.keys(): - self.wirteValueDict[self.initCurindex] = valueList - self.wirteAllValueDict[deviceName] = self.wirteValueDict - else: - areaDict = self.wirteAllValueDict[deviceName] - areaDict[curIndex] = valueList - else: - if deviceName not in self.readAllValueDict.keys(): - self.readValueDict[self.initCurindex] = valueList - self.readAllValueDict[deviceName] = self.readValueDict - else: - areaDict = self.readAllValueDict[deviceName] - areaDict[curIndex] = valueList - - def getAreaValueList(self, deviceName, dataTypeAndModel): - writeValueLists = [] - readWidgetList = [] - if dataTypeAndModel in ['主站AO','从站AI', '主站DO','从站DI']: - if deviceName in self.wirteAllValueDict.keys(): - writeValueDict = self.wirteAllValueDict[deviceName] - if writeValueDict: - for valueList in writeValueDict.values(): - for value in valueList: - writeValueLists.append(value) - return writeValueLists - - elif deviceName in self.readAllValueDict.keys(): - readValueDict = self.readAllValueDict[deviceName] - if readValueDict: - for widgetsList in writeValueDict.values(): - for widget in widgetsList: - readWidgetList.append(widget) - return readWidgetList - \ No newline at end of file diff --git a/UI/ButtonLayoutWidget.py b/UI/ButtonLayoutWidget.py index a79b862..acfee6b 100644 --- a/UI/ButtonLayoutWidget.py +++ b/UI/ButtonLayoutWidget.py @@ -1,29 +1,31 @@ + from PyQt5.QtWidgets import QApplication, QMainWindow, QTabWidget, QWidget, QVBoxLayout, QLabel, QPushButton, QLayout, \ QHBoxLayout, QComboBox, QLineEdit, QSpacerItem, QSizePolicy, QGridLayout, QMessageBox, QSplitter, QFrame import re class forceButton(QPushButton): - def __init__(self, valueLabel = None, valueEdit = None): + def __init__(self, number = None, valueLabel = None, valueEdit = None): super().__init__() self.valueEdit = valueEdit - self.valueLabel= valueLabel + self.valueLabel = valueLabel + self.number = number self.setObjectName('forceBtn') self.setText('强制') -class ButtonLayout(QWidget): +class ButtonWidgets(QWidget): def __init__(self, areaWidget, order, byteLineEdit, dataType, deviceName): super().__init__() - self.areaLineEditWidgets = [] - self.areaLabelWidget = [] + self.areaLineEditValue = [] + self.areaLabel = {} self.areaWidget = areaWidget + self.devicesManange = self.areaWidget.devicesManange self.order = order self.byteLineEdit = byteLineEdit self.dataType = dataType self.deviceName = deviceName - self.areaValueManage = self.areaWidget.areaValueManage - self.settingValue = areaWidget.settingValue self.addLayout() - self.initValues() + + # self.setStyleSheet("background-color: black") @@ -36,26 +38,32 @@ class ButtonLayout(QWidget): print(self.dataType) if self.dataType in ['AI','AO']: hLayout = QHBoxLayout() + hLayout.addWidget(QSplitter()) hLayout.addLayout(self.dateLayout(1)) hLayout.addWidget(QSplitter()) + areaLayout.addWidget(QSplitter()) areaLayout.addLayout(hLayout) areaLayout.addWidget(QSplitter()) else: byteLineEdit = int(self.byteLineEdit) * 4 + areaLayout.addWidget(QSplitter()) for i in range(int(byteLineEdit)): hLayout = QHBoxLayout() - hLayout.addLayout(self.dateLayout(number = (i + 1)*2 - 1)) - # hLayout.addWidget(QSplitter()) - hLayout.addLayout(self.dateLayout(number = (i + 1)*2)) + hLayout.addWidget(QSplitter(), 2) + hLayout.addLayout(self.dateLayout(number = (i + 1)), 6) + hLayout.addWidget(QSplitter(), 2) + hLayout.addLayout(self.dateLayout(number = (i + 1) + 8), 6) + hLayout.addWidget(QSplitter(), 2) areaLayout.addLayout(hLayout) areaLayout.addWidget(QSplitter()) + return areaLayout def dateLayout(self, number, force = True): number = number forceLayout = QHBoxLayout() - areaMessLabel = QLabel(str(self.dataType) + str(number) + ": " + '字节长度: ' + str(self.byteLineEdit) + ' 当前值: ' ) + areaMessLabel = QLabel(str(self.dataType) + "{:<{}}".format(str(number), 2) + ": " + '字节长度: ' + str(self.byteLineEdit) + ' 当前值: ' ) areaMessLabel.setObjectName('areaMessLabel') areaValueLabel = QLabel('0') areaValueLabel.setObjectName('areaValueLabel') @@ -65,77 +73,76 @@ class ButtonLayout(QWidget): if '主站' in self.deviceName and self.dataType == 'AI' or ('从站' in self.deviceName and self.dataType == 'AO'): force = False - self.areaLabelWidget.append(areaValueLabel) + self.areaLabel[number] = areaValueLabel elif '主站' in self.deviceName and self.dataType == 'DI' or ('从站' in self.deviceName and self.dataType == 'DO'): force = False - self.areaLabelWidget.append(areaValueLabel) + self.areaLabel[number] = areaValueLabel if force: areaLineEdit = QLineEdit('0') areaLineEdit.setObjectName('areaLineEdit') - forceBtn = forceButton(valueLabel=areaValueLabel, valueEdit=areaLineEdit) + forceBtn = forceButton(number = number, valueLabel=areaValueLabel, valueEdit=areaLineEdit) forceBtn.clicked.connect(self.forceValues) forceLayout.addWidget(areaLineEdit) forceLayout.addWidget(forceBtn) - self.areaLineEditWidgets.append(forceBtn) + self.areaLineEditValue.append('0') + + forceLayout.setSpacing(10) return forceLayout - def wirteAreaLineEditValue(self,dataTypeAndModel): - areaValueList = [] + def wirteAreaLineEditValue(self,dataTypeAndModel, valueLabel, number, value): + if dataTypeAndModel in ['主站AO','从站AI']: - for areaLineEdit in self.areaLineEditWidgets: - editValue = areaLineEdit.valueEdit.text() - pattern = re.compile(r'^\d+(\.\d+)?$') - match = pattern.match(editValue) - if not match: - QMessageBox.warning(self, '提示', '请输入数字。') - return - else: - areaLineEdit.valueLabel.setText(editValue) - areaValueList.append(editValue) - return areaValueList + pattern = re.compile(r'^\d+(\.\d+)?$') + match = pattern.match(value) + if not match: + QMessageBox.warning(self, '提示', '请输入数字。') + return + else: + valueLabel.setText(value) + self.areaLineEditValue[number -1] = value + #判断输入值是否为0和1 elif dataTypeAndModel in ['主站DO','从站DI']: - for areaLineEdit in self.areaLineEditWidgets: - editValue = areaLineEdit.valueEdit.text() - pattern = re.compile(r'^[01]$') - match = pattern.match(editValue) - if not match: - QMessageBox.warning(self, '提示', '请输入0或1。') - return - else: - areaLineEdit.valueLabel.setText(editValue) - areaValueList.append(editValue) - else: - areaValueList = self.areaLabelWidget - return areaValueList - - def readValues(self,valueList): - widgets = self.areaLabelWidget - for value, widgets in zip(valueList, widgets): - widgets.setText(str(value)) + pattern = re.compile(r'^[01]$') + match = pattern.match(value) + if not match: + QMessageBox.warning(self, '提示', '请输入0或1。') + return + else: + valueLabel.setText(value) + self.areaLineEditValue[number -1] = value + + return self.areaLineEditValue + + def readValues(self,deviceName, curIndex): + if self.areaLabel is None: + return + elif curIndex == -1: + return + else: + device = self.devicesManange.getDevice(deviceName) + # print(id(device)) + values = device.getAreaValues(curIndex) + for index, value in enumerate(values): + self.areaLabel[index+1].setText(str(value)) + def forceValues(self): - + sender = self.sender() + number = sender.number + valueLabel = sender.valueLabel + value = sender.valueEdit.text() dataTypeAndModel = self.deviceName[-2:] + self.dataType curIndex = self.areaWidget.areaTabWidget.currentIndex() - valueList = self.wirteAreaLineEditValue(dataTypeAndModel) - - # if valueList is None: - # return - # else: - self.areaValueManage.updataAreaValue(deviceName = self.deviceName, curIndex = curIndex, valueList = valueList, dataTypeAndModel = dataTypeAndModel) - self.areaWidget.wirteValue(deviceName = self.deviceName, dataTypeAndModel = dataTypeAndModel) - def initValues(self): - - dataTypeAndModel = self.deviceName[-2:] + self.dataType - valueList = self.wirteAreaLineEditValue(dataTypeAndModel) - - curIndex = self.areaWidget.areaTabWidget.currentIndex() - if self.settingValue is not None: - self.areaValueManage.initAreaValue(deviceName = self.deviceName, curIndex= curIndex, valueList = valueList, dataTypeAndModel = dataTypeAndModel) + valueList = self.wirteAreaLineEditValue(dataTypeAndModel=dataTypeAndModel, valueLabel=valueLabel,number=number, value=value) + + if valueList is None: + return else: - self.areaValueManage.updataAreaValue(deviceName = self.deviceName, curIndex = curIndex, valueList = valueList, dataTypeAndModel = dataTypeAndModel) \ No newline at end of file + self.areaWidget.wirteValue(deviceName = self.deviceName, curIndex = curIndex, valueList = valueList) + + \ No newline at end of file diff --git a/UI/DeviceWidget.py b/UI/DeviceWidget.py index c54fbb7..98346fb 100644 --- a/UI/DeviceWidget.py +++ b/UI/DeviceWidget.py @@ -2,6 +2,7 @@ import json from PyQt5.QtWidgets import QMainWindow, QDialog, QTabWidget, QPushButton, QSpacerItem, QSizePolicy,QMessageBox, QHBoxLayout, QWidget from PyQt5.QtGui import QIcon +from PyQt5.QtCore import QSize from UI.DeviceDialogWidget import DeviceDialog @@ -11,13 +12,13 @@ from UI.AreaTabWidget import AreaTabWidget from utils.DBModels.DeviceModels import DeviceDB from model.ProjectModel.DeviceManage import DevicesManange from UI.DeviceDialogWidget import DeviceDialog -from model.ProjectModel.DeviceWidgetManage import DeviceWidgetManage + class DeviceWidget(QMainWindow): - def __init__(self, dockWidget): + def __init__(self, dockWidget, devicesManange): super().__init__() self.dockWidget = dockWidget self.forceValues = [] - + self.devicesManange = devicesManange self.initUI() @@ -27,7 +28,7 @@ class DeviceWidget(QMainWindow): self.proType = self.dockWidget.windowTitle()[0:2] self.masterSlaveModel = self.dockWidget.windowTitle()[2:4] - # self.deviceWidgetManage = DeviceWidgetManage() + self.deviceTabWidget = QTabWidget(self) self.deviceTabWidget.setObjectName('deviceTabWidget') @@ -56,6 +57,7 @@ class DeviceWidget(QMainWindow): if reply == QMessageBox.Yes: if index != -1: self.deviceTabWidget.removeTab(index) + self.devicesManange.delDevice(deviceName = self.deviceName) DeviceDB.deleteDevice(deviceName = self.deviceName) else: return @@ -78,7 +80,7 @@ class DeviceWidget(QMainWindow): self.deviceTabWidget.tabBar().setHidden(False) self.deviceTabWidget.addTab(areaTabWidget,str(self.titleName)) self.deviceTabWidget.setCurrentIndex(tabIndex) - # self.deviceWidgetManage.addDevice(deviceName = self.deviceName, areaTabWidget=areaTabWidget, dockWidget=self.dockWidget) + self.devicesManange.addDevice(proType=self.proType, masterSlaveModel = self.masterSlaveModel, deviceName = self.deviceName) else: return else: @@ -87,23 +89,31 @@ class DeviceWidget(QMainWindow): self.titleName = self.deviceName[:-4] areaTabWidget = AreaTabWidget(self) self.deviceTabWidget.tabBar().setHidden(False) - self.deviceTabWidget.addTab(areaTabWidget,str(self.titleName)) - + self.deviceTabWidget.addTab(areaTabWidget,str(self.titleName)) + + def initWidget(self,state): alldevices = DevicesManange.getAllDevice() titleName = self.dockWidget.windowTitle() if alldevices: for devices in alldevices: - # self.devicesManange.addDevice(proType = devices[1], masterSlaveModel = devices[2], deviceName = devices[0]) deviceName = devices[0] + if titleName in deviceName: + self.devicesManange.addDevice(proType = devices[1], masterSlaveModel = devices[2], deviceName = devices[0]) self.addDeviceWidget(deviceName=deviceName) + state = False if state: widget = QWidget() 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.addItem(self.horizontalSpacer) layout.addWidget(addButton) @@ -111,49 +121,11 @@ class DeviceWidget(QMainWindow): widget.setLayout(layout) self.deviceTabWidget.addTab(widget,'') self.deviceTabWidget.tabBar().setHidden(True) - + - - - - - # def initAreaWidget(self, mdiarea): - # alldevices = DevicesManange.getAllDevice() - # for devices in alldevices: - # areas = devices[3] - - # deviceWidget = self.deviceWidget(devices[0], mdiarea) #新建deviceWidget - # areaTabWidget = deviceWidget.widget().widget().centralWidget() # type: ignore - # self.devicesManange.addDevice(proType = devices[1], masterSlaveModel = devices[2], deviceName = devices[0], deviceWidget = deviceWidget, areaTabWidget = areaTabWidget) # type: ignore - - - # if areas is not None: - # areas = json.loads(areas) - # for area in areas: - # dataType, order = self.tran(area["type"], area["order"]) - # channelBytes = area["bytes"] - # dev = self.devicesManange.getDevice(deviceName = devices[0]) - # dev.addArea(type = area["type"], order = area["order"], bytes = int(channelBytes), nums = 1) #添加area - # areaTabWidget.initAreaTab(dataType, order, channelBytes) - # self.devicesManange.recalculateAddress() - - # def createDeciveWidget(self, mdiarea): - # dialog = DeviceDialog() - - # if dialog.exec_() == QDialog.Accepted: - # deviceName, proType, masterSlaveModel, pvUpperLimit, pvLowerLimit, pvUnit = dialog.getParameters() - # windowTitle = deviceName + ' ' + proType + masterSlaveModel + ' ' + pvLowerLimit + '-' + pvUpperLimit + pvUnit - # DeviceDB().addDevice(deviceName = windowTitle, proType = proType, masterSlaveModel = masterSlaveModel, pvUpperLimit=pvUpperLimit, pvLowerLimit=pvLowerLimit, pvUnit=pvUnit) - # deviceWidget = self.deviceWidget(windowTitle, mdiarea) - # areaTabWidget = deviceWidget.widget().widget().centralWidget() - # self.devicesManange.addDevice(proType = proType, masterSlaveModel = masterSlaveModel, deviceName = windowTitle, deviceWidget = deviceName, areaTabWidget = areaTabWidget) - # self.devicesManange.recalculateAddress() - # else: - # return - - + diff --git a/UI/MainWindow.py b/UI/MainWindow.py index c8341d3..d65e449 100644 --- a/UI/MainWindow.py +++ b/UI/MainWindow.py @@ -1,11 +1,12 @@ import sys -from PyQt5.QtWidgets import QApplication, QMainWindow, QDockWidget, QToolBar, QAction +from PyQt5.QtWidgets import QApplication, QMainWindow, QDockWidget, QToolBar, QAction, QTabWidget, QGridLayout from PyQt5.QtCore import Qt from PyQt5.QtGui import QIcon from utils.DBModels.BaseModel import * from model.ClientModel.Client import Client from UI.DeviceWidget import DeviceWidget +from model.ProjectModel.DeviceManage import DevicesManange class CommonHelper: def __init__(self): @@ -20,6 +21,7 @@ class CommonHelper: class MainWindow(QMainWindow): def __init__(self): super().__init__() + self.devicesManange = DevicesManange() self.initUI() def initUI(self): @@ -39,19 +41,19 @@ class MainWindow(QMainWindow): self.toolbar.addAction(self.startProtocolBtn) dpMasterDockWidget = QDockWidget('DP主站') - dpMasterDockWidget.setWidget(DeviceWidget(dpMasterDockWidget)) + dpMasterDockWidget.setWidget(DeviceWidget(dpMasterDockWidget, self.devicesManange)) dpMasterDockWidget.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) # type: ignore dpSlaveDockWidget = QDockWidget('DP从站') - dpSlaveDockWidget.setWidget(DeviceWidget(dpSlaveDockWidget)) + dpSlaveDockWidget.setWidget(DeviceWidget(dpSlaveDockWidget, self.devicesManange)) dpSlaveDockWidget.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) # type: ignore paMasterDockWidget = QDockWidget('PA主站') - paMasterDockWidget.setWidget(DeviceWidget(paMasterDockWidget)) + paMasterDockWidget.setWidget(DeviceWidget(paMasterDockWidget, self.devicesManange)) paMasterDockWidget.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) # type: ignore paSlaveDockWidget = QDockWidget('PA从站') - paSlaveDockWidget.setWidget(DeviceWidget(paSlaveDockWidget)) + paSlaveDockWidget.setWidget(DeviceWidget(paSlaveDockWidget, self.devicesManange)) paSlaveDockWidget.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) # type: ignore self.addDockWidget(Qt.TopDockWidgetArea, dpMasterDockWidget) # type: ignore @@ -64,8 +66,26 @@ class MainWindow(QMainWindow): self.showMaximized() def startProtocol(self): - sender = self.sender - + dockWidgets = self.findChildren(QDockWidget) #找到四个dockWidget窗口 + for dockWidget in dockWidgets: + deviceTabWidgets = dockWidget.findChildren(QTabWidget, 'deviceTabWidget') #判断四个窗口里是否有deviceTabWidget + + for deviceTabWidget in deviceTabWidgets: + areaTabWidgets = deviceTabWidget.findChildren(QTabWidget, 'areaTabWidget') + + for areaTabWidget in areaTabWidgets: + leftLayout = areaTabWidget.currentWidget().layout().itemAt(0) + + if isinstance(leftLayout,QGridLayout): + masterAndSlave = dockWidget.windowTitle()[2:5] + dataType = leftLayout.itemAtPosition(0,1).widget().currentText() + dataTypeAndModel = masterAndSlave + dataType + + if dataTypeAndModel in ['主站AI', '主站DI', '从站AO', '从站DO']: + curIndex = areaTabWidget.currentIndex() + buttonlayoutWidget = areaTabWidget.currentWidget().layout().itemAt(2).itemAtPosition(0,0).widget()#获取buttonlayout + buttonlayoutWidget.readValues(deviceName = deviceName, curIndex = curIndex) + def loadProject(self): pass diff --git a/model/ProjectModel/DeviceManage.py b/model/ProjectModel/DeviceManage.py index c513152..ae4e4d8 100644 --- a/model/ProjectModel/DeviceManage.py +++ b/model/ProjectModel/DeviceManage.py @@ -47,8 +47,8 @@ class Device(): area.addressList = np.arange(area.startAddress, area.endAddress + 1, area.bytes).tolist() self.indexDict[len(self.indexDict.values())] = len(self.outputAreas) self.outputAreas.append(area) - # print(id(self), self.outputAreas) - # print(area.addressList, area.startAddress, area.endAddress, self.outputAreas) + # print(id(self), self.inputAreas) + # print(self.deviceName, area.addressList, area.startAddress, area.endAddress, self.inputAreas) def delArea(self, index, type): if type in ["DI", "AI"]: @@ -94,6 +94,7 @@ class Device(): return self.outputAreas[index].currentValue else: # print(self.inputAreas, index) + # print(id(self), self.inputAreas) return self.inputAreas[index].currentValue def getLength(self, nums, bytes): diff --git a/model/ProjectModel/DeviceWidgetManage.py b/model/ProjectModel/DeviceWidgetManage.py deleted file mode 100644 index 7c5c81d..0000000 --- a/model/ProjectModel/DeviceWidgetManage.py +++ /dev/null @@ -1,37 +0,0 @@ - -class Area(): - mainLayout = None - leftLayoutWidget = [] - rightLayoutWidget = [] - - - - -class Device(): - deviceName = None - areaTabWidget = None - dockWidget = None - -class DeviceWidgetManage(): - - def addDevice(self,deviceName, areaTabWidget, dockWidget): - Device.deviceName = deviceName - Device.areaTabWidget = areaTabWidget - Device.dockWidget = dockWidget - - def getDeviceName(self): - return Device.deviceName - - def addArea(self, mainLayout=None, leftLayoutWidget=None, rightLayoutWidget=None): - - if mainLayout is not None: - Area.mainLayout = mainLayout - if leftLayoutWidget is not None: - Area.leftLayoutWidget = leftLayoutWidget - if rightLayoutWidget is not None: - Area.rightLayoutWidget = rightLayoutWidget - - def getAreaTabWidget(self): - return Device.areaTabWidget - -