def setRowContents(self, row_list): self.module_data = row_list self.clear() self.setRowCount(0) header_labels = ['序号', '名称', '排序'] self.setColumnCount(len(header_labels)) self.setHorizontalHeaderLabels(header_labels) self.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) self.horizontalHeader().setSectionResizeMode(0, QHeaderView.ResizeToContents) current_row = 0 for row, module_item in enumerate(self.module_data): self.insertRow(current_row) table_item0 = QTableWidgetItem(str(current_row + 1)) table_item0.id = module_item['id'] table_item0.is_sub = False table_item0.setTextAlignment(Qt.AlignCenter) table_item0.setBackground(QBrush(QColor(218,233,231))) self.setItem(current_row, 0, table_item0) table_item1 = QTableWidgetItem(module_item['name']) table_item1.setTextAlignment(Qt.AlignCenter) table_item1.setBackground(QBrush(QColor(218,233,231))) self.setItem(current_row, 1, table_item1) table_item2 = QTableWidgetItem('↑') table_item2.setTextAlignment(Qt.AlignCenter) table_item2.setBackground(QBrush(QColor(218, 233, 231))) self.setItem(current_row, 2, table_item2) current_row += 1 for sub_module in module_item['subs']: self.insertRow(current_row) table_item0 = QTableWidgetItem(str(current_row + 1)) table_item0.setTextAlignment(Qt.AlignCenter) table_item0.id = sub_module['id'] table_item0.is_sub = True self.setItem(current_row, 0, table_item0) table_item1 = QTableWidgetItem(sub_module['name']) table_item1.setTextAlignment(Qt.AlignCenter) self.setItem(current_row, 1, table_item1) table_item2 = QTableWidgetItem('↑') table_item2.setTextAlignment(Qt.AlignCenter) self.setItem(current_row, 2, table_item2) current_row += 1
def mouse_clicked_cell(self, row, col): if col != 2 or row == 0: return current_is_sub = self.item(row, 0).is_sub current_id = self.item(row, 0).id print(current_is_sub, current_id) if current_is_sub: # 子项目移动 pre_item = self.item(row - 1, 0) if not pre_item.is_sub: # 上一项不是子项 return current_id = self.item(row, 0).id current_is_sub = self.item(row, 0).is_sub current_text = self.item(row, 1).text() print('请求交换的id:', (current_id, pre_item.id)) if not self.request_reverse_module_sort(current_id, pre_item.id): return # 上一项序号+1 pre_index = int(pre_item.text()) + 1 pre_item.setText(str(pre_index)) self.removeRow(row) self.insertRow(row - 1) table_item0 = QTableWidgetItem(str(row)) table_item0.setTextAlignment(Qt.AlignCenter) table_item0.id = current_id table_item0.is_sub = current_is_sub self.setItem(row - 1, 0, table_item0) table_item1 = QTableWidgetItem(current_text) table_item1.setTextAlignment(Qt.AlignCenter) self.setItem(row - 1, 1, table_item1) table_item2 = QTableWidgetItem('↑') table_item2.setTextAlignment(Qt.AlignCenter) self.setItem(row - 1, 2, table_item2) else: # 父项目移动 # 往上找,找到主级菜单 index_insert = row while index_insert > 0: pre_item = self.item(index_insert - 1, 0) index_insert -= 1 if not pre_item or not pre_item.is_sub: break print(index_insert) # 保存要移动的菜单 move_module = {'id': self.item(row, 0).id, 'is_sub': self.item(row, 0).is_sub, 'text': self.item(row, 1).text()} # 要删除的行 remove_row = [row] sub_modules = list() # 要移动的菜单列表 # 往下找,找到主级菜单 next_row = row + 1 next_item = self.item(next_row, 0) while next_item is not None: next_item = self.item(next_row, 0) if next_item is None or not next_item.is_sub: break sub_modules.append({ 'id': next_item.id, 'is_sub': next_item.is_sub, 'text': self.item(next_row, 1).text() }) remove_row.append(next_row) next_row += 1 if not next_item or not next_item.is_sub: break move_module['subs'] = sub_modules reverse_id = (self.item(index_insert, 0).id, self.item(row, 0).id) print('请求交换id的sort', reverse_id) if not self.request_reverse_module_sort(self.item(index_insert, 0).id, self.item(row, 0).id): return # 移除行 print(remove_row) for _ in remove_row: self.removeRow(remove_row[0]) # 只要移除一行,索引就变化,所以移除第一个索引值的即可 print(move_module) # 插入数据 self.insertRow(index_insert) table_item0 = QTableWidgetItem(str(index_insert + 1)) table_item0.id = move_module['id'] table_item0.is_sub = move_module['is_sub'] table_item0.setTextAlignment(Qt.AlignCenter) table_item0.setBackground(QBrush(QColor(218, 233, 231))) self.setItem(index_insert, 0, table_item0) table_item1 = QTableWidgetItem(move_module['text']) table_item1.setTextAlignment(Qt.AlignCenter) table_item1.setBackground(QBrush(QColor(218, 233, 231))) self.setItem(index_insert, 1, table_item1) table_item2 = QTableWidgetItem('↑') table_item2.setTextAlignment(Qt.AlignCenter) table_item2.setBackground(QBrush(QColor(218, 233, 231))) self.setItem(index_insert, 2, table_item2) index_insert += 1 for sub_module in move_module['subs']: self.insertRow(index_insert) table_item0 = QTableWidgetItem(str(index_insert + 1)) table_item0.setTextAlignment(Qt.AlignCenter) table_item0.id = sub_module['id'] table_item0.is_sub = sub_module['is_sub'] self.setItem(index_insert, 0, table_item0) table_item1 = QTableWidgetItem(sub_module['text']) table_item1.setTextAlignment(Qt.AlignCenter) self.setItem(index_insert, 1, table_item1) table_item2 = QTableWidgetItem('↑') table_item2.setTextAlignment(Qt.AlignCenter) self.setItem(index_insert, 2, table_item2) index_insert += 1 # 重新调整序号 for row in range(self.rowCount()): self.item(row, 0).setText(str(row + 1))