Python 如何实现类方法的多次重写
在下面的示例中,我想在两个不同的类中为tableview的第一列和第二列设置alignmet。但它并没有像我想要的那样工作。 在我的示例中,只有第一列集合的对齐方式 我想这样做的原因是,因为我想在基本小部件类中进行一些基本设置,然后,如果需要,我想在子类小部件中进行添加设置Python 如何实现类方法的多次重写,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,在下面的示例中,我想在两个不同的类中为tableview的第一列和第二列设置alignmet。但它并没有像我想要的那样工作。 在我的示例中,只有第一列集合的对齐方式 我想这样做的原因是,因为我想在基本小部件类中进行一些基本设置,然后,如果需要,我想在子类小部件中进行添加设置 import sys from PyQt5.QtGui import QStandardItemModel from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QT
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()
:
第二类模型(QStandardItemModel):
def数据(self,index,role=Qt.DisplayRole):
如果角色==Qt.TextAlignmentRole:
如果index.column()==1:
返回Qt.AlignHCenter | Qt.AlignVCenter
返回super().数据(索引、角色)
FirstModel也应该这样做:
第一类模型(第二类模型):
def数据(self,index,role=Qt.DisplayRole):
如果角色==Qt.TextAlignmentRole:
如果index.column()==0:
返回Qt.AlignHCenter | Qt.AlignVCenter
返回super().数据(索引、角色)
操作错误解释:
第二类模型(QStandardItemModel):
def数据(self,index,role=Qt.DisplayRole):
super().数据(索引、角色)
#设置列1的对齐方式
如果角色==Qt.TextAlignmentRole:
如果index.column()==1:
返回Qt.AlignHCenter | Qt.AlignVCenter
返回QStandardItemModel.data(self、index、role)
在这段代码中,它的功能相当于我的,但它有一个不必要的代码,因为super()。数据(索引,角色)
只返回一些东西,而OP不使用结果。同样在本例中,super().data(index,role)
与QStandardItemModel.data(self,index,role)
相同
第一类模型(第二类模型):
def数据(self,index,role=Qt.DisplayRole):
super().数据(索引、角色)
#设置列0的对齐方式
如果角色==Qt.TextAlignmentRole:
如果index.column()==0:
返回Qt.AlignHCenter | Qt.AlignVCenter
返回QStandardItemModel.data(self、index、role)
在这种情况下,
super().data(index,role)
不等于QStandardItemModel.data(self,index,role)
,因为FirstModel
的父项不是QStandardItemModel
,而是SecondModel
。因此,通过不调用SecondModel
方法,您正在删除继承的SecondModel
行为,非常感谢您的解释和解决方案。按要求工作