import traceback from PyQt5 import QtWidgets from PyQt5.QtCore import Qt, QEvent from PyQt5.QtWidgets import QMenu, QApplication, QTableWidget, QTableWidgetItem, QTableView, QAbstractItemView from PyQt5.QtGui import QStandardItem, QCursor, QKeyEvent class MyTableWidget(QTableWidget): def __init__(self, *args): super(MyTableWidget, self).__init__(*args) self.setContextMenuPolicy(Qt.CustomContextMenu) self.customContextMenuRequested.connect(self.show_menu) self.contextMenu = QMenu(self) self.CP = self.contextMenu.addAction('复制') self.JQ = self.contextMenu.addAction('剪切') self.NT = self.contextMenu.addAction('粘贴') self.DEL = self.contextMenu.addAction('删除') self.CP.triggered.connect(self.copy) self.JQ.triggered.connect(self.cut) self.NT.triggered.connect(self.paste) self.DEL.triggered.connect(self.delete) self.copy_selected_indexes = None self.paste_selected_indexes = None self.copy_selected_ranges = None self.delete_selected_indexes = None def show_menu(self): ''' 右键显示菜单 :return: ''' self.contextMenu.exec_(QCursor.pos()) def del_tb_text(self): try: for index in self.delete_selected_indexes: row, col = index.row(), index.column() for c in range(self.columnCount()): item = QTableWidgetItem() self.setItem(row, c, item) except Exception as e: print(traceback.format_exc()) def paste_by_tup_index(self, tup_index, text=None): r, c = tup_index if not text: text = QApplication.clipboard().text() ls = text.split('\n') ls1 = [] for row in ls: ls1.append(row.split('\t')) rows = len(ls) cols = len(ls1[0]) for row in range(rows): for col in range(cols): item = QTableWidgetItem() item.setText(str(ls1[row][col])) self.setItem(row + r, col + c, item) def add_row_count(self, add_rows): self.setRowCount(self.rowCount() + add_rows) def paste_by_obj_index(self, obj_index, text=None): items = self.copy_selected_ranges # 获取被选取的表格对象 select_rows = items[0].rowCount() rows = self.rowCount() cols = self.columnCount() self.add_row_count(select_rows) # 增加列表行数 indexes_dict = self.obj_index_to_dict_index(obj_index) max_selected_row = max(indexes_dict.keys()) move_dict = {} for row in range(max_selected_row + 1, rows): move_dict[row] = [i for i in range(cols)] move_text = self.copy_text_by_dict_index(move_dict) # 被选取行之后的所有文本 move_index = (max_selected_row + 1 + select_rows, 0) # 被选取行之后的所有文本需要粘贴到的位置的第一个单元格索引 self.paste_by_tup_index(move_index, move_text) # 粘贴被选取行之后的所有文本 tup_index = (max_selected_row + 1, 0) self.paste_by_tup_index(tup_index, text) def paste_tb_text(self): try: indexes = self.selectedIndexes() self.paste_by_obj_index(indexes) except Exception as e: print(traceback.format_exc()) def copy_text_by_dict_index(self, indexes_dict): text = '' for row, cols in indexes_dict.items(): row_data_list = [] for col in cols: item = self.item(row, col) if item: data = item.text() else: data = '' row_data_list.append(data) row_data = '\t'.join(row_data_list) if text: text = text + '\n' + row_data else: text = row_data return text def copy_text_by_obj_index(self, indexes): indexes_dict = self.obj_index_to_dict_index(indexes) return self.copy_text_by_dict_index(indexes_dict) def obj_index_to_dict_index(self, obj_indexes): indexes_dict = {} for index in obj_indexes: row, col = index.row(), index.column() indexes_dict[row] = [i for i in range(self.columnCount())] return indexes_dict def selected_tb_text(self): try: self.copy_selected_indexes = self.selectedIndexes() self.copy_selected_ranges = self.selectedRanges() return self.copy_text_by_obj_index(self.copy_selected_indexes) except Exception as e: print(traceback.format_exc()) def copy(self): print('复制') text = self.selected_tb_text() print(text) if text: QApplication.clipboard().setText(text) def cut(self): print('剪切') self.copy() self.del_tb_text() def paste(self): print('粘贴') self.paste_tb_text() def delete(self): print('删除') self.delete_selected_indexes = self.selectedIndexes() delete_rows = self.selectedRanges()[0].rowCount() self.del_tb_text() self.setRowCount(self.rowCount() - delete_rows) def keyPressEvent(self, event: QKeyEvent) -> None: ''' 监听键盘事件 :param event: :return: ''' if (event.key() == Qt.Key_C) and QApplication.keyboardModifiers() == Qt.ControlModifier: self.copy() elif (event.key() == Qt.Key_X) and QApplication.keyboardModifiers() == Qt.ControlModifier: self.cut() elif (event.key() == Qt.Key_V) and QApplication.keyboardModifiers() == Qt.ControlModifier: self.paste() elif event.key() == Qt.Key_Backspace: self.delete() elif event.key() == Qt.Key_Delete: self.delete() else: super().keyPressEvent(event)
pyqt tablewidget
最新推荐文章于 2024-05-24 16:37:43 发布