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.
DCS/UI/ProjectManages/ProjectWidget.py

209 lines
8.6 KiB
Python

2 years ago
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QSize, Qt
from PyQt5.QtGui import QPixmap, QIcon
from PyQt5.QtWidgets import QSplitter, QPushButton
from utils import Globals
from .ProjectTable import ProjectTableView
from .ProjectModel import ProjectTableModel
from model.ProjectModel.ProjectManage import ProjectManage
2 years ago
from Static import static
2 years ago
class ProjectWidgets(QtWidgets.QWidget):
def __init__(self):
super(ProjectWidgets, self).__init__()
self.setAttribute(Qt.WA_StyledBackground, True)
self.setupUi()
def setupUi(self):
2 years ago
self.createBtn = QPushButton(QIcon(':/static/add.png'), '新建工程')
2 years ago
self.createBtn.setObjectName('createBtn')
self.createBtn.setIconSize(QSize(22, 22))
self.createBtn.clicked.connect(self.createProject)
2 years ago
self.importBtn = QPushButton(QIcon(':/static/import.png'), '导入工程')
2 years ago
self.importBtn.setObjectName('importBtn')
self.importBtn.setIconSize(QSize(22, 22))
self.importBtn.clicked.connect(self.importProject)
2 years ago
self.exportBtn = QPushButton(QIcon(':/static/export.png'), '导出工程')
2 years ago
self.exportBtn.setObjectName('exportBtn')
self.exportBtn.setIconSize(QSize(22, 22))
self.exportBtn.clicked.connect(self.exportPorject)
self.projectView = ProjectTableView()
self.projectView.setObjectName('projectView')
# [self.projectView.model.append_data(['1','测试','测试','测试','测试','测试','测试','测试','测试','测试']) for x in range(10)]
# self.model = VarTableModel(self.dic['header'], self.dic['data'])
# self.projectView.setModel(self.model)
self.gridLayout = QtWidgets.QGridLayout(self)
self.gridLayout.addWidget(self.createBtn, 0, 0, 1, 1)
self.gridLayout.addWidget(QSplitter(), 0, 1, 1, 20)
self.gridLayout.addWidget(self.importBtn, 0, 21, 1, 1)
self.gridLayout.addWidget(self.exportBtn, 0, 22, 1, 1)
self.gridLayout.addWidget(self.projectView, 1, 0, 10, 23)
self.gridLayout.setSpacing(10)
self.gridLayout.setContentsMargins(20, 30, 20, 20)
self.proxy = QtCore.QSortFilterProxyModel(self)
self.proxy.setSourceModel(self.projectView.model)
self.projectView.setModel(self.proxy)
self.projectView.proxy = self.proxy
self.projectView.model.initTable()
# self.comboBox.currentIndexChanged.connect(self.on_comboBox_currentIndexChanged)
self.horizontalHeader = self.projectView.horizontalHeader()
# print(self.horizontalHeader)
self.horizontalHeader.sectionClicked.connect(self.on_view_horizontalHeader_sectionClicked)
@QtCore.pyqtSlot(int)
def on_view_horizontalHeader_sectionClicked(self, logicalIndex):
self.logicalIndex = logicalIndex
self.on_comboBox_currentIndexChanged(self.logicalIndex)
menuName = '_' + str(logicalIndex) + 'Menu'
if not hasattr(self, menuName):
setattr(self, menuName, QtWidgets.QMenu(self))
self.menuValues = getattr(self, menuName)
menuEdit = QtWidgets.QLineEdit()
inputAction = QtWidgets.QWidgetAction(self.menuValues)
inputAction.setDefaultWidget(menuEdit)
self.menuValues.addAction(inputAction)
menuEdit.textChanged.connect(self.on_lineEdit_textChanged)
self.menuValues = getattr(self, menuName)
self.romoveAction(self.menuValues)
self.signalMapper = QtCore.QSignalMapper(self)
self.menuValues.mouseReleaseEvent = self._menu_mouseReleaseEvent
actionAll = QtWidgets.QAction("All", self)
actionAll.triggered.connect(self.on_actionAll_triggered)
actionAll.setProperty('canHide', True)
actionAll.setCheckable(True)
self.menuValues.addAction(actionAll)
self.menuValues.addSeparator()
valuesUnique = [self.proxy.data(self.proxy.index(row, self.logicalIndex))
for row in range(self.proxy.rowCount())
]
for actionNumber, actionName in enumerate(sorted(list(set(valuesUnique)))):
action = QtWidgets.QAction(str(actionName), self)
self.signalMapper.setMapping(action, actionNumber)
action.triggered.connect(self.signalMapper.map)
action.setCheckable(True)
self.menuValues.addAction(action)
self.signalMapper.mapped.connect(self.on_signalMapper_mapped)
headerPos =self.projectView.mapToGlobal(self.horizontalHeader.pos())
posY = headerPos.y() + self.horizontalHeader.height()
posX = headerPos.x() + self.horizontalHeader.sectionPosition(self.logicalIndex)
getattr(self, menuName).exec_(QtCore.QPoint(posX, posY))
@QtCore.pyqtSlot()
def on_actionAll_triggered(self):
# 显示全部
filterColumn = self.logicalIndex
filterString = QtCore.QRegExp( "",
QtCore.Qt.CaseInsensitive,
QtCore.QRegExp.RegExp
)
self.proxy.setFilterRegExp(filterString)
self.proxy.setFilterKeyColumn(filterColumn)
@QtCore.pyqtSlot(int)
def on_signalMapper_mapped(self, i):
# stringAction = self.signalMapper.mapping(i).text()
stringActions = '|'.join([x.text() for x in getattr(self, '_' + str(self.logicalIndex) + 'Menu').actions() if x.isChecked()])
filterColumn = self.logicalIndex
# print(stringActions)
filterString = QtCore.QRegExp( stringActions,
QtCore.Qt.CaseSensitive,
# QtCore.QRegExp.FixedString
)
self.proxy.setFilterRegExp(filterString)
self.proxy.setFilterKeyColumn(filterColumn)
@QtCore.pyqtSlot(str)
def on_lineEdit_textChanged(self, text):
# 搜索框文字变化函数
search = QtCore.QRegExp( text,
QtCore.Qt.CaseInsensitive,
QtCore.QRegExp.RegExp
)
self.proxy.setFilterRegExp(search)
@QtCore.pyqtSlot(int)
def on_comboBox_currentIndexChanged(self, index):
self.proxy.setFilterKeyColumn(index)
def _menu_mouseReleaseEvent(self, event):
action = self.menuValues.actionAt(event.pos())
if not action:
# 没有找到action就交给QMenu自己处理
return QtWidgets.QMenu.mouseReleaseEvent(self.menuValues, event)
if action.property('canHide'): # 如果有该属性则给菜单自己处理
return QtWidgets.QMenu.mouseReleaseEvent(self.menuValues, event)
# 找到了QAction则只触发Action
action.activate(action.Trigger)
def romoveAction(self, menu):
# 删除输入框之外的按钮1
for action in menu.actions():
if type(action) != QtWidgets.QWidgetAction:
menu.removeAction(action)
def _checkAction(self):
# 三个action都响应该函数
self.labelInfo.setText('\n'.join(['{}\t选中:{}'.format(
action.text(), action.isChecked()) for action in self.menuValues.actions()]))
def createProject(self):
self.projectView.model.append_data(['', '', '', '', '', ''])
def exportPorject(self):
checks = [i for i,x in enumerate(self.projectView.model.checkList) if x == 'Checked']
if not checks:
QtWidgets.QMessageBox.warning(self, "Warning", "请勾选想要导出的工程")
return
# 弹出一个导出zip文件的文件选择框
zipName, _ = QtWidgets.QFileDialog.getSaveFileName(self, "Export Project", "", "Project Files (*.project)")
if not zipName:
return
projects = [self.projectView.model.datas[i][1] for i in checks]
ProjectManage.exportProject(zipName, projects)
def importProject(self):
# 弹出一个导入zip文件的文件选择框
zipName, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Import Project", "", "Project Files (*.project)")
if not zipName:
return
repeatProject = ProjectManage.importProject(zipName)
if isinstance(repeatProject, set):
# repeatProject是集合
QtWidgets.QMessageBox.warning(self, "Warning", "{}工程名称重复".format(str(repeatProject)[1:-1]))
return
else:
# repeatProject不是集合
for name in repeatProject:
proMes = ProjectManage.getByName(name)
proMes.append('')
self.projectView.model.append_data(proMes)