Я изучаю QAbstractTabelModel с QTabelView. Я был в состоянии использовать флаги и setData, чтобы сделать элементы редактируемыми. Тем не менее, я понятия не имею, как сделать столбцы редактируемыми. Другими словами, я хочу изменить имена столбцов, дважды щелкнув мышью и присвоив новое имя. Если это возможно, можете ли вы привести несколько примеров + комментарии к коду? Здесь у меня есть простое приложение, использующее QTabelView, которое отображает некоторые данные с использованием модели.
Буду признателен за любое предложение
import sys
from PyQt5 import QtWidgets, QtCore, QtGui
class MyTableModel(QtCore.QAbstractTableModel):
def __init__(self, data=[[]], headers=[], parent=None):
QtCore.QAbstractTableModel.__init__(self, parent)
self.__data = data
self.__headers = headers
# Headers
def headerData(self, section, orientation, role):
if role == QtCore.Qt.DisplayRole:
if orientation == QtCore.Qt.Horizontal:
if section < len(self.__headers):
return self.__headers[section]
else:
return "Temporary"
else:
return section + 1
def rowCount(self, parent):
return len(self.__data)
def columnCount(self, parent):
return len(self.__data[0])
def data(self, index, role):
if role == QtCore.Qt.EditRole:
row = index.row()
column = index.column()
return self.__data[row][column]
# Displaying data
if role == QtCore.Qt.DisplayRole:
row = index.row()
column = index.column()
value = self.__data[row][column]
return value
def flags(self, index):
return QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled
# Making cells editable==================================
def setData(self, index, value, role=QtCore.Qt.EditRole):
if role == QtCore.Qt.EditRole:
row = index.row()
column = index.column()
new_element = value
if new_element:
self.__data[row][column] = new_element
return True
else:
return False
# =============================================================================#
# INSERTING & REMOVING ITEMS
def insertRows(self, position, rows, parent=QtCore.QModelIndex()):
self.beginInsertRows(parent, position, position + rows - 1)
for i in range(rows):
defaultValues = [i for i in range(1, 4)]
self.__data.insert(position, defaultValues)
self.endInsertRows()
return True
def removeRows(self, position, rows, parent=QtCore.QModelIndex()):
self.beginRemoveRows(parent, position, position + rows - 1) # Старт процесс удаления
# Removing here
for i in range(rows):
value = self.__data[position]
self.__data.remove(value)
self.endRemoveRows()
return True
def insertColumns(self, position, columns, parent=QtCore.QModelIndex()):
self.beginInsertColumns(parent, position, position + columns - 1)
"""self.beginInsertColumns(index, first, last)"""
# index - parent
# first - position
# last - position + columns - 1 = view ожидает 0 образный элемент
rowCount = len(self.__data)
for i in range(columns):
for j in range(rowCount): # Преребираем Строки
self.__data[j].insert(position, "new cell")
self.endInsertColumns()
return True
# removing columns from view ================================================================
def removeColumns(self, position, columns, parent=QtCore.QModelIndex()):
self.beginRemoveColumns(parent, position, position + columns - 1) # Старт процесс удаления
# Removing here
rowCount = len(self.__data)
for i in range(columns):
for j in range(rowCount):
print(self.__data[j])
value = self.__data[j][position]
self.__data[j].remove(value)
self.endRemoveColumns()
return True
# My Window -----------------------------------------------------------------------------------
class MyWindow(QtWidgets.QWidget):
def __init__(self):
super().__init__()
data = [
["value", "value", "value"],
["value", "value", "value"]
]
headers = ["col1", "col2", "col3", ]
self.TableView = QtWidgets.QTableView()
self.TableView.show()
self.model = MyTableModel(data, headers)
#inserting rows
#self.model.insertRows(0, 1)
# self.model.removeRows(0, 1)
#self.model.insertColumns(0, 1)
#self.model.removeColumns(0, 1)
self.TableView.setModel(self.model)
app = QtWidgets.QApplication(sys.argv)
win = MyWindow()
sys.exit(app.exec_())