lea*_*ode 3 python copy-paste qtableview pyqt4 qabstractitemview
我们可以使用 QTableView 从 QTableView 中选择多个项目(部分行和部分列)self.tableView.setSelectionMode(QAbstractItemView.ExtendedSelection),但是在选择一些行和列(部分和部分)后,如果我CTRL+C并将其粘贴到记事本中,它只会粘贴一项(来自 tableView 的一个值)?
我的代码:
tab_table_view = QtGui.QWidget()
self.Tab.insertTab(0, tab_table_view, self.File_Name)
self.tableView = QtGui.QTableView(tab_table_view)
self.tableView.setGeometry(QtCore.QRect(0, 0, 721, 571))
self.model = QtGui.QStandardItemModel(self)
self.model.setSortRole(QtCore.Qt.UserRole)
self.tableView.setModel(self.model)
self.tableView.setSelectionMode(QAbstractItemView.ExtendedSelection) '''this helps for selecting multiple items but not able to copy and paste multiple values to a text/ excel (it only copies single value)'''
Run Code Online (Sandbox Code Playgroud)
我们如何复制和粘贴多个项目?
self.tableView.installEventFilters(self)
Run Code Online (Sandbox Code Playgroud)
现在,添加事件过滤器:
def eventFilter(self, source, event):
if (event.type() == QtCore.QEvent.KeyPress and
event.matches(QtGui.QKeySequence.Copy)):
self.copySelection()
return True
return super(Window, self).eventFilter(source, event)
Run Code Online (Sandbox Code Playgroud)
复印功能:
def copySelection(self):
selection = self.tableView.selectedIndexes()
if selection:
rows = sorted(index.row() for index in selection)
columns = sorted(index.column() for index in selection)
rowcount = rows[-1] - rows[0] + 1
colcount = columns[-1] - columns[0] + 1
table = [[''] * colcount for _ in range(rowcount)]
for index in selection:
row = index.row() - rows[0]
column = index.column() - columns[0]
table[row][column] = index.data()
stream = io.StringIO()
csv.writer(stream).writerows(table)
QtGui.qApp.clipboard().setText(stream.getvalue())
Run Code Online (Sandbox Code Playgroud)
小智 6
非常感谢上面的@learncode 评论,我设法获得了复制部分。Moverover,我修改了一下以支持复制到具有相应单元格顺序的 Excel:
def copySelection(self):
selection = self.selectedIndexes()
if selection:
rows = sorted(index.row() for index in selection)
columns = sorted(index.column() for index in selection)
rowcount = rows[-1] - rows[0] + 1
colcount = columns[-1] - columns[0] + 1
table = [[''] * colcount for _ in range(rowcount)]
for index in selection:
row = index.row() - rows[0]
column = index.column() - columns[0]
table[row][column] = index.data()
stream = io.StringIO()
csv.writer(stream, delimiter='\t').writerows(table)
QtWidgets.qApp.clipboard().setText(stream.getvalue())
return
Run Code Online (Sandbox Code Playgroud)
除了复制,我还创建了粘贴部分。根据用户选择的单元格范围(一个单元格或单元格范围),此代码段支持粘贴不同形状的数据。
def pasteSelection(self):
selection = self.selectedIndexes()
if selection:
model = self.model()
buffer = QtWidgets.qApp.clipboard().text()
rows = sorted(index.row() for index in selection)
columns = sorted(index.column() for index in selection)
reader = csv.reader(io.StringIO(buffer), delimiter='\t')
if len(rows) == 1 and len(columns) == 1:
for i, line in enumerate(reader):
for j, cell in enumerate(line):
model.setData(model.index(rows[0]+i,columns[0]+j), cell)
else:
arr = [ [ cell for cell in row ] for row in reader]
for index in selection:
row = index.row() - rows[0]
column = index.column() - columns[0]
model.setData(model.index(index.row(), index.column()), arr[row][column])
return
Run Code Online (Sandbox Code Playgroud)