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 UI.DeviceWidget import DeviceDialog from UI.AreaSettingWidget import AreaSettingWidget from UI.DelAreaWidget import DelAreaWidget from model.ProjectModel.DeviceManage import DevicesManange, Device from protocol.ModBus.ModBusThread import MyThread from utils.DBModels.BaseModel import * from UI.AreaTabWidget import AreaTabWidget from utils.DBModels.DeviceModels import DeviceDB from model.ClientModel.Client import Client from model.ProjectModel.DeviceManage import DevicesManange class CommonHelper: def __init__(self): pass @staticmethod def readQss(style): with open(style,"r") as f: return f.read() class MainWindow(QMainWindow): def __init__(self): super().__init__() self.devicesManange = DevicesManange() self.subWindows = [] #存储设备widget self.initUI() self.initAreaWidget() def initUI(self): self.toolbar = QToolBar() self.addToolBar(self.toolbar) # self.setWindowState(self.windowState() | QtCore.Qt.WindowMaximized) self.addDiviceBtn = QAction("添加设备", self) self.addDiviceBtn.setObjectName("addDiviceBtn") self.addDiviceBtn.triggered.connect(self.createDeciveWidget) self.startProtocolBtn = QAction("开始通讯", self) self.startProtocolBtn.setObjectName("startProtocolBtn") self.startProtocolBtn.triggered.connect(self.startProtocol) self.loadProjectBtn = QAction('导入工程', self) self.loadProjectBtn.setObjectName("loadProjectBtn") self.loadProjectBtn.triggered.connect(self.loadProject) self.toolbar.addAction(self.addDiviceBtn) self.toolbar.addAction(self.loadProjectBtn) self.toolbar.addAction(self.startProtocolBtn) self.mdi_area = QMdiArea() self.setCentralWidget(self.mdi_area) self.setWindowIcon(QIcon('Static/zhjt.ico')) self.setWindowTitle("PROFIBUS") self.setGeometry(1000, 500, 800, 600) def deviceWidget(self, windowTitle): subWindow = AreaQMdiSubWindow(self)# 创建一个子窗口 subWindow.setObjectName('subWindow') areaTabWidget = AreaTabWidget(self) #新建mainWindows放入subwindows areaMainWindow = QMainWindow() areaMainWindow.setCentralWidget(areaTabWidget) #mainwindows添加工具栏 toolbar = QToolBar() areaMainWindow.addToolBar(toolbar) addAreaBtn = QAction("添加通道", areaMainWindow) addAreaBtn.setObjectName("addDiviceBtn") addAreaBtn.triggered.connect(areaTabWidget.addAreaTab) toolbar.addAction(addAreaBtn) #为mainwindow添加右滑动条 scroll_widget = QScrollArea() scroll_widget.setWidgetResizable(True) scroll_widget.setWidget(areaMainWindow) #设置subwindow subWindow.setWindowTitle(windowTitle) subWindow.setGeometry(0, 0, 600, 500) subWindow.setWidget(scroll_widget) subWindow.setWindowIcon(QIcon('Static/zhjt.ico')) self.mdi_area.addSubWindow(subWindow) # 将子窗口添加到MDI区域 subWindow.show() self.subWindows.append(subWindow) return subWindow def loadProject(self): pass def initAreaWidget(self): alldevices = DevicesManange.getAllDevice() for devices in alldevices: areas = devices[3] self.devicesManange.addDevice(proType = devices[1], masterSlaveModel = devices[2], deviceName = devices[0]) areaTabWidget = self.deviceWidget(devices[0]).widget().widget().centralWidget() if areas is not None: areas = json.loads(areas) for area in areas: dataType, order = self.tran(area["type"], area["order"]) channelBytes = area["bytes"] self.devicesManange.getDevice(deviceName = devices[0]).addArea(type = area["type"], order = order, bytes = int(channelBytes), nums = 1) self.devicesManange.recalculateAddress() areaTabWidget.initAreaTab(dataType, order, channelBytes) 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().addDevice(deviceName = windowTitle, proType = proType, masterSlaveModel = masterSlaveModel, pvUpperLimit=pvUpperLimit, pvLowerLimit=pvLowerLimit, pvUnit=pvUnit) self.devicesManange.addDevice(proType = proType, masterSlaveModel = masterSlaveModel, deviceName = windowTitle) else: return self.deviceWidget(windowTitle) def startProtocol(self): for subWindow in self.subWindows: areaTabWidget = subWindow.widget().widget().centralWidget() areaTabWidget.readValue() def tran(self, dataType, order): if dataType == 'AI': dataType = 0 if dataType == 'AO': dataType = 1 if dataType == 'DI': dataType = 2 if dataType == 'DO': dataType = 3 if order == 'ABCD': order = 0 if order == 'DCBA': order = 1 if order == 'CDAB': order = 2 if order == 'BADC': order = 3 return dataType, order class AreaQMdiSubWindow(QMdiSubWindow): def __init__(self, parentWindow): super().__init__() self.parentWindow = parentWindow def closeEvent(self, event): self.parentWindow.subWindows.remove(self) DeviceDB.deleteDevice(deviceName = self.windowTitle()) self.parentWindow.devicesManange.delDevice(deviceName = self.windowTitle()) if __name__ == '__main__': app = QApplication(sys.argv) Client.initDB() window = MainWindow() window.show() sys.exit(app.exec_())