diff --git a/UI/AreaSettingWidget.py b/UI/AreaSettingWidget.py index 52463de..c53eaaa 100644 --- a/UI/AreaSettingWidget.py +++ b/UI/AreaSettingWidget.py @@ -1,7 +1,7 @@ -from PyQt5.QtWidgets import QDialog, QFormLayout, QLineEdit, QComboBox, QDialogButtonBox, QApplication +from PyQt5.QtWidgets import QDialog, QFormLayout, QLineEdit, QComboBox, QDialogButtonBox, QApplication, QMessageBox import sys - +import re class AreaSettingWidget(QDialog): def __init__(self, parent=None): super().__init__(parent) @@ -26,9 +26,11 @@ class AreaSettingWidget(QDialog): button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) - button_box.accepted.connect(self.accept) + button_box.accepted.connect(self.check_input) button_box.rejected.connect(self.reject) + + layout.addRow(button_box) self.setLayout(layout) @@ -41,6 +43,16 @@ class AreaSettingWidget(QDialog): return varType, channelNums, channelBytes + def check_input(self): + varType, channelNums, channelBytes = self.getParameters() + + if not channelNums or not channelBytes: + QMessageBox.warning(self, '警告', '有值未输入。') + elif not re.match(r'^[-+]?\d*\.?\d*$', channelNums) or not re.match(r'^[-+]?\d*\.?\d*$', channelBytes): + QMessageBox.warning(self, '警告', '请输入数字。') + else: + self.accept() # 所有输入都是数字且不为空时接受对话框 + if __name__ == '__main__': app = QApplication(sys.argv) window = AreaSettingWidget() diff --git a/UI/DeviceWidget.py b/UI/DeviceWidget.py index aa7b4a8..85e5ea1 100644 --- a/UI/DeviceWidget.py +++ b/UI/DeviceWidget.py @@ -1,7 +1,7 @@ -from PyQt5.QtWidgets import QDialog, QFormLayout, QLineEdit, QComboBox, QDialogButtonBox +from PyQt5.QtWidgets import QDialog, QFormLayout, QLineEdit, QComboBox, QDialogButtonBox, QMessageBox import sys - +import re class DeviceDialog(QDialog): def __init__(self, parent=None): super().__init__(parent) @@ -37,13 +37,13 @@ class DeviceDialog(QDialog): button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) - button_box.accepted.connect(self.accept) + button_box.accepted.connect(self.check_input) button_box.rejected.connect(self.reject) layout.addRow(button_box) self.setLayout(layout) - self.setWindowTitle("Input Parameters") + self.setWindowTitle("设备信息") def getParameters(self): proType = self.findChild(QComboBox, "ProtocolType").currentText() @@ -52,4 +52,16 @@ class DeviceDialog(QDialog): pvUpperLimit = self.findChild(QLineEdit, "pvUpperLimit").text() pvLowerLimit = self.findChild(QLineEdit, "pvLowerLimit").text() pvUnit = self.findChild(QLineEdit, "pvUnit").text() - return deviceName, proType, masterSlaveModel, pvUpperLimit, pvLowerLimit, pvUnit \ No newline at end of file + return deviceName, proType, masterSlaveModel, pvUpperLimit, pvLowerLimit, pvUnit + + def check_input(self): + deviceName, proType, masterSlaveModel, pvUpperLimit, pvLowerLimit, pvUnit = self.getParameters() + + if not pvUpperLimit or not pvLowerLimit or not pvUnit or not deviceName: + QMessageBox.warning(self, '警告', '有值未输入。') + elif not re.match(r'^[-+]?\d*\.?\d*$', pvUpperLimit) or not re.match(r'^[-+]?\d*\.?\d*$', pvLowerLimit): + QMessageBox.warning(self, '警告', '请输入数字。') + elif pvUpperLimit < pvLowerLimit: + QMessageBox.warning(self, '警告', '量程输入有误。') + else: + self.accept() # 所有输入都是数字且不为空时接受对话框 \ No newline at end of file diff --git a/UI/MainWindow.py b/UI/MainWindow.py index b449f6d..47f793b 100644 --- a/UI/MainWindow.py +++ b/UI/MainWindow.py @@ -7,28 +7,27 @@ from PyQt5.QtWidgets import QApplication, QMainWindow, QToolBar, QMdiArea, QActi QMdiSubWindow, QDialogButtonBox, QWidget, QComboBox, QTabBar, QTabWidget, QGridLayout, QLabel, QPushButton, QSpacerItem, QSizePolicy, QHBoxLayout, QTableWidget, QScrollArea from PyQt5 import QtCore from DeviceWidget import * -from AreaWidget import AreaWidget from UI.AreaSettingWidget import AreaSettingWidget -from model.ProjectModel.AreaManage import Devices, DevicesManange, Area +from UI.DelAreaWidget import DelAreaWidget +# from model.ProjectModel.AreaManage import Devices, DevicesManange, Area from protocol.ModBus.ModBusThread import MyThread from utils.DBModels.BaseModel import * -from utils.DBModels.ClientModels import DeviceDB -from model.ClientModel.Client import Client +# from utils.DBModels.ClientModels import DeviceDB +# from model.ClientModel.Client import Client class MainWindow(QMainWindow): def __init__(self): super().__init__() - self.initUI() - self.area = Area() - self.number = 0 - self.labelText = [] - self.lineEditText = [] - self.devicesmanage = DevicesManange() - self.sub_windows = [] - self.initAreaWidget() - self.getTextValue() + + self.sub_windows = [] #存储设备widget + self.nowValue = [] #储存当前值 + self.areaLabel = [] #存储通道信息文本 + # self.initAreaWidget() + + self.number = 0 + self.initUI() def initUI(self): self.toolbar = QToolBar() @@ -54,49 +53,49 @@ class MainWindow(QMainWindow): # self.mdi_area.setTabsMovable(True) - self.setWindowTitle("Main Window") + self.setWindowTitle("PROFIBUS") self.setGeometry(1000, 500, 800, 600) - def initAreaWidget(self): - alldevices = Devices().getAllDevice() - - for devices in alldevices: - layout = self.deviceWidget(devices[0]).widget().widget().layout().itemAt(1).widget().layout() - areas = devices[3] - number = 0 - masterSlaveModel = devices[2] - if areas is not None: - areas = json.loads(areas) - for area in areas: - varType = area["type"] - channelNums = area["nums"] - channelBytes = area["bytes"] - for i in range(int(channelNums)): - if masterSlaveModel == '主站': - if (i + number) % 2 == 0: - layout.addWidget(QLabel(varType + str(i + 1) + ": " + channelBytes + 'Byte'), (i + number) // 2, - (i + number) % 2) - layout.addWidget(QLabel('0'), (i + number) // 2, (i + number) % 2 + 1) - layout.addWidget(QLineEdit('0'), (i + number) // 2, (i + number) % 2 + 2) - - else: - layout.addWidget(QLabel(varType + str(i + 1) + ": " + channelBytes + 'Byte'), (i + number) // 2, - (i + number) % 2 + 3) - layout.addWidget(QLabel('0'), (i + number) // 2, (i + number) % 2 + 4) - layout.addWidget(QLineEdit('0'), (i + number) // 2, (i + number) % 2 + 5) - else: - if (i + number) % 2 == 0: - layout.addWidget(QLabel(varType + str(i + 1) + ": " + channelBytes + 'Byte'), (i + number) // 2, - (i + number) % 2) - layout.addWidget(QLabel('0'), (i + number) // 2, (i + number) % 2 + 1) - layout.addWidget(QLineEdit('0'), (i + number) // 2, (i + number) % 2 + 2) - else: - layout.addWidget(QLabel(varType + str(i + 1) + ": " + channelBytes + 'Byte'), (i + number) // 2, - (i + number) % 2 + 3) - layout.addWidget(QLabel('0'), (i + number) // 2, (i + number) % 2 + 4) - layout.addWidget(QLineEdit('0'), (i + number) // 2, (i + number) % 2 + 5) - - number = number + int(channelNums) + # def initAreaWidget(self): + # alldevices = Devices().getAllDevice() + # + # for devices in alldevices: + # layout = self.deviceWidget(devices[0]).widget().widget().layout().itemAt(1).widget().layout() + # areas = devices[3] + # number = 0 + # masterSlaveModel = devices[2] + # if areas is not None: + # areas = json.loads(areas) + # for area in areas: + # varType = area["type"] + # channelNums = area["nums"] + # channelBytes = area["bytes"] + # for i in range(int(channelNums)): + # if masterSlaveModel == '主站': + # if (i + number) % 2 == 0: + # layout.addWidget(QLabel(varType + str(i + 1) + ": " + channelBytes + 'Byte'), (i + number) // 2, + # (i + number) % 2) + # layout.addWidget(QLabel('0'), (i + number) // 2, (i + number) % 2 + 1) + # layout.addWidget(QLineEdit('0'), (i + number) // 2, (i + number) % 2 + 2) + # + # else: + # layout.addWidget(QLabel(varType + str(i + 1) + ": " + channelBytes + 'Byte'), (i + number) // 2, + # (i + number) % 2 + 3) + # layout.addWidget(QLabel('0'), (i + number) // 2, (i + number) % 2 + 4) + # layout.addWidget(QLineEdit('0'), (i + number) // 2, (i + number) % 2 + 5) + # else: + # if (i + number) % 2 == 0: + # layout.addWidget(QLabel(varType + str(i + 1) + ": " + channelBytes + 'Byte'), (i + number) // 2, + # (i + number) % 2) + # layout.addWidget(QLabel('0'), (i + number) // 2, (i + number) % 2 + 1) + # layout.addWidget(QLineEdit('0'), (i + number) // 2, (i + number) % 2 + 2) + # else: + # layout.addWidget(QLabel(varType + str(i + 1) + ": " + channelBytes + 'Byte'), (i + number) // 2, + # (i + number) % 2 + 3) + # layout.addWidget(QLabel('0'), (i + number) // 2, (i + number) % 2 + 4) + # layout.addWidget(QLineEdit('0'), (i + number) // 2, (i + number) % 2 + 5) + # + # number = number + int(channelNums) def deviceWidget(self, windowTitle): @@ -116,7 +115,6 @@ class MainWindow(QMainWindow): widgetArea.setLayout(areaLayout2) newbtn = QPushButton('New') - editbtn = QPushButton('修改') delbth = QPushButton('删除') self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) @@ -124,12 +122,10 @@ class MainWindow(QMainWindow): horizontalLayout.addWidget(newbtn) horizontalLayout.addItem(self.horizontalSpacer) - horizontalLayout.addWidget(editbtn) horizontalLayout.addWidget(delbth) newbtn.clicked.connect(lambda: self.newAreaWidget(sub_window)) - editbtn.clicked.connect(self.editAreaWidget) - delbth.clicked.connect(self.deleteAreaWidget) + delbth.clicked.connect(lambda: self.delAreaWidget(sub_window)) areaLayout1.addLayout(horizontalLayout, 0, 0, 1, 1) areaLayout1.addWidget(widgetArea, 1, 0, 1, 1) @@ -140,12 +136,12 @@ class MainWindow(QMainWindow): scroll_widget.setWidget(widget) sub_window.setWindowTitle(windowTitle) - sub_window.setGeometry(100, 100, 400, 300) + sub_window.setGeometry(0, 0, 600, 500) sub_window.setWidget(scroll_widget) self.mdi_area.addSubWindow(sub_window) # 将子窗口添加到MDI区域 # self.mdi_area.subWindowActivated.connect(self.adjustMdiAreaSize) - # self.sub_window.append(sub_window) + sub_window.show() self.sub_windows.append(sub_window) @@ -158,77 +154,116 @@ class MainWindow(QMainWindow): dialog = DeviceDialog() if dialog.exec_() == QDialog.Accepted: deviceName, proType, masterSlaveModel, pvUpperLimit, pvLowerLimit, pvUnit = dialog.getParameters() - windowTitle = deviceName + proType + ' ' + masterSlaveModel - DeviceDB().createDevice(deviceName = windowTitle, proType = proType, masterSlaveModel = masterSlaveModel, pvUpperLimit=pvUpperLimit, pvLowerLimit=pvLowerLimit, pvUnit=pvUnit) + windowTitle = deviceName + ' ' + proType + masterSlaveModel + ' ' + pvLowerLimit + '-' + pvUpperLimit + pvUnit + # DeviceDB().createDevice(deviceName = windowTitle, proType = proType, masterSlaveModel = masterSlaveModel, pvUpperLimit=pvUpperLimit, pvLowerLimit=pvLowerLimit, pvUnit=pvUnit) else: return - self.areaWidget(windowTitle) + self.deviceWidget(windowTitle) def newAreaWidget(self, sub_window): deviceName = sub_window.windowTitle() + dialog = AreaSettingWidget() if dialog.exec_() == QDialog.Accepted: varType, channelNums, channelBytes = dialog.getParameters() - devices = Devices() - number = devices.getValueLength(deviceName) - devices.addAreas(varType, channelNums, channelBytes, deviceName) - self.devicesmanage.addDevice(deviceName, channelNums, channelBytes) + # devices = Devices() + # number = devices.getValueLength(deviceName) + # devices.addAreas(varType, channelNums, channelBytes, deviceName) + # self.devicesmanage.addDevice(deviceName, channelNums, channelBytes) else: return layout = sub_window.widget().widget().layout().itemAt(1).widget().layout() #获取sub_window的widgetArea的areaLayout2 - + number = self.number #待从数据库获取具体的数据 for i in range(int(channelNums)): if (i + number) % 2 == 0: - layout.addWidget(QLabel(varType + str(i + 1 ) + ": " + channelBytes + 'Byte' ) , (i + number)//2, (i + number) % 2) - layout.addWidget(QLabel('0'), (i + number)//2, (i + number) % 2 + 1 ) - layout.addWidget(QLineEdit('0'), (i + number)//2, (i + number) % 2 + 2 ) + areaLabel = QLabel(varType + str(i + 1 ) + ": " + channelBytes + 'Byte' ) + areaLabel2 =QLabel('0') + areaLineEdit = QLineEdit('0') + editbtn = QPushButton('强制') + layout.addWidget(areaLabel , (i + number)//2, (i + number) % 2) + layout.addWidget(areaLabel2, (i + number)//2, (i + number) % 2 + 1 ) + layout.addWidget(areaLineEdit, (i + number)//2, (i + number) % 2 + 2 ) + layout.addWidget(editbtn, (i + number) // 2, (i + number) % 2 + 3) - else: - layout.addWidget(QLabel(varType + str(i + 1 ) + ": " + channelBytes + 'Byte'), (i + number) // 2, (i + number) % 2 + 3) - layout.addWidget(QLabel('0'), (i + number) // 2, (i + number) % 2 + 4) - layout.addWidget(QLineEdit('0'), (i + number) // 2, (i + number) % 2 + 5) - - layout.addItem(self.verticalSpacer) - + editbtn.clicked.connect(lambda checked, btn=editbtn: self.forceEdit(btn)) - + self.nowValue.append([deviceName, layout, i+1, editbtn, areaLabel2, areaLineEdit, (i + number)//2, (i + number) % 2 + 1]) + self.areaLabel.append([deviceName, i+1, areaLabel, (i + number)//2, (i + number) % 2]) - - def editAreaWidget(self): - l = len(self.area.masterValues) - for x in range(l): - self.labelText[x][0].setText(str(self.area.masterValues[x])) + else: + areaLabel = QLabel(varType + str(i + 1) + ": " + channelBytes + 'Byte') + areaLabel2 = QLabel('0') + areaLineEdit = QLineEdit('0') + editbtn = QPushButton('强制') + + layout.addWidget(areaLabel, (i + number) // 2, (i + number) % 2 + 3) + layout.addWidget(areaLabel2, (i + number) // 2, (i + number) % 2 + 4) + layout.addWidget(areaLineEdit, (i + number) // 2, (i + number) % 2 + 5) + layout.addWidget(editbtn, (i + number) // 2, (i + number) % 2 + 6) + + editbtn.clicked.connect(lambda checked, btn=editbtn: self.forceEdit(btn)) + self.nowValue.append([deviceName, layout, i + 1, editbtn, areaLabel2, areaLineEdit, (i + number) // 2, (i + number) % 2 + 4]) + self.areaLabel.append([deviceName, i + 1, areaLabel, (i + number) // 2, (i + number) % 2 + 3]) + self.number += int(channelNums) + + def forceEdit(self, btn): + for item in self.nowValue: + if btn in item: + item[4].setText(item[5].text()) + + + + def delAreaWidget(self, sub_window): + subwindow = sub_window + if self.areaLabel: + self.deviceName = subwindow.windowTitle() + delAreaWidget = DelAreaWidget(self.areaLabel, self.deviceName) + rowAndColumn = delAreaWidget.getDelAreaRowAndColunm() + self.getAreaWidget(rowAndColumn, subwindow) + else: + return - def getTextValue(self): - for sub_window in self.sub_windows: - areaLayout = sub_window.widget().widget().layout().itemAt(1).widget().layout() + def getAreaWidget(self, rowAndColumn, sub_window): + rowAndColumns = rowAndColumn + subwindow = sub_window + areaLayout = subwindow.widget().widget().layout().itemAt(1).widget().layout() + + for rowAndColumn in rowAndColumns: + print(rowAndColumn) + row = rowAndColumn[0] + column = rowAndColumn[1] + print(row,column) + if column == 0: + for i in range(4): + widget = areaLayout.itemAtPosition(row, i).widget() + print(widget) + areaLayout.removeWidget(widget) + widget.deleteLater() + #删除self.areaLabel列表中的对象 + for label in self.areaLabel: + if widget in label: + self.areaLabel.remove(label) + else: + for i in range(4,8): + widget = areaLayout.itemAtPosition(row, i).widget() + print(widget) + areaLayout.removeWidget(widget) + widget.deleteLater() + # 删除self.areaLabel列表中的对象 + for label in self.areaLabel: + if widget in label: + self.areaLabel.remove(label) - for row in range(areaLayout.rowCount()): - for column in range(areaLayout.columnCount()): - widget_item = areaLayout.itemAtPosition(row, column) - if widget_item is not None: - widget = widget_item.widget() - if isinstance(widget, QLineEdit): - line_edit_text = widget.text() # Get text from QLineEdit - concurrent_label = areaLayout.itemAtPosition(row, column - 1).widget() - proTypeLabel = areaLayout.itemAtPosition(row, column - 2).widget() - # if isinstance(proTypeLabel, QLabel) and (proTypeLabel.text().startswith('AI') or proTypeLabel.text().startswith('DI')): - # concurrent_label.setText(line_edit_text) # Set text to QLabel - self.lineEditText.append([widget, int(widget.text())]) - self.labelText.append([concurrent_label, int(concurrent_label.text())]) - for key in self.lineEditText: - value = key[1] - self.area.masterValues.append(value) @@ -252,9 +287,9 @@ class AreaQMdiSubWindow(QMdiSubWindow): def __init__(self): super().__init__() self.number = 0 - self.devicedb = DeviceDB() def closeEvent(self, event): - self.devicedb.deleteDevice(deviceName = self.windowTitle()) + pass + # self.devicedb.deleteDevice(deviceName = self.windowTitle()) @@ -263,7 +298,7 @@ class AreaQMdiSubWindow(QMdiSubWindow): if __name__ == '__main__': app = QApplication(sys.argv) - Client.initDB() + # Client.initDB() window = MainWindow() window.show() diff --git a/UI/__pycache__/AreaSettingWidget.cpython-310.pyc b/UI/__pycache__/AreaSettingWidget.cpython-310.pyc index 09e93a8..34b087c 100644 Binary files a/UI/__pycache__/AreaSettingWidget.cpython-310.pyc and b/UI/__pycache__/AreaSettingWidget.cpython-310.pyc differ diff --git a/UI/__pycache__/DeviceWidget.cpython-310.pyc b/UI/__pycache__/DeviceWidget.cpython-310.pyc index 3b0b820..22f8afe 100644 Binary files a/UI/__pycache__/DeviceWidget.cpython-310.pyc and b/UI/__pycache__/DeviceWidget.cpython-310.pyc differ diff --git a/model/ProjectModel/AreaManage.py b/model/ProjectModel/AreaManage.py index 18264a5..f655f57 100644 --- a/model/ProjectModel/AreaManage.py +++ b/model/ProjectModel/AreaManage.py @@ -8,7 +8,7 @@ from PyQt5.QtWidgets import QApplication, QMainWindow, QToolBar, QMdiArea, QActi from model.ProjectModel.DeviceManage import DevicesManange from protocol.ModBus.TCPMaster import TcpMaster -from utils.DBModels.ClientModels import DeviceDB +# from utils.DBModels.ClientModels import DeviceDB jsonCon = json.dumps([{ "id": 0, diff --git a/model/ProjectModel/__pycache__/AreaManage.cpython-310.pyc b/model/ProjectModel/__pycache__/AreaManage.cpython-310.pyc index a0d011f..63a9577 100644 Binary files a/model/ProjectModel/__pycache__/AreaManage.cpython-310.pyc and b/model/ProjectModel/__pycache__/AreaManage.cpython-310.pyc differ