Pyside6:从 QTableWidget 复制粘贴、删除、撤消多个单元格

2024-01-28

我希望能够使用 control-C control-V 在 Pyside6 表 (QTableWidget) 之间进行复制和粘贴,主要是在 Excel 之间进行复制和粘贴。 我找到了 @Momo 2023 年 1 月的帖子。1 https://stackoverflow.com/questions/75095259/pyqt5-copy-paste-from-a-qtablewidget-with-contextmenu-and-with-keyboardpress这似乎对我不起作用,可能是因为我正在使用 Pyside6 而不是 PyQt5。 有什么解决方案吗?


我自己的问题的答案: 我更改了 Momo 的代码以使其适合我,并且添加了删除多个单元格以及通过粘贴或删除撤消错误的可能性。撤消操作仅在光标所在的表格内进行。

有没有更好的方法可以做到这一点,或者您可以提供改进建议吗?

import PySide6.QtWidgets as QtWidgets
from PySide6 import QtCore, QtGui
from PySide6.QtGui import QGuiApplication


class CopyPasteDelTableWidget(QtWidgets.QTableWidget):
    def __init__(self, n_rows, n_columns):
        super().__init__(n_rows, n_columns)
        self.forundo = []
        self.setSelectionMode(QtWidgets.QAbstractItemView.ContiguousSelection)
        self.installEventFilter(self)


    def eventFilter(self, source, event):
        if event.type() == QtCore.QEvent.KeyPress:
            if event == QtGui.QKeySequence.Copy:
                self.copySelection()
                return True
            elif event == QtGui.QKeySequence.Paste:
                self.pasteSelection()
                return True
            elif event == QtGui.QKeySequence.Delete:
                self.deleteSelection()
                return True
            elif event == QtGui.QKeySequence.Cut:
                self.copySelection()
                self.deleteSelection()
                return True
            elif event == QtGui.QKeySequence.Undo:
                self.undoSelection()
                return True
        return super(QTableWidget, self).eventFilter(source, event)


    def deleteSelection(self):
        self.forundo.append([self.selectedRanges()[0].topRow(), self.selectedRanges()[0].leftColumn(), []])
        for i_row in range(self.selectedRanges()[0].topRow(), self.selectedRanges()[0].bottomRow() + 1):
            undorow = []
            for i_col in range(self.selectedRanges()[0].leftColumn(), self.selectedRanges()[0].rightColumn() + 1):
                undorow.append(self.item(i_row, i_col).text())
                self.setItem(i_row, i_col, QtWidgets.QTableWidgetItem(''))
            self.forundo[-1][2].append(undorow)


    def copySelection(self):
        copied = ''
        for row in range(self.selectedRanges()[0].topRow(), self.selectedRanges()[0].bottomRow() + 1):
            for col in range(self.selectedRanges()[0].leftColumn(), self.selectedRanges()[0].rightColumn() + 1):
                copied += self.item(row, col).text() + '\t'
            copied = copied[:-1] + '\n'
        QGuiApplication.clipboard().setText(copied)


    def pasteSelection(self):
        if not QGuiApplication.clipboard():
            return
        copied = QGuiApplication.clipboard().text().split('\n')
        self.forundo.append([self.selectedRanges()[0].topRow(), self.selectedRanges()[0].leftColumn(), []])
        if copied[-1] == '':
            copied = copied[:-1]
        for i_line, line in enumerate(copied):
            copied[i_line] = line.split('\t')
        for i_row, row in enumerate(copied):
            undorow = []
            k_row = i_row + self.selectedRanges()[0].topRow()
            if k_row < self.rowCount():
                for i_col, col in enumerate(row):
                    k_col = i_col + self.selectedRanges()[0].leftColumn()
                    if k_col < self.columnCount():
                        undorow.append(self.item(k_row, k_col).text())
                        self.setItem(k_row, k_col, QtWidgets.QTableWidgetItem(col))
            self.forundo[-1][2].append(undorow)


    def undoSelection(self):
        if len(self.forundo) > 0:
            prevundo = self.forundo.pop()
            self.setCurrentCell(prevundo[0], prevundo[1])
            for i_row, row in enumerate(prevundo[2]):
                for i_col, col in enumerate(row):
                    self.setItem(i_row + prevundo[0], i_col + prevundo[1], QtWidgets.QTableWidgetItem(col))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pyside6:从 QTableWidget 复制粘贴、删除、撤消多个单元格 的相关文章

  • 通过链接将一张纸上的列转置为另一张纸上的行

    我在工作表 A 中的 A1 A10 中有一列数据 在工作表 B 中 我有 A1 J1 中的数据范围 我需要将工作表 A 中的列中的数据转置到工作表 B 中的数据范围 我可以 选择性粘贴 并粘贴值 但我需要工作表 A 中的信息自动更新工作表
  • 如何通过单击一次在 jsFiddle 上的 jQuery 中获得简单的 ZeroClipboard 复制到剪贴板设置?

    我正在努力让 ZeroClipboard 在 jQuery 上下文中工作 我所追求的基本用法是剪切每个的文本div与班级copy单击时 以下 jsFiddle 使用稳定的 ZeroClipboard v1 3 3 进行双击工作 http j
  • QTableWidget 与 QTableView

    我是 Qt 模型 视图框架的新手 在我的应用程序中 我想要有 1000 X 1000 个单元格 应该有最低的内存要求并且应该很快 我不知道这个模型术语的用途是什么 但我有自己的类 它知道如何处理表中存储的双变量 目前我正在使用带有验证器的
  • 排序后 QTableWidget 的填充不完整

    我有一个 QTableWidget 它将填充一些随机值 该表已启用排序 tableWidget setSortingEnabled True 排序工作正常 我知道 在这个最小的例子中 它将是按字母数字排序的数字 但是 当我按一列对表格进行排
  • 检测复制或相似的文本块

    我有很多关于 Markdown 格式编程的文本 有一个构建过程能够将这些文本转换为 Word HTML 并执行简单的验证规则 例如拼写检查或检查文档是否具有所需的标题结构 我想扩展该构建代码以检查所有文本中的复制粘贴或类似块 是否有任何现有
  • Android 从剪贴板管理器复制/粘贴

    是否可以发送过去的命令 以便将文本粘贴到当前聚焦的编辑文本中 设想 后台服务监听通知 完成 收到通知后 需要将文本复制到剪贴板 完成 将文本粘贴到任何当前聚焦的字段 如果不可能 则放弃粘贴命令 我知道如何复制文本ClipboardManag
  • 在 C# vsto Excel 中选择性粘贴

    我正在开发 C vsto Excel 应用程序 每当用户从另一个 Excel 工作表将某些内容粘贴到 Excel 模板中时 它还会将单元格格式与单元格数据一起粘贴到 Excel 模板中 我想避免这种情况 所以我用谷歌搜索 发现了术语 特殊粘
  • 如何从 QTableWidget 中删除所有行

    我正在尝试删除 a 中的所有行QTableWidget http doc qt io qt 4 8 qtablewidget html 这是我尝试过的 for int i 0 i lt mTestTable gt rowCount i mT
  • Visual Studio 使用标准格式复制/粘贴到 Outlook 中?

    我在 Visual Studio 中有包含深色背景的自定义设置 复制 粘贴到 Outlook 会对邮件的白色背景上的代码中的深色背景产生视觉犯罪 有谁知道如何以标准和格式粘贴代码 不是特殊粘贴中的未格式化文本 也不使用我的自定义 VS 格式
  • 在 UIPasteBoard 中复制 NSAttributedString

    如何在粘贴板中复制 NSAttributedString 允许用户粘贴或以编程方式粘贴 使用 void paste id sender 来自 UIResponderStandardEditActions 协议 I tried UIPaste
  • Python PyQt - QTableWidget、JSON 和 emitSignal 导致空白单元格

    我将 PyQt 用于一个简单的应用程序 该应用程序从包含 JSON 格式字符串的日志文件中读取数据 并将它们很好地输出到表中 一切都按预期工作 除非我尝试从 加载 函数发出信号 该信号由主窗口拾取 位于一个设计为用新信息重新排列表的槽中 如
  • 单元格pyqt中的小部件对齐

    我正在 PyQT4 和 Python 2 7 中开发一些工具 但遇到了一个小问题 我有 3 个按钮存储在小部件中 该小部件位于表格 QTableWidget 的单元格中 所以我的问题是我无法将小部件与单元格顶部对齐 并且工具无法将行高调整为
  • 如何在 QTableWidget 中将列中的所有项目对齐到中心

    我正在使用 PyQt5 并使用 PyCharm 如何将一列下的所有单元格居中对齐 下面的代码似乎有效 但仅适用于一个单元格 即标题 我应该更改或添加什么 item3 QtWidgets QTableWidgetItem Item Name
  • 在 iPhone 上复制并粘贴多种数据表示形式

    当我尝试将多个数据表示放到 iPhone 3 0 的粘贴板上时 遇到了一些问题 我想做的是将数据表示形式和字符串表示形式放到粘贴板上 数据是我自己的数据类型 我用它来复制和粘贴到我的应用程序中 字符串表示形式是一种将应用程序的内容作为大纲复
  • 在 Windows 系统上移动文件的最快方法 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想要将大约 800GB 的数据从 NTFS 存储设备移动到 FAT32 设备 两者都是外部硬盘驱动器 在 Windows 系统上 实现这
  • 如何在 OpenOffice BASIC 宏中通过鼠标单击获取文档坐标

    背景 我想在我用鼠标单击或悬停的位置 使用按键激活时 粘贴 如 CTRL V 任何内容 最好是图像 形状 我不知道该怎么做获取我单击的文档 X Y 上的位置 Apache OpenOffice SDraw Document OpenOffi
  • iOS 复制和粘贴

    我正在创建一个应用程序 以便在我在 iOS 设备上复制某些内容时保存我复制的项目 无论如何 我是否可以创建一个事件 以便每当我从 iOS 设备上的任何应用程序复制某些内容时 它都会将其保存到我的应用程序中 我希望它在我复制文本时触发 以便将
  • 复制粘贴编码是否可以接受?

    人们普遍认为复制和粘贴编程是一个坏主意 但是处理两个函数或代码块确实需要的情况的最佳方法是什么 do只需要在几个方面有所不同就会使概括它们变得极其混乱 如果除了一些细微的变化之外 代码基本上是相同的 但这些细微的变化并不容易通过添加参数 模
  • QT从QTableWidgetItem继承到Widget并覆盖'<'运算符

    我想要一个QTableWidget具有定制的某些单元QProgressBars 并且我希望能够对包含这些的列进行排序 我的定制QProgressBar继承自两者QProgressBar and QTableWidgetItem 并且我正在覆
  • QDataWidgetMapper;将 TableWidget 映射到模型

    我没有找到任何文档显示 QDataWidgetMapper 实际上适用于哪些小部件 也没有找到任何使用 QTableWidget 进行映射的实现 它绝对适用于 QLineEdit 和 QComboBoxes 它们是输入小部件 但是是否可以映

随机推荐