PyQT5 實現快捷鍵複製表格資料

Bgods發表於2020-06-01

# -*- 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 協議》,轉載必須註明作者和本文連結

相關文章