PyQT5 实现快捷键复制表格数据


# -*- coding:utf-8 -*-

from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QStandardItemModel, QStandardItem
from PyQt5.QtCore import Qt
from PyQt5 import QtCore, QtWidgets


# 复制选择表格数据
def selected_tb_text(table_view):
    try:
        indexes = table_view.selectedIndexes()  # 获取表格对象中被选中的数据索引列表
        indexes_dict = {}
        for index in indexes:  # 遍历每个单元格
            row, column = index.row(), index.column()  # 获取单元格的行号,列号
            if row in indexes_dict.keys():
                indexes_dict[row].append(column)
            else:
                indexes_dict[row] = [column]

        # 将数据表数据用制表符(\t)和换行符(\n)连接,使其可以复制到excel文件中
        text = ''
        for row, columns in indexes_dict.items():
            row_data = ''
            for column in columns:
                data = table_view.model().item(row, column).text()
                if row_data:
                    row_data = row_data + '\t' + data
                else:
                    row_data = data

            if text:
                text = text + '\n' + row_data
            else:
                text = row_data
        return text
    except BaseException as e:
        print(e)
        return ''


class Ui_Form(object):  # UI类
    def setupUi(self, Form):
        Form.setObjectName("Form")
        self.tableView = QtWidgets.QTableView(Form)
        self.tableView.setEnabled(True)
        self.tableView.setGeometry(QtCore.QRect(5, 5, 400, 200))
        self.tableView.setObjectName("tableView")
        QtCore.QMetaObject.connectSlotsByName(Form)


# 逻辑类
class StartRun(QWidget, Ui_Form):
    def __init__(self):
        super().__init__()
        self.init_ui()  # 实例化窗体
        self.show()

    def init_ui(self):
        self.setupUi(self)  # 实例化控件
        self.update_table_view()

    def update_table_view(self):
        data = [
            (1, '张三', 18),
            (2, '李四', 29),
            (3, '王五', 25),
            (4, '赵六', 26),
        ]
        columns = ['id', 'name', 'age']
        model = QStandardItemModel(len(data), len(columns))  # 设置数据层次结构,rows行cols列
        model.setHorizontalHeaderLabels([str(i) for i in columns])  # 设置列名
        for row in range(len(data)):
            for column in range(len(data[row])):
                item = QStandardItem(str(data[row][column]))
                model.setItem(row, column, item)  # 设置每个位置的文本值
        self.tableView.setModel(model)  # 实例化表格视图,设置模型为自定义的模型

    def keyPressEvent(self, event):     # 重写键盘监听事件
        # 监听 CTRL+C 组合键,实现复制数据到粘贴板
        if (event.key() == Qt.Key_C) and QApplication.keyboardModifiers() == Qt.ControlModifier:
            text = selected_tb_text(self.tableView)  # 获取当前表格选中的数据
            if text:
                try:
                    clipboard = QApplication.clipboard()
                    clipboard.setText(text)  # 复制到粘贴板
                except BaseException as e:
                    print(e)


if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    S = StartRun()
    sys.exit(app.exec_())


评论

0 评论