如何实现类方法的多次重写



在下面的示例中,我想在两个不同的类中设置表视图的第一列和第二列的对齐。但它并没有像我想要的那样起作用。在我的示例中,只有第一列集合的对齐方式。

我之所以要这样做,是因为我想在一个基本的小部件类中进行一些基本设置,然后,如果需要,我想在子类小部件中进行添加设置。

import sys
from PyQt5.QtGui import QStandardItemModel
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QTableView, QApplication, QWidget, QVBoxLayout

class MyWidget(QWidget):
def __init__(self, parent=None):
super(MyWidget, self).__init__(parent)
model = FirstModel(4, 2)
model.setData(model.index(0, 0), "a", Qt.EditRole)
model.setData(model.index(0, 1), 2, Qt.EditRole)
model.setData(model.index(1, 0), "b", Qt.EditRole)
model.setData(model.index(1, 1), 4, Qt.EditRole)
model.setData(model.index(2, 0), "c", Qt.EditRole)
model.setData(model.index(2, 1), 6, Qt.EditRole)
model.setData(model.index(3, 0), "d", Qt.EditRole)
model.setData(model.index(3, 1), 8, Qt.EditRole)
tableview = QTableView()
tableview.setModel(model)
layout = QVBoxLayout()
layout.addWidget(tableview)
self.setLayout(layout)

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)

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)

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

在这个答案中,我将开始解释解决方案,从而理解OP错误。

解决方案:

在重写一个方法之前,必须了解该方法的作用。data()方法旨在返回与角色和QModelIndex相关的信息。

考虑到SecondModel中的上述内容,当角色为Qt.TextAlignmentRole且列为"1"时,必须返回Qt.AlignHCenter | Qt.AlignVCenter,在其他情况下,如果您希望表现得像父级(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的继承行为。

最新更新