Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何实现类方法的多次重写_Python_Pyqt_Pyqt5 - Fatal编程技术网

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

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

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

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

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

行为,非常感谢您的解释和解决方案。按要求工作