Python 如何在PyQt5中复制和粘贴QTableWidget中的多个单元格?
我有一个Qtablewidget,如下所示。我想从表中复制多个单元格,并粘贴到同一表的其他行中 到目前为止,我可以在单个细胞上做同样的事情,但是有没有一种方法可以同时做多个细胞 此外,如果可能,是否复制多行并将其粘贴到下表中 我试着在SO中寻找一些答案,但并没有在PyQt5中实现 提前谢谢 示例代码(由QtDesigner提供): 派生类: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
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_())