QTableWidget支持同时复制多个单元格内容

该代码实现了一个自定义的QTableWidget,增加了对多个单元格内容同时复制的功能。用户可以通过按下Ctrl+C快捷键来复制选中的多个单元格数据,并将内容粘贴到剪贴板。示例展示了如何设置支持多选以及如何处理键盘事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码示例

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

# ======================================================
# @File:  : multi_copy_table
# @Author : forward_huan
# @Date   : 2022/12/29 22:12
# @Desc   : 支持复制多个单元格内容的QTableWidget
# ======================================================
import sys

from PyQt5 import QtGui
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QTableWidget, QApplication, QTableWidgetItem


class TableWidget(QTableWidget):
    def __init__(self, *args, **kwargs):
        super(TableWidget, self).__init__(*args, **kwargs)
        self.is_multi_copy = False

    @staticmethod
    def is_ctrl_c_pressed(event: QtGui.QKeyEvent):
        """
        Ctrl + C是否同时按下

        :param event:
        :return:
        """
        return event.key() == Qt.Key_C and (event.modifiers() & Qt.ControlModifier)

    def set_support_multi_copy(self, is_support: bool):
        """
        设置是否同时支持复制多个单元格

        :param is_support:
        :return:
        """
        self.is_multi_copy = is_support

    def copu_multi(self):
        """
        复制多个选中单元格的内容到剪切板

        :return:
        """
        items = self.selectedItems()
        if not items:
            return
        select_data = [[item.row(), item.column(), item.text()] for item in items]
        row_data = [item[0] for item in select_data]
        col_data = [item[1] for item in select_data]
        row_min, row_max = min(row_data), max(row_data)
        col_min, col_max = min(col_data), max(col_data)
        data = [[""] * (col_max - col_min + 1) for _ in range(row_max - row_min + 1)]
        for item in select_data:
            row, col, text = item
            data[row - row_min][col - col_min] = text
        QApplication.clipboard().setText("\n".join(["\t".join(item) for item in data]))

    def keyPressEvent(self, event: QtGui.QKeyEvent) -> None:
        if self.is_multi_copy and self.is_ctrl_c_pressed(event):
            self.copu_multi()
            return
        super(TableWidget, self).keyPressEvent(event)


def run():
    app = QApplication(sys.argv)
    table_widget = TableWidget()
    table_widget.set_support_multi_copy(True)
    table_widget.resize(800, 600)
    table_widget.setRowCount(6)
    table_widget.setColumnCount(4)

    table_widget.setHorizontalHeaderLabels([f"第{i}列" for i in range(table_widget.columnCount())])
    table_widget.setVerticalHeaderLabels([f"第{i}行" for i in range(table_widget.rowCount())])
    for row in range(table_widget.rowCount()):
        for col in range(table_widget.columnCount()):
            table_widget.setItem(row, col, QTableWidgetItem(f"test_{row}_{col}"))
    table_widget.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    run()

运行效果

在这里插入图片描述

在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值