main
zhangxuxutm 2 years ago
parent 4c80453606
commit 2bf9940961

@ -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()

@ -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
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() # 所有输入都是数字且不为空时接受对话框

@ -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()

@ -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,

Loading…
Cancel
Save