from PyQt5 import QtCore, QtWidgets from PyQt5.QtCore import QSize, Qt from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QSplitter, QPushButton from .ProjectTable import ProjectTableView from model.ProjectModel.ProjectManage import ProjectManage class ProjectWidgets(QtWidgets.QWidget): def __init__(self): super(ProjectWidgets, self).__init__() self.setAttribute(Qt.WA_StyledBackground, True) self.setupUi() def setupUi(self): self.createBtn = QPushButton(QIcon('./Static/add.png'), '新建工程') self.createBtn.setObjectName('createBtn') self.createBtn.setIconSize(QSize(22, 22)) self.createBtn.clicked.connect(self.createProject) self.importBtn = QPushButton(QIcon('./Static/import.png'), '导入工程') self.importBtn.setObjectName('importBtn') self.importBtn.setIconSize(QSize(22, 22)) self.importBtn.clicked.connect(self.importProject) self.exportBtn = QPushButton(QIcon('./Static/export.png'), '导出工程') self.exportBtn.setObjectName('exportBtn') self.exportBtn.setIconSize(QSize(22, 22)) self.exportBtn.clicked.connect(self.exportPorject) self.projectView = ProjectTableView() self.projectView.setObjectName('projectView') 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.horizontalHeader = self.projectView.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): stringActions = '|'.join([x.text() for x in getattr(self, '_' + str(self.logicalIndex) + 'Menu').actions() if x.isChecked()]) filterColumn = self.logicalIndex filterString = QtCore.QRegExp( stringActions, QtCore.Qt.CaseSensitive, ) 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)