В этом ответе я начну объяснять решение и, таким образом, пойму ошибку OP.
Решение:
Перед переопределением метода необходимо понять, что делает этот метод. Метод data()
предназначен для возврата информации, связанной с ролью и QModelIndex.
Учитывая вышеизложенное в SecondModel, вы должны вернуть Qt.AlignHCenter | Qt.AlignVCenter
, когда роль равна Qt.TextAlignmentRole
, а столбец равен "1", в других случаях вы хотите вести себя как родитель (QStandardItemModel), тогда вы должны использовать super()
:
class SecondModel(QStandardItemModel):
def data(self, index, role=Qt.DisplayRole):
if role == Qt.TextAlignmentRole:
if index.column() == 1:
return Qt.AlignHCenter | Qt.AlignVCenter
return super().data(index, role)
То же самое должно быть сделано с FirstModel:
class FirstModel(SecondModel):
def data(self, index, role=Qt.DisplayRole):
if role == Qt.TextAlignmentRole:
if index.column() == 0:
return Qt.AlignHCenter | Qt.AlignVCenter
return super().data(index, role)
Объяснение ошибки OP:
class SecondModel(QStandardItemModel):
def data(self, index, role=Qt.DisplayRole):
super().data(index, role)
# set Alignment for column 1
if role == Qt.TextAlignmentRole:
if index.column() == 1:
return Qt.AlignHCenter | Qt.AlignVCenter
return QStandardItemModel.data(self, index, role)
В этом коде он эквивалентен моему по функциональности, но содержит ненужный код, поскольку super().data(index, role)
только возвращает что-то, но OP не использует результат. Также в этом случае super().data(index, role)
совпадает с QStandardItemModel.data(self, index, role)
.
class FirstModel(SecondModel):
def data(self, index, role=Qt.DisplayRole):
super().data(index, role)
# set Alignment for column 0
if role == Qt.TextAlignmentRole:
if index.column() == 0:
return Qt.AlignHCenter | Qt.AlignVCenter
return QStandardItemModel.data(self, index, role)
В этом случае super().data(index, role)
не равно QStandardItemModel.data(self, index, role)
, поскольку родительский элемент FirstModel
не QStandardItemModel
, а SecondModel
. Поэтому, не вызывая метод SecondModel
, вы удаляете унаследованное поведение SecondModel
.