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_())
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 4

你自己的站不错,pyqt5 也学得不错

3年前 评论

楼主 pyqt5有什么高质量的网站 或者项目么?

3年前 评论
Bgods (楼主) 3年前

楼主,遇到空的单元格就会出错,左边是wps剪切板的预览

file

3年前 评论
Bgods (楼主) 3年前
Bgods (楼主) 3年前
Firecelyyyy (作者) 3年前

请问一下,如果是 pandas 读取的 excel 表格怎么实现呢?我自己写了一个 pandasmodel 来将读取的 excel 显示在 tableview 里 要是再把复制功能写进去我就不知道该怎么写了。 ps:顺便问一下有谁知道为什么复制在这里的代码只显示一半呢?

from PyQt5.QtCore import QAbstractTableModel,Qt from PyQt5.QtGui import QStandardItem

TableView显示模块 class pandasModel(QAbstractTableModel):

def init(self, data): QAbstractTableModel.init(self) self.data = data

def rowCount(self, parent=None):
    return self.data.shape[0]

def columnCount(self, parnet=None):
    return self.data.shape[1]

def data(self, index, role=Qt.DisplayRole):
    if index.isValid():
        if role == Qt.DisplayRole:
            return str(self.data.iloc[index.row(), index.column()])
    return None

#设置标题
def headerData(self, col, orientation, role):
    if orientation == Qt.Horizontal and role == Qt.DisplayRole:
        return self.data.columns[col]
    return None
3年前 评论
Bgods (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!