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.

391 lines
15 KiB
Python

7 months ago
import typing
import qtawesome
from PyQt5 import QtGui,QtCore,QtWidgets
from PyQt5.QtCore import QAbstractTableModel, QModelIndex, Qt, QVariant, QSize
from PyQt5.QtWidgets import QItemDelegate, QHBoxLayout, QWidget, QTableView, QCheckBox, QMessageBox
from model.UserModel.UserManage import UserManage
from utils import Globals
class QPushButton(QtWidgets.QPushButton):
def __init__(self, *__args: any,clicked = None):
super(QPushButton,self).__init__(*__args)
self.setCursor(Qt.PointingHandCursor)
self.setIconSize(QSize(25, 25))
class UserTableModel(QAbstractTableModel):
def __init__(self, header, data: list, table = None):
QAbstractTableModel.__init__(self, parent=None)
self.table = table
self.header = header
self.datas = data
self.checkList = ['Unchecked'] * len(self.datas)
self.supportedDragActions()
self.table = table
self.editableList = [] # 表格中可编辑项
def initTable(self):
self.datas = []
userDatas = UserManage.getAllUser()
if not userDatas:
# self.layoutChanged.emit()
self.table.proxy.invalidate()
return
for x in userDatas:
#x.append('')
x += ['']
self.datas.append(x)
self.checkList = ['Unchecked'] * len(self.datas)
# self.layoutChanged.emit()
# print(self.datas)
self.table.proxy.invalidate()
def append_data(self, x):
self.datas.append(x)
self.checkList.append('Unchecked')
# self.layoutChanged.emit()
self.table.proxy.invalidate()
def insert_data(self, x, index):
self.datas.insert(index, x)
self.checkList.insert(index, 'Unchecked')
# print(self.datas)
self.table.proxy.invalidate()
def remove_row(self, row):
self.datas.pop(row)
self.checkList.pop(row)
# self.layoutChanged.emit()
self.table.proxy.invalidate()
def rowCount(self, parent: QModelIndex = ...) -> int:
if len(self.datas) > 0:
return len(self.datas)
return 0
def columnCount(self, parent: QModelIndex = ...) -> int:
return len(self.header)
def data(self, QModelIndex, role=None):
# print(Qt.__dict__.items())
if role == Qt.TextAlignmentRole:
return Qt.AlignCenter
if not QModelIndex.isValid():
print("行或者列有问题")
return QVariant()
if role == Qt.BackgroundColorRole:
return QtGui.QColor('#FFFFFF')
if role == Qt.TextColorRole:
if QModelIndex.column() == 6:
return QtGui.QColor('#000000')
return QtGui.QColor('#1A1A1A')
elif role == Qt.CheckStateRole:
if QModelIndex.column() == 0:
return Qt.Checked if self.checkList[QModelIndex.row()] == 'Checked' else Qt.Unchecked
else:
return None
elif role == Qt.ToolTipRole:
if QModelIndex.column() == 0:
return self.checkList[QModelIndex.row()]
elif role != Qt.DisplayRole:
return QVariant()
elif QModelIndex.column() == 0:
return QVariant(QModelIndex.row() + 1)
return QVariant(self.datas[QModelIndex.row()][QModelIndex.column()]);
def headerData(self, section: int, orientation: Qt.Orientation, role: int = ...) -> typing.Any:
if role != Qt.DisplayRole:
return None
if orientation == Qt.Horizontal:
return self.header[section]
def setData(self, index, value, role):
row = index.row()
col = index.column()
if role == Qt.CheckStateRole and col == 0:
self.checkList[row] = 'Checked' if value == Qt.Checked else 'Unchecked'
return True
if role == Qt.EditRole:
self.datas[row][col] = value
return True
return True
def flags(self, index):
if index.column() == 0:
return Qt.ItemIsEnabled | Qt.ItemIsUserCheckable
if index.row() in self.editableList and index.column() != 4:
return Qt.ItemIsEnabled | Qt.ItemIsUserCheckable | Qt.ItemIsEditable
return Qt.ItemIsEnabled
def headerClick(self, isOn):
self.beginResetModel()
if isOn:
self.checkList = []
self.checkList = ['Checked'] * len(self.datas)
else:
self.checkList = []
self.checkList = ['UnChecked'] * len(self.datas)
self.endResetModel()
def dragMoveEvent(self, event):
event.setDropAction(QtCore.Qt.MoveAction)
event.accept()
def moveRow(self, sourceParent: QModelIndex, sourceRow: int, destinationParent: QModelIndex,
destinationChild: int) -> bool:
if self.datas[destinationChild] == self.datas[sourceRow]:
return
self.datas[sourceRow], self.datas[destinationChild] = self.datas[destinationChild], self.datas[sourceRow]
# self.layoutChanged.emit()
self.table.proxy.invalidate()
class UserButtonDelegate(QItemDelegate):
"""该类用于向单元格中添加按钮 任务表格"""
def __init__(self, parent=None):
super(UserButtonDelegate, self).__init__(parent)
def paint(self, painter, option, index):
if not self.parent().indexWidget(index):
self.i = index
# self.button1 = QPushButton(
# qtawesome.icon('fa.play', color='#1fbb6f'),
# "",
# self.parent(),
# clicked=self.start_action
# )
# self.button1.setIconSize(QSize(15, 15))
# self.button1.setStyleSheet("border:none;")
button2 = QPushButton(
qtawesome.icon('fa.pencil', color='#4c8cf2'),
"",
self.parent(),
clicked=self.edit_action
)
button2.isEdit = True
button2.oldName = False
# self.button2.setStyleSheet("border:none;")
button3 = QPushButton(
qtawesome.icon('fa.trash', color='#ff6d6d'),
"",
self.parent(),
clicked=self.delete_action
)
# self.button3.setStyleSheet("border:none;")
# self.button4 = QPushButton(
# qtawesome.icon('fa.line-chart', color='#393c4e'),
# "",
# self.parent(),
# clicked=self.copy_action
# )
# self.button1.clicked.connect(self.start_action)
button2.clicked.connect(self.edit_action)
button3.clicked.connect(self.delete_action)
# self.button4.clicked.connect(self.copy_action)
# self.button4.setStyleSheet("border:none;")
# self.button1.index = [index.row(), index.column()]
button2.index = [index.row(), index.column()]
button3.index = [index.row(), index.column()]
# self.button4.index = [index.row(), index.column()]
data = self.parent().model.datas[index.row()]
for x in data[0:5]:
if x != '':
break
else:
button2.isEdit = False
button2.setIcon(qtawesome.icon('fa.save', color='#1fbb6f'))
self.parent().model.editableList.append(button2.index[0])
h_box_layout = QHBoxLayout()
# h_box_layout.addWidget(self.button1)
h_box_layout.addWidget(button2)
h_box_layout.addWidget(button3)
# h_box_layout.addWidget(self.button4)
h_box_layout.setContentsMargins(0, 0, 0, 0)
h_box_layout.setAlignment(Qt.AlignCenter)
widget = QWidget()
widget.setObjectName('userBtnWidget')
widget.setLayout(h_box_layout)
self.parent().setIndexWidget(
index,
widget
)
# widget.setStyleSheet('''
# QWidget{background : #ffffff;
# margin-bottom:4px;
# margin-top:4px;}''')
def edit_action(self):
sender = self.sender()
model = self.parent().model
#paint.setAttribute(Qt.WA_TransparentForMouseEvents, False)
if sender.isEdit:
sender.setIcon(qtawesome.icon('fa.save', color='#1fbb6f'))
sender.isEdit = False
sender.oldName = model.datas[sender.index[0]][1]
model.editableList.append(sender.index[0])
for i in range(5, 9):
cbRow = str('cb' + str(sender.index[0]) + str(i))
index = self.parent().model.index(sender.index[0], i)
delegate = self.parent().itemDelegate(index)
checkbox = getattr(delegate, cbRow)
if sender.index[0] == 0:
checkbox.setAttribute(Qt.WA_TransparentForMouseEvents, True)
else:
checkbox.setAttribute(Qt.WA_TransparentForMouseEvents, False)
else:
userMes = model.datas[sender.index[0]]
name, passwd, des, projectAuthority, protocolSetting, userAuthority, trendAuthority = str(userMes[1]), str(userMes[2]), str(userMes[3]), str(userMes[5]), str(userMes[6]), str(userMes[7]), str(userMes[8])
# print(name, passwd, des, projectAuthority, protocolSetting, userAuthority, trendAuthority)
if not name or not passwd:
reply = QMessageBox.question(self.parent(),
'警告',
"有字段为空",
QMessageBox.Yes)
return
sender.isEdit = True
model.editableList.remove(sender.index[0])
if sender.oldName:
UserManage.editUser(userName = sender.oldName, Nname=name, userPwd = passwd, description = des, projectAuthority = projectAuthority, protocolSetting = protocolSetting, userAuthority = userAuthority, trendAuthority = trendAuthority)
else:
UserManage.createUser(userName = name, userPwd = passwd, description = des, projectAuthority = projectAuthority, protocolSetting = protocolSetting, userAuthority = userAuthority, trendAuthority = trendAuthority)
sender.setIcon(qtawesome.icon('fa.pencil', color='#4c8cf2'))
rowIndex = sender.index[0]
userMes = UserManage.getByName(name)
#varMes.append('')
# UserMes.insert(1, '')
#varMes.insert(2, '')
userMes += ['']
# if sender.index[0] in model.editableList:
#
# else:
model.remove_row(rowIndex)
model.insert_data(userMes, rowIndex)
for i in range(5, 9):
cbRow = str('cb' + str(sender.index[0]) + str(i))
index = self.parent().model.index(sender.index[0], i)
delegate = self.parent().itemDelegate(index)
checkbox = getattr(delegate, cbRow)
checkbox.setAttribute(Qt.WA_TransparentForMouseEvents, True)
def delete_action(self):
sender = self.sender()
model = self.parent().model
name = str(model.datas[sender.index[0]][1])
UserManage.deleteUser(name = name)
model.remove_row(sender.index[0])
class UserCheckBoxDelegate(QItemDelegate):
"""该类用于向单元格中添加复选框 任务表格"""
def __init__(self, parent=None):
super(UserCheckBoxDelegate, self).__init__(parent)
def paint(self, painter, option, index):
if not self.parent().indexWidget(index):
data = self.parent().model.datas[index.row()]
checkBox = str('cb' + str(index.row()) + str(index.column()))
setattr(self, checkBox, QCheckBox('',self.parent()))
cbBox = getattr(self, checkBox)
cbBox.setObjectName('userBox')
#checkBox = getattr(self, str(index.row() + index.column()))
#getattr(self,str(index.row() + index.column()))
#self.checkBox = QCheckBox('',self.parent())
cbBox.index = [index.row(), index.column()]
if str(data[index.column()]) == '0':
#button2.isEdit = False
cbBox.setChecked(False)
#self.parent().model.editableList.append(button2.index[0])
elif str(data[index.column()]) == '2':
#button2.isEdit = True
cbBox.setChecked(True)
#self.parent().model.editableList.append(button2.index[0])
# if self.sender.index[0] in self.parent().model.editableList:
# self.checkBox.setAttribute(Qt.WA_TransparentForMouseEvents, False);
# else:
# self.checkBox.setAttribute(Qt.WA_TransparentForMouseEvents);
cbBox.stateChanged.connect(lambda: self.checkChanged(cbBox, data))
for x in data[1:5]:
if x != '':
cbBox.setAttribute(Qt.WA_TransparentForMouseEvents)
break
h_box_layout = QHBoxLayout()
h_box_layout.addWidget(cbBox)
h_box_layout.setContentsMargins(0, 0, 0, 0)
h_box_layout.setAlignment(Qt.AlignCenter)
widget = QWidget()
widget.setLayout(h_box_layout)
widget.setObjectName('userCheckWidget')
self.parent().setIndexWidget(
index,
widget
)
# self.checkBox.setFocusPolicy(Qt.NoFocus);
# widget.setStyleSheet('''
# QWidget{background : #ffffff;
# margin-bottom:4px;
# margin-top:4px;}''')
def checkChanged(self, cbBoxs, data):
cbBoxs = cbBoxs
if str(cbBoxs.checkState()) == '2':
if cbBoxs.index[1] == 5:
data[5] = 2
elif cbBoxs.index[1] == 6:
data[6] = 2
elif cbBoxs.index[1] == 7:
data[7] = 2
elif cbBoxs.index[1] == 8:
data[8] = 2
elif str(cbBoxs.checkState()) == '0':
if cbBoxs.index[1] == 5:
data[5] = 0
elif cbBoxs.index[1] == 6:
data[6] = 0
elif cbBoxs.index[1] == 7:
data[7] = 0
elif cbBoxs.index[1] == 8:
data[8] = 0
'''
print(str(self.checkBox.checkState()))
print(self.checkBox.index[1])
if str(self.checkBox.checkState()) == '2':
if self.checkBox.index[1] == 5:
self.authority['工程管理权限'] = str(self.checkBox.checkState())
elif self.checkBox.index[1] == 6:
self.authority['变量强制权限'] = str(self.checkBox.checkState())
elif self.checkBox.index[1] == 7:
self.authority['用户管理权限'] = str(self.checkBox.checkState())
elif self.checkBox.index[1] == 8:
self.authority['趋势查看权限'] = str(self.checkBox.checkState())
elif str(self.checkBox.checkState()) == '0':
if self.checkBox.index[1] == 5:
self.authority['工程管理权限'] = str(self.checkBox.checkState())
elif self.checkBox.index[1] == 6:
self.authority['变量强制权限'] = str(self.checkBox.checkState())
elif self.checkBox.index[1] == 7:
self.authority['用户管理权限'] = str(self.checkBox.checkState())
elif self.checkBox.index[1] == 8:
self.authority['趋势查看权限'] = str(self.checkBox.checkState())
'''