You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
PROFIBUS/UI/MainWindow.py

181 lines
5.8 KiB
Python

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
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.subWindows = [] #存储设备widget
self.initUI()
self.initAreaWidget()
self.projectManage = DevicesManange()
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()
#新建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]
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"]
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)
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())
if __name__ == '__main__':
app = QApplication(sys.argv)
Client.initDB()
window = MainWindow()
window.show()
sys.exit(app.exec_())