pyqt tablewidget

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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值