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 PyQt5.QtGui import QPixmap, QIcon from DeviceWidget import * from UI.AreaSettingWidget import AreaSettingWidget 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 class MainWindow(QMainWindow): def __init__(self): super().__init__() self.sub_windows = [] #存储设备widget self.nowValue = [] #储存当前值 self.areaLabel = [] #存储通道信息文本 # self.initAreaWidget() self.number = 0 self.initUI() 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.setWindowIcon(QIcon('../Static/zhjt.ico')) # self.mdi_area.setViewMode(QMdiArea.TabbedView) # self.mdi_area.setTabsClosable(False) # self.mdi_area.setTabsMovable(True) 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 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('添加通道') 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(delbth) newbtn.clicked.connect(lambda: self.newAreaWidget(sub_window)) delbth.clicked.connect(lambda: self.delAreaWidget(sub_window)) 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(0, 0, 600, 500) sub_window.setWidget(scroll_widget) sub_window.setWindowIcon(QIcon('../Static/zhjt.ico')) self.mdi_area.addSubWindow(sub_window) # 将子窗口添加到MDI区域 # self.mdi_area.subWindowActivated.connect(self.adjustMdiAreaSize) 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 + ' ' + pvLowerLimit + '-' + pvUpperLimit + pvUnit # DeviceDB().createDevice(deviceName = windowTitle, proType = proType, masterSlaveModel = masterSlaveModel, pvUpperLimit=pvUpperLimit, pvLowerLimit=pvLowerLimit, pvUnit=pvUnit) else: return 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) 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: 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) 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]) 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 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) def startProtocol(self): if self.areaLabel: print(1) else: print(2) return def closeEvent(self, event): pass def deleteAreaWidget(self): pass class AreaQMdiSubWindow(QMdiSubWindow): def __init__(self): super().__init__() self.number = 0 def closeEvent(self, event): pass # self.devicedb.deleteDevice(deviceName = self.windowTitle()) if __name__ == '__main__': app = QApplication(sys.argv) # Client.initDB() window = MainWindow() window.show() sys.exit(app.exec_())