Python 如何在PyQt5中复制和粘贴QTableWidget中的多个单元格?

Python 如何在PyQt5中复制和粘贴QTableWidget中的多个单元格?,python,pyqt,pyqt5,qt-designer,qtablewidget,Python,Pyqt,Pyqt5,Qt Designer,Qtablewidget,我有一个Qtablewidget,如下所示。我想从表中复制多个单元格,并粘贴到同一表的其他行中 到目前为止,我可以在单个细胞上做同样的事情,但是有没有一种方法可以同时做多个细胞 此外,如果可能,是否复制多行并将其粘贴到下表中 我试着在SO中寻找一些答案,但并没有在PyQt5中实现 提前谢谢 示例代码(由QtDesigner提供): 派生类: from PyQt5 import QtWidgets from demo import Ui_MainWindow class demo_code

我有一个Qtablewidget,如下所示。我想从表中复制多个单元格,并粘贴到同一表的其他行中

到目前为止,我可以在单个细胞上做同样的事情,但是有没有一种方法可以同时做多个细胞

此外,如果可能,是否复制多行并将其粘贴到下表中

我试着在SO中寻找一些答案,但并没有在PyQt5中实现

提前谢谢

示例代码(由QtDesigner提供):

派生类:

from PyQt5 import QtWidgets

from demo import Ui_MainWindow

class demo_code(QtWidgets.QMainWindow, Ui_MainWindow):                    
    def __init__(self):
        super(demo_code, self).__init__()
        self.setupUi(self) 



if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = demo_code()    
    window.show()
    sys.exit(app.exec_())

下面是一个将QTableWidget子类化的解决方案。您必须重新执行
按键事件
,以捕获复制和粘贴按键序列。复制时,使用
QTableWidget.selectedIndex()
保存当前选定的项目。粘贴时,为列表中的每个单元格设置一个新的QTableWidgetItem,将索引转换为新的高亮显示索引。它将粘贴所有高亮显示的单元格,它们不必在同一行中。它假定索引最小的单元格将被放置在粘贴时高亮显示的单元格中

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

class Table(QTableWidget):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setRowCount(10)
        self.setColumnCount(10)
        # etc.

    def keyPressEvent(self, event):
        super().keyPressEvent(event)
        if event.key() == Qt.Key_C and (event.modifiers() & Qt.ControlModifier):
            self.copied_cells = sorted(self.selectedIndexes())
        elif event.key() == Qt.Key_V and (event.modifiers() & Qt.ControlModifier):
            r = self.currentRow() - self.copied_cells[0].row()
            c = self.currentColumn() - self.copied_cells[0].column()
            for cell in self.copied_cells:
                self.setItem(cell.row() + r, cell.column() + c, QTableWidgetItem(cell.data()))

if __name__ == '__main__':
    app = QApplication(sys.argv)
    gui = Table()
    gui.show()
    sys.exit(app.exec_())

1) 你说我可以在单个单元格上做同样的事情,如果你能展示出来,那就好了。2)要添加的行总是最后一行吗?我认为默认情况下是单单元格复制粘贴。我将有一个空的表行。所以基本上不插入任何行,只需要将复制的数据粘贴到空单元格中。你说:我认为默认情况下是单单元格复制和粘贴,你检查过它是否有效吗?你应该更精确,而不是指向:如果你还没有,我可以在单个单元格上做同样的操作。是的,我刚刚检查了复制单个单元格并将其粘贴到其他单元格中,它可以工作!嗯,真奇怪,这个功能在默认情况下并不存在,您是否选择行,按Ctrl+C,然后按Ctrl+V粘贴它?我已经这样做了,但它不起作用。
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

class Table(QTableWidget):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setRowCount(10)
        self.setColumnCount(10)
        # etc.

    def keyPressEvent(self, event):
        super().keyPressEvent(event)
        if event.key() == Qt.Key_C and (event.modifiers() & Qt.ControlModifier):
            self.copied_cells = sorted(self.selectedIndexes())
        elif event.key() == Qt.Key_V and (event.modifiers() & Qt.ControlModifier):
            r = self.currentRow() - self.copied_cells[0].row()
            c = self.currentColumn() - self.copied_cells[0].column()
            for cell in self.copied_cells:
                self.setItem(cell.row() + r, cell.column() + c, QTableWidgetItem(cell.data()))

if __name__ == '__main__':
    app = QApplication(sys.argv)
    gui = Table()
    gui.show()
    sys.exit(app.exec_())