import sys import json import collections import time from PyQt5.QtWidgets import QApplication, QMainWindow, QToolBar, QMdiArea, QAction, QInputDialog, QDialog, QFormLayout, QLineEdit, \ 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 protocol.ModBus.ModBusThread import MyThread from utils.DBModels.BaseModel import * 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() def initUI(self): self.toolbar = QToolBar() self.addToolBar(self.toolbar) # self.setWindowState(self.windowState() | QtCore.Qt.WindowMaximized) self.action1 = QAction("添加设备", self) self.action1.triggered.connect(self.createDeciveWidget) self.action2 = QAction("开始通讯", self) self.action2.triggered.connect(self.startProtocol) self.toolbar.addAction(self.action1) self.toolbar.addAction(self.action2) self.mdi_area = QMdiArea() # self.scrollArea = QScrollArea() # self.scrollArea.setWidget(self.mdi_area) self.setCentralWidget(self.mdi_area) # self.mdi_area.setViewMode(QMdiArea.TabbedView) # self.mdi_area.setTabsClosable(False) # self.mdi_area.setTabsMovable(True) self.setWindowTitle("Main Window") 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 deviceWidget(self, windowTitle): sub_window = AreaQMdiSubWindow() # 创建一个子窗口 areaLayout1 = QGridLayout() areaLayout2 = QGridLayout() horizontalLayout = QHBoxLayout() horizontalLayout.setObjectName("horizontalLayout") # tableWidget = QTableWidget() widget = QWidget() widget.setLayout(areaLayout1) widgetArea = QWidget() widgetArea.setLayout(areaLayout2) newbtn = QPushButton('New') editbtn = QPushButton('修改') delbth = QPushButton('删除') self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) 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) areaLayout1.addLayout(horizontalLayout, 0, 0, 1, 1) areaLayout1.addWidget(widgetArea, 1, 0, 1, 1) areaLayout1.addItem(self.verticalSpacer) scroll_widget = QScrollArea() scroll_widget.setWidgetResizable(True) scroll_widget.setWidget(widget) sub_window.setWindowTitle(windowTitle) sub_window.setGeometry(100, 100, 400, 300) 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) return sub_window def createDeciveWidget(self): 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) else: return self.areaWidget(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) else: return layout = sub_window.widget().widget().layout().itemAt(1).widget().layout() #获取sub_window的widgetArea的areaLayout2 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 ) 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) def editAreaWidget(self): l = len(self.area.masterValues) for x in range(l): self.labelText[x][0].setText(str(self.area.masterValues[x])) def getTextValue(self): for sub_window in self.sub_windows: areaLayout = sub_window.widget().widget().layout().itemAt(1).widget().layout() 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) def startProtocol(self): # self.area.getallAreaValue(self.sub_windows) thread = MyThread(self.area) thread.start() def closeEvent(self, event): pass def deleteAreaWidget(self): pass class AreaQMdiSubWindow(QMdiSubWindow): def __init__(self): super().__init__() self.number = 0 self.devicedb = DeviceDB() def closeEvent(self, event): self.devicedb.deleteDevice(deviceName = self.windowTitle()) if __name__ == '__main__': app = QApplication(sys.argv) Client.initDB() window = MainWindow() window.show() sys.exit(app.exec_())